使用累加器列表对SML反转列表

3

我正在尝试在SML上编写一个函数,该函数将反转第一个列表,然后将其与第二个列表连接起来(类似于:list1 = [5,3,1]和list2 = [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分支的类型不一致[circularity] 然后分支:''Z列表列表列表 否则分支:''Z列表列表 在表达式中:
如果ha = nil,则ta :: hb :: tb,否则ha :: inv (ta,:: )。
请问有谁能帮帮我吗?

如何使用以下代码:fun inv (xs, ys) = rev xs @ ys - sshine
2个回答

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

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

0

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


不,ha 是列表的头部,这意味着如果 ha = [],那么它是一个以空列表开头的列表,这并不是本意。 - Tayacan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接