问题描述
我正在尝试在 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