返回SML中的列表对

返回SML中的列表对,sml,smlnj,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]),(

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

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

这个问题有一个更一般的版本,可能更清楚一点。我将用更一般的类型来讨论这一点,而不是专门处理列表列表:

'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)
使用时(在莫斯科):


做同样事情的更整洁的方式:

fun foo [] = []
  | foo (x::xs) = map (fn y => (x,y)) xs
fun foo [] = []
  | foo (x::xs) = map (fn y => (x,y)) xs