在SML中组合功能

时间:2010-09-24 10:16:36

标签: functional-programming sml

嘿,我是一个非常新的SML和编程,我想写一个组合在列表中的函数,这样 [x1,x2,x3,x4,...] = [(x1,x2),(x3,x4),...]我非常感谢任何有关我向正确方向前进的提示或帮助。

2 个答案:

答案 0 :(得分:3)

通过查看问题,很明显我们可能希望一次处理输入两个项目。

让我们看看我们想要对每一对做什么:如果x1和x2是我们当前正在查看的项目,我们希望将对(x1, x2)放入我们正在创建的列表中。如果xsx1x2之后的项目列表,我们希望对(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)