SML / NJ使用foldr从int列表返回偶数整数

时间:2015-10-31 22:58:13

标签: list int sml fold smlnj

我最近使用SML而且我正试图解决问题。 我应该创建一个接受int列表并返回偶数int列表的函数, 我已经创建了它:

 fun evens [] = [] |
 evens [x] = [x] |
 evens(x::xs) =
 case x mod 2 of
 0 => x::evens xs |
 1 => evens xs;

给出了正确的结果,但我需要使用foldr 这就是我提出的:

fun evens [] = [] |
evens(x::xs) =
case x mod 2 of
0 => foldr (op ::) evens xs [x]  |
1 => evens xs;

但它不起作用,我仍然对如何在这种情况下使用foldr感到困惑。

任何建议?

1 个答案:

答案 0 :(得分:1)

首先,对于foldr,您应该使用模式和案例来寻找1行定义而不是递归定义。 foldr的要点是它包含一个共同的递归模式 - 你只需要使用该模式。

foldr的类型是

fn : ('a * 'b -> 'b) -> 'b -> 'a list -> 'b

在您的情况下,'bint list'aint'b类型中间的箭头之间的foldr是种子值。它通常对应于基准值。在构建列表时,此基值通常为[]。因此 - 你需要专注于应该在列表上折叠什么的关键问题。换句话说 - 您应该将('a * 'b -> 'b)类型的哪个函数传递给foldr?在您的情况下,您需要传递类型

的函数
int * int list -> int list

这应该是一个函数,当给定一个int和一个int列表时,要么将int添加到列表中(如果它是偶数),要么单独留下列表。您可以提前定义此函数,使用let定义它,或者只使用匿名函数。

假设这是作业,我不想给出完整的答案,但这是一个使用foldr获取列表中的肯定条目的函数:

fun positives xs =
    foldr (fn (x,xs) => if x >= 0 then x::xs else xs) [] xs;
-
- positives [3,~2,4,5,0,~1,~1,5];
val it = [3,4,5,0,5] : int list