3

嘿,我对 SML 和编程非常陌生,我想编写一个在列表中组合的函数,例如 [x1,x2,x3,x4,...] = [(x1,x2),(x3,x4) ,...] 非常感谢任何提示或帮助我朝着正确的方向前进。

4

2 回答 2

3

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

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