3

我正在尝试在 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 分支的类型不同意 [循环性] then branch: ''Z list list list else branch: ''Z list list in expression:

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

任何人都可以帮我解决这个问题吗?

4

2 回答 2

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

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

于 2013-09-02T16:03:06.427 回答
0

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

于 2013-09-02T17:09:51.657 回答