【问题标题】:reverse function and append function to custom list standard ml反向函数和附加函数到自定义列表标准 ml
【发布时间】:2012-04-13 11:41:42
【问题描述】:

我想创建一个反转 mylist 值的函数。我编写了代码,但它不起作用,如果有任何提示或帮助,我将不胜感激。

数据类型代码:

datatype 'element mylist = 
  NIL
| CONS 'element * 'element mylist;

我写的函数是:

fun reverse NIL = NIL
  | reverse (CONS(x, xs)) = CONS((reverse xs), x);

我还想编写一个附加 2 个 mylist 值的函数,我有一些情况,但它没有工作,我想到了以下几点:

fun append NIL = fn NIL => NIL
  | append NIL = fn (CONS(x, xs)) => CONS(x, xs)
  | append (CONS(x, xs)) = fn NIL => CONS(x, xs)
  | append (CONS(x, xs)) = fn (CONS(y, ys)) => append xs (CONS(y, ys));

但它不起作用,给我错误,我的代码有什么问题?

谢谢

【问题讨论】:

    标签: function append reverse sml ml


    【解决方案1】:

    append函数中,你犯了两个错误:

    • append NILappend (CONS(x, xs)) 的重复模式匹配案例。
    • fn NIL => ... 等的 lambda 中的非穷举模式匹配。

    append 的逻辑也不正确。它应该是这样的:

    fun append NIL ys = ys
      | append (CONS(x, xs)) ys = CONS(x, append xs ys)
    

    函数reverse 出现类型不匹配错误。由于reverse xs 是一个列表,所以CONS(reverse xs, x) 不进行类型检查。一个快速的解决方法是使用append 来实现reverse

    fun reverse NIL = NIL
      | reverse (CONS(x, xs)) = append (reverse xs) (CONS(x, NIL))
    

    【讨论】:

    • 我不太明白你提到的重复模式匹配案例,每个案例里面都有不同的fn,为什么它仍然被认为是重复的?
    • 由于=之前的左侧部分相同,编译器无法区分它们。
    • 我明白了,所以如果我想做一些类似于我之前的 4 个案例的东西,那么在 fn 语句中,如果我使用 if 作为第二个参数,它会和我的一样吗想在这4种情况下?它无关紧要的是要知道什么以供将来参考
    • 如果您使用像 append NIL NIL = ... 这样的显式参数来获得 4 种明显不同的情况,则可以或更好。
    【解决方案2】:

    反转列表的经典方法是使用尾递归辅助函数,如下所示:

    fun helper accumulator NIL = accumulator
      | helper accumulator CONS(x, xs) = helper CONS(x, accumulator) xs
    

    现在反向很简单:

    val reverse = helper NIL
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-23
      • 2018-08-13
      • 2016-01-19
      • 1970-01-01
      • 2018-08-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多