我想构建一个列表,列表中的所有元素都与给定列表的头部配对。到目前为止,代码如下。我不确定我在哪里弄错了。
fun foo [[]] = [[],[]]
| foo [[x]] = []
| foo (x::y::ys) =(x,y)::foo(ys);
我的签名应该是这样的
('a list) list ->('a list * 'a list) list
示例输出
foo [[2,3,4],[1,2],[6,7,8]] = [([2,3,4],[1,2]),([2,3,4],[6,7,8])]
答案 0 :(得分:2)
问题的更一般版本可能更清楚一些。我不是专门处理列表列表,而是用更通用的类型来讨论它:
'a list -> ('a * 'a) list
这包括您想要的签名('a list) list ->('a list * 'a list) list
作为特例。
现在分为三种情况:空列表,单个元素的列表以及任何其他列表。你不能用前两个元素组成元素,所以我们将这些元素评估为一个空列表。剩下的情况很有趣,看起来和你的情况类似。但是,由于您希望将列表的第一个元素与所有其他元素配对,因此在递归调用foo
时,您需要将第一个元素放回列表中。最终结果如下:
fun foo [] = []
| foo [x] = []
| foo (x::y::ys) = (x,y)::foo(x::ys)
使用时(在莫斯科ML):
- foo [[2,3,4], [1,2], [6,7,8]];
> val it = [([2, 3, 4], [1, 2]), ([2, 3, 4], [6, 7, 8])] :
(int list * int list) list
答案 1 :(得分:1)
做同样事情的一种更简洁的方式:
fun foo [] = []
| foo (x::xs) = map (fn y => (x,y)) xs