List 虚拟类型SML

List 虚拟类型SML,list,sml,List,Sml,我试图在这里做所有的事,但什么也没发生。当我在没有空列表的情况下调用它时,代码工作正常,但一旦我放入空列表[],就会出现问题。它会弹出“虚拟类型”警告,并在以下代码中出现一些错误: fun zip(xs1, x2) = case xs1 of [] => [] | (h1::t1) => (case x2 of [] => []

我试图在这里做所有的事,但什么也没发生。当我在没有空列表的情况下调用它时,代码工作正常,但一旦我放入空列表[],就会出现问题。它会弹出“虚拟类型”警告,并在以下代码中出现一些错误:

fun zip(xs1, x2) =
    case xs1 of
        [] => []
        | (h1::t1) => (case x2 of
                            [] => []
                            |   (h2::t2) => (h1, h2) ::zip(t1,t2));
输出应该是一个由元组创建的列表,元组是输入列表的头,长度比输入列表短。正如您在图片中看到的,代码本身没有错误,至少编译器不会识别错误,就在我调用空列表函数时。


我真的不知道那里发生了什么。有人能给我解释一下这种类型的错误是什么意思,以及我如何修复代码使其不存在吗?

在您第一次尝试时,它的拉链正确。在第二次尝试中,您忘记了两个列表之间的逗号。在第三次尝试中,您是成功的,但是由于第一个参数在顶层是多态的,因此您遇到了 这个

更漂亮的zip版本:

fun zip ([], _ys) = []
  | zip (_xs, []) = []
  | zip (x::xs, y::ys) = (x,y)::zip (xs, ys)
以及一个更简短、等效的版本:

fun zip (x::xs, y::ys) = (x,y)::zip (xs, ys)
  | zip _ = []
zip的尾部递归版本来自:

fun zip (xs, ys) =
    let fun helper (x::xr, y::yr, result) = helper (xr, yr, (x,y)::result)
          | helper (_, _, result) = List.rev result
    in zip' (xs, ys, []) end