Types 为什么SML函数会显示这一点;“类型不匹配”;错误?
我尝试定义一个SML函数,它将两个列表压缩为一个:Types 为什么SML函数会显示这一点;“类型不匹配”;错误?,types,sml,Types,Sml,我尝试定义一个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 mismat
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)
我无法理解错误,也无法找到我函数的错误所在
如何修复它?我想你的意思是:
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)列表
与string*int列表
不同。后者将被解释为string*(int list)
,这就是SML错误消息所说的
事实上,您可以摆脱任何类型,并且由于类型推断,它得到了修复:
fun zip(vs, ps) =
case (vs,ps) of
(v::vv,p::pp) => (v,p) :: zip(vv,pp)
| _ => []
我发现以下几点更漂亮,尽管大体相当
fun zip ([], []) = []
| zip (v :: vs, p :: ps) = (v, p) :: zip(vv, pp)
不同之处在于,当列表长度不相等时,它将失败。您可以通过失败或在其中一个列表为空时返回空列表(如您现在所做的)来处理此问题
请参见此处的zip
和zipEq