SML:合并两个列表

时间:2015-08-14 21:39:38

标签: functional-programming sml

我有以下功能将两个列表合并为一个。它的应该类型:

@ : 'a list * 'a list -> 'a list

fun @ (nil, k) = k
    | @ (x::l, k) = x :: @(l,k);

我们说我们有两个列表:[1, 2, 3][4, 5, 6]。如果我打电话:

@([1, 2, 3], [4, 5, 6])

1::@([2, 3], [4, 5, 6])

1::2::@([3], [4, 5, 6])

1::2::3::@(nil, [4, 5, 6])

但是我们到达基本情况,我们的@调用返回列表[4, 5, 6],产生:

1::2::3::[4, 5, 6]

这显然不是我想要的。功能定义是正确的还是我误解了什么?

1 个答案:

答案 0 :(得分:1)

是的,你的功能定义是正确的 在Lisp中调用::缺点,其他函数式编程语言用于创建列表。它需要一个值和一个列表(可能是空的)并创建一个新的列表,前者前置于后者。例如,42::[17, 23]等于[42, 17, 23] 缺点是正确的联想,这意味着你的清单
1::2::3::[4,5,6]
可以写为
(1::(2::(3::[4,5,6])))
通过连续减少,我们得到了 [1,2,3,4,5,6]