0

我试图定义一个 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)

我无法理解错误,也找不到我的功能错误在哪里。

如何解决?

4

2 回答 2

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)
     | _ => []
于 2013-10-22T16:45:31.483 回答
0

我发现以下内容更漂亮,尽管大部分是等效的。

fun zip ([], []) = []
  | zip (v :: vs, p :: ps) = (v, p) :: zip(vv, pp)

不同之处在于,当列表长度不相等时,它将失败。您可以通过失败来处理此问题,或者在其中一个为空时返回空列表(就像您现在所做的那样。)

参阅zip此处zipEqhttp://www.standardml.org/Basis/list-pair.html

于 2013-10-22T20:51:43.767 回答