【问题标题】:dummy types SML虚拟类型 SML
【发布时间】:2018-02-02 17:03:00
【问题描述】:

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

fun zip(xs1, x2) =
    case xs1 of
        [] => []
        | (h1::t1) => (case x2 of
                            [] => []
                            |   (h2::t2) => (h1, h2) ::zip(t1,t2));

输出应该是一个由元组创建的列表,这些元组是输入列表的头部,具有较短列表的长度。正如您在图片中看到的那样,代码本身没有错误,至少不是编译器识别的错误,就在我用空列表调用函数时。

老实说,我不知道那里发生了什么。有人可以向我解释一下这种类型的错误是什么意思,我怎样才能修复代码没有它?

【问题讨论】:

    标签: list sml


    【解决方案1】:

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

    一个更漂亮的 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 _ = []
    

    来自Moscow ML's ListPair module 的 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-20
      • 1970-01-01
      相关资源
      最近更新 更多