【问题标题】:SML operator and operand do not agreeSML 运算符和操作数不一致
【发布时间】:2020-05-19 08:40:44
【问题描述】:

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

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

【问题讨论】:

    标签: sml


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      由于 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 的确切顺序的概念在许多程序员中已经根深蒂固。不过,这是另一种选择。

      【讨论】:

        【解决方案3】:

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

        整数除法叫div,由于函数的值应该是x div 10,所以只需要写x div 10,不用=

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-04-28
          • 2018-02-11
          • 1970-01-01
          • 2017-06-28
          • 1970-01-01
          • 2021-05-17
          • 2023-03-15
          • 1970-01-01
          相关资源
          最近更新 更多