Types 为什么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

我尝试定义一个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)
我无法理解错误,也无法找到我函数的错误所在


如何修复它?

我想你的意思是:

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