带累加器列表的SML逆列表

时间:2013-09-02 15:26:10

标签: list sml inverse

我想在SML上做一个函数,它反转第一个列表,然后与第二个列表连接(有些像:list1 = [5,3,1]和list 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列表清单 else分支:''Z列表 在表达中:

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

有人可以帮我这个吗?

2 个答案:

答案 0 :(得分:4)

fun inv ([], b) = b
 |  inv (h::t, b) = inv(t, h::b)

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

答案 1 :(得分:0)

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