【问题标题】:SML getting an unbound variable or constructor error when everything seems right当一切看起来都正确时,SML 得到一个未绑定的变量或构造函数错误
【发布时间】:2021-02-17 15:45:01
【问题描述】:

我正在尝试找出相互递归。我有这个代码:

fun take(L)=
      if L=nil then nil
      else hd(L) :: skip(tl(L))
AND
fun skip(L)=
      if L=nil then nil
      else take(tl(L));

但它给了我这些错误:

stdIn:54.14-54.18 Error: unbound variable or constructor: skip
stdIn:55.1-55.4 Error: unbound variable or constructor: AND

我做错了什么?

【问题讨论】:

    标签: sml ml


    【解决方案1】:

    您的直接错误是因为标准 ML 是区分大小写的,并且它的所有保留字都是小写的;所以你需要写and而不是AND

    另外,fun 引入了一个完整的声明,而不是单独的绑定,这意味着您需要删除and 之后的额外fun

    最后,您的函数目前要求列表具有相等类型(例如 int liststring list),这可能不会破坏交易,但考虑到函数的实际作用,它们确实没有理由不支持real list等不等式类型。为此,您应该将参数匹配模式nil,而不是测试参数是否等于nil。 (更一般地说,你应该在更多的地方使用模式匹配;你没有理由打电话给hdtl。)

    把它放在一起:

    fun take nil = nil
      | take (h::t) = h :: skip t
    and skip nil = nil
      | skip (h::t) = take t
    

    【讨论】:

    • 试过这样做,我只是将“AND”更改为“and”并得到这些错误stdIn:125.1-126.9 Error: syntax error: deleting AND FUN ID stdIn:127.2-127.6 Error: syntax error: deleting IF ID stdIn:127.11 Error: syntax error found at THEN
    • @h2oBoost:是的,抱歉,我只解决了问题中的错误。我现在扩展了答案以解释您的代码的其他一些问题(以及如何解决这些问题)。
    • @h2oBoost:关于相等类型的部分:如果您注意到,您的函数的类型为''a list -> ''a list,而@ruakh 的函数的类型为'a list -> 'a list。完全没有必要要求输入列表元素具有相等类型,但要指出的另一点是:当您执行xs = ys 以查看两个事物是否相等时,这会引发对两个结构的深度遍历 xsys;自然,这不是问题,因为您正在与[] 进行比较,而且这种深度遍历毕竟不是那么深。但是,如果你能用更少的钱做事,就不要习惯于比较事物。 :)
    猜你喜欢
    • 1970-01-01
    • 2021-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-04
    相关资源
    最近更新 更多