返回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