返回原始列表中所有偶数元素的列表-如何在不使用递归的情况下编写此函数?

问题描述

此函数获取一个列表,并返回原始列表中所有偶数元素的列表。我正在尝试找出如何使用foldlfoldrmap来做到这一点,但我似乎无法弄清楚。

fun evens [] = []
    | evens (x::xs) =
        if
            x mod 2 = 0
        then
            x::evens(xs)
        else
            evens(xs);

解决方法

由于所需元素的数量少于开始的数量,因此map已用完。
如果您同时使用foldlfoldr复制列表,

- 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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...