返回SML中的列表对

时间:2013-11-19 12:18:24

标签: sml smlnj

我想构建一个列表,列表中的所有元素都与给定列表的头部配对。到目前为止,代码如下。我不确定我在哪里弄错了。

 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])]

2 个答案:

答案 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