我最近使用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
感到困惑。
任何建议?
答案 0 :(得分:1)
首先,对于foldr
,您应该使用模式和案例来寻找1行定义而不是递归定义。 foldr
的要点是它包含一个共同的递归模式 - 你只需要使用该模式。
foldr
的类型是
fn : ('a * 'b -> 'b) -> 'b -> 'a list -> 'b
在您的情况下,'b
为int list
,'a
为int
。 '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