运算符和操作数不一致 [tycon mismatch]

问题描述

我正在尝试在 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

解决方法

您看到的错误消息是因为您(无意中)由于输入模式而声明了一个域为 ('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