【问题标题】:operator and operand do not agree [tycon mismatch]运算符和操作数不一致 [tycon mismatch]
【发布时间】:2021-05-17 13:22:51
【问题描述】:

我正在尝试在 sml 中编写一个函数,该函数接受一个对列表并返回所有元素的两个列表的对 意思是如果输入是 [(1, 2.0), (2, 3.0)] 输出应该是 ([1, 2], (2.0, 3.0))

fun divide nil = (nil , nil)
| divide [(a, b)::nil] = ([a], [b])
| divide [(a, b)::myTl] =
    let
      val (x, y) = divide myTl
      
    in
      (a::x, b::y)
    end

;

sml 解释器返回的错误越少

Error: operator and operand do not agree [tycon mismatch]
operator domain: ('Z * 'Y) list list
operand:         ('Z * 'Y) list
in expression:
divide myTl

【问题讨论】:

    标签: sml smlnj


    【解决方案1】:

    您看到的错误消息是由于您的输入模式(无意中)声明了一个域为 ('a * 'b) list list 的函数,因此您的递归调用没有正确键入。

    最直接的解决方法是纠正在函数参数周围错误使用[ ] --- 这是制作一个单例列表,而不是仅仅对模式进行分组。因此,您应该改用( )

    fun divide nil = (nil , nil)
      | divide ((a, b)::nil) = ([a], [b])
      | divide ((a, b)::myTl) =
        let
          val (x, y) = divide myTl
          
        in
          (a::x, b::y)
        end
    

    您的第二个基本情况也是无关紧要的,因此我们可以进一步修改为

    fun divide [] = ([], [])
      | divide ((a, b)::xs) =
        let
          val (x, y) = divide xs   
        in
          (a::x, b::y)
        end
    

    【讨论】:

      猜你喜欢
      • 2018-04-28
      • 2018-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-28
      • 2020-05-19
      • 1970-01-01
      相关资源
      最近更新 更多