SML运算符和操作数不一致

SML运算符和操作数不一致,sml,Sml,我正在尝试用sml编写我的第一个函数。它获取一个元组并返回第一个元素乘以10、第二个元素乘以6和第三个元素的和,然后除以10。我不知道我做错了什么,我得到了这个错误运算符和操作数不一致[tycon失配] fun rgb2gray(rgb: (int*int*int))= let val x = (#1rgb * 3 )+ (#2rgb * 6 )+ (#3rgb) in x=x/10 end x=x/10是一个相等比较(并且只有当x为零时才为真),而/用于除以实数s,而不是

我正在尝试用sml编写我的第一个函数。它获取一个元组并返回第一个元素乘以10、第二个元素乘以6和第三个元素的和,然后除以10。我不知道我做错了什么,我得到了这个错误运算符和操作数不一致[tycon失配]

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

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

整数除法称为
div
,由于函数的值应为
x div 10
,因此只需写入
x div 10
,而不必写入任何
=

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

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

由于molbdnilo已经提供了答案,这里有一种替代方法,您可以使用记录来完成此操作:

或通过记录上的模式匹配进行等效:

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

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

因为似乎其他人已经帮助你解决了这个问题,我想我会指出,在结束后,你需要一个;之后,因为该功能已完成

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