问题描述
此函数获取一个列表,并返回原始列表中所有偶数元素的列表。我正在尝试找出如何使用foldl
,foldr
或map
来做到这一点,但我似乎无法弄清楚。
fun evens [] = []
| evens (x::xs) =
if
x mod 2 = 0
then
x::evens(xs)
else
evens(xs);
解决方法
由于所需元素的数量少于开始的数量,因此map
已用完。
如果您同时使用foldl
和foldr
复制列表,
- foldl (op ::) [] [1,2,3];
val it = [3,1] : int list
- foldr (op ::) [] [1,3];
val it = [1,3] : int list
您看到foldl
将其撤消,因此foldr
是您保持订单顺序的自然选择。
现在您所需要的是一个将数字精简到列表的函数,否则将仅生成列表。
像这样一个:
fun cons_if_even (x,xs) = if x mod 2 = 0 then x::xs else xs
然后你有
fun evens xs = foldr cons_if_even [] xs
或内联
fun evens xs = foldr (fn (y,ys) => if y mod 2 = 0 then y::ys else ys) [] xs
使用标准过滤功能更“自然”:
fun evens xs = filter (fn x => x mod 2 = 0) xs