相关疑难解决方法(0)

你如何在Haskell中使用foldr定义地图和过滤器?

我正在做一些关于函数式语言的自学(目前正在使用Haskell).我遇到了一个基于Haskell的任务,需要根据foldr定义地图和过滤器.对于我的生活,我不完全理解如何去做.

例如,当我定义一个地图函数时:

map'            :: (a -> b) -> [a] -> [b]
map' f []       = []
map' f (x:xs)   = foldr (\x xs -> (f x):xs) [] xs
Run Code Online (Sandbox Code Playgroud)

我不知道为什么列表的第一个元素总是被忽略.意思是:

map' (*2) [1,2,3,4]
Run Code Online (Sandbox Code Playgroud)

得出[4,6,8]而不是[2,4,6,8]

同样,我的过滤器功能:

filter'             :: (a -> Bool) -> [a] -> [a]
filter' p []        = []
filter' p (x:xs)    = foldr (\x xs -> if p x then x:xs else xs ) [] xs
Run Code Online (Sandbox Code Playgroud)

当运行时:

filter' even [2,3,4,5,6]
Run Code Online (Sandbox Code Playgroud)

结果为[4,6]而不是[2,4,6]

为什么会这样呢?我应该如何定义这些函数以获得预期的结果?我假设我的lambda表达式有问题......

haskell functional-programming map filter fold

15
推荐指数
3
解决办法
3万
查看次数

标签 统计

filter ×1

fold ×1

functional-programming ×1

haskell ×1

map ×1