嘿,我是一个非常新的SML和编程,我想写一个组合在列表中的函数,这样 [x1,x2,x3,x4,...] = [(x1,x2),(x3,x4),...]我非常感谢任何有关我向正确方向前进的提示或帮助。
答案 0 :(得分:3)
通过查看问题,很明显我们可能希望一次处理输入两个项目。
让我们看看我们想要对每一对做什么:如果x1和x2是我们当前正在查看的项目,我们希望将对(x1, x2)
放入我们正在创建的列表中。如果xs
是x1
和x2
之后的项目列表,我们希望对(x1, x2)
后跟“合并”xs的结果。所以我们可以将我们的组合函数编写为:
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 _ = []
答案 1 :(得分:-1)
let rec pairs = function
| [] -> []
| [x] -> []
| x1::x2::rest -> (x1, x2)::(pairs rest)