我尝试定义一个SML函数,它将两个列表压缩成一个:
fun zip(vs:string list, ps:int list) : string*int list =
case (vs,ps) of
(v::vv,p::pp) => (v,p) :: zip(vv,pp)
| _ => []
但它报告了这样的错误:
stdIn:3.20-3.39 Error: operator and operand don't agree [tycon mismatch]
operator domain: (string * int) * (string * int) list
operand: (string * int) * (string * int list)
in expression:
(v,p) :: zip (vv,pp)
我无法理解错误,无法找到我的功能错误在哪里。
如何解决?
答案 0 :(得分:0)
我猜你的意思是:
fun zip(vs:string list, ps:int list) : (string * int) list =
case (vs,ps) of
(v::vv,p::pp) => (v,p) :: zip(vv,pp)
| _ => []
请注意,(string * int) list
与string * int list
不同。后者将被解释为string * (int list)
,这是SML错误消息所说的内容。
事实上,你可以摆脱任何类型,并且由于类型推断而得到修复:
fun zip(vs, ps) =
case (vs,ps) of
(v::vv,p::pp) => (v,p) :: zip(vv,pp)
| _ => []
答案 1 :(得分:0)
我发现以下内容更漂亮,尽管大部分都是等同的。
fun zip ([], []) = []
| zip (v :: vs, p :: ps) = (v, p) :: zip(vv, pp)
不同之处在于,当列表长度不等时,它将失败。您可以通过失败来处理此问题,或者在其中一个为空时返回空列表(正如您现在所做的那样)。
请参阅zip
和zipEq
此处http://www.standardml.org/Basis/list-pair.html