SML 运算符和操作数不一致

SML operator and operand do not agree

我正在尝试用 sml 编写我的第一个函数。它需要一个元组和 returns 第一个元素的总和乘以 10,第二个元素乘以 6 和第三个,然后除以 10。我不知道我在这里做错了什么我得到了这个错误运算符和操作数不同意 [tycon mismatch].

fun rgb2gray(rgb: (int*int*int))=
let
    val x = (#1rgb * 3 )+ (#2rgb * 6 )+ (#3rgb)
in  
    x=x/10
end

x=x/10 是相等比较(只有当 x 为零时才为真),/ 用于除以 real,而不是整数。
+-* 被重载,但 / 不是。)

整数除法调用div,因为函数的值应该是x div 10,所以只需要写x div 10,不用写=

在解构结构时使用模式匹配比选择器更常见,我会这样写你的函数:

fun rgb2gray (r, g, b) = (r * 3 + g * 6 + b) div 10

由于 molbdnilo 已经提供了答案,这里有一个替代方法,您可以使用 records:

type rgb = { r : int, g : int, b : int }

fun rgb2gray (color : rgb) : int =
    (#r color * 3 +
     #g color * 6 +
     #b color) div 10

或等效地通过对记录进行模式匹配:

fun rgb2gray ({ r = r, g = g, b = b } : rgb) : int =
    (r * 3 + g * 6 + b) div 10

记录就像元组,但它们的部分是命名的而不是编号的(因此 #r 而不是 #1)。语法有点复杂,但好处是您不会不小心将两种颜色轻易地混在一起。也许对于 RGB 值来说,无论如何都很难将它们混合起来,因为 R、G 和 B 的概念在这个确切的顺序中已经根深蒂固在很多程序员中。不过,这是另一种选择。

既然其他人已经帮助你解决了问题,我想我会指出,结束后你需要一个;在它之后,因为函数完成了。