【问题标题】:SML inverse list with accumulator list带累加器列表的 SML 逆列表
【发布时间】:2013-09-02 15:26:10
【问题描述】:

我正在尝试在 SML 上执行一个函数,该函数反转第一个列表,然后与第二个列表连接(类似于:list1 = [5,3,1] 和列表 2 = [6 7 8],然后是 inv (list1,list2) = [ 1,3,5,6,7,8]。) 代码如下:

fun inv (nil,nil) = []
|inv (ha::ta,hb::tb) = 
 if ha = [] then ta::(hb::tb)
 else  ha::inv(ta,hb::tb);

它返回这个:

错误:if 分支的类型不一致 [循环性] 然后分支:''Z list list list else 分支:''Z 列表列表 表达方式:

如果 ha = nil 则 ta :: hb :: tb else ha :: inv (ta, :: )

谁能帮我解决这个问题?

【问题讨论】:

  • 怎么样:fun inv (xs, ys) = rev xs @ ys

标签: list sml inverse


【解决方案1】:
fun inv ([], b) = b
 |  inv (h::t, b) = inv(t, h::b)

请注意,您不需要在第二个列表中进行模式匹配。这是尾递归函数的典型示例;这是反转具有恒定堆栈空间的列表的方法。您的错误是使用 cons (::) ,其中第一个参数的类型为 'a list.

【讨论】:

    【解决方案2】:

    由于您使用的是列表,如果 ha =[],则 list1 中没有其他术语。

    【讨论】:

    • 没有。 ha 是列表的头部,这意味着如果ha = [],那么它是一个以空列表开头的列表列表,这根本不是本意。
    猜你喜欢
    • 1970-01-01
    • 2019-04-29
    • 2015-06-08
    • 1970-01-01
    • 2013-09-18
    • 2016-01-01
    • 2020-08-22
    • 1970-01-01
    • 2017-09-19
    相关资源
    最近更新 更多