我正在做一些关于函数式语言的自学(目前正在使用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表达式有问题......