嘿,我对 SML 和编程非常陌生,我想编写一个在列表中组合的函数,例如 [x1,x2,x3,x4,...] = [(x1,x2),(x3,x4) ,...] 非常感谢任何提示或帮助我朝着正确的方向前进。
2 回答
3
通过查看问题,很明显我们可能希望一次处理两个输入项。
所以让我们看看我们想要对每一对做什么:如果 x1 和 x2 是我们当前正在查看的项目,我们希望将这对(x1, x2)
放入我们正在创建的列表中。如果xs
是 和 之后的项目列表x1
,x2
我们希望这对(x1, x2)
后跟“组合” xs 的结果。所以我们可以把我们的 combine 函数写成:
fun combineWithin (x1::x2::xs) = (x1, x2)::(combineWithin xs)
然而,这个定义还不完整。我们只关注xs
至少有两个项目的情况。所以我们需要问自己在其他两种情况下我们想做什么。
对于空列表很简单:合并空列表的结果是空列表。
对于只有一项的列表,我们也可以返回空列表,或者引发错误(或者可能将一项与自身配对)。换句话说:我们需要决定是combineWithin [1,2,3]
返回[(1,2)]
还是[(1,2), (3,3)]
抛出错误。
如果我们决定我们想要前者,我们的功能变成:
fun combineWithin (x1::x2::xs) = (x1, x2)::(combineWithin xs)
| combineWithin _ = []
于 2010-09-24T10:49:55.130 回答
-1
let rec pairs = function
| [] -> []
| [x] -> []
| x1::x2::rest -> (x1, x2)::(pairs rest)
于 2010-09-24T10:35:12.550 回答