gpt4 book ai didi

haskell - 我的过滤器实现可以改进吗?

转载 作者:行者123 更新时间:2023-12-02 04:08:55 26 4
gpt4 key购买 nike

《第一原理》中的 Haskell 练习要求使用 foldr 实现 filter,这就是我的想法,但感觉和看起来都很笨重。有没有更自然的方法来使用 foldr 来实现它?

import Data.Bool
myFilter :: (a -> Bool) -> [a] -> [a]
myFilter f = foldr (\x -> bool (++ []) ((:) x) (f x)) []

最佳答案

只会使用 bool如果它让我通过编写对 bool 的调用来简单地摆脱 lambda 表达式与谓词 p :bool iffalse iftrue . p 。然而,p不是需要在列表元素上调用的唯一函数; (:)也是如此。您可以使用 Applicative函数实例,编写

myfilter p = foldr (bool id . (:) <*> p) []  -- yuck

但在这种情况下,我只会使用普通的 if表达式,在 lambda 表达式内:

myfilter p = foldr (\x -> if p x then (x:) else id) []  -- much clearer!
<小时/>

请注意,当专用于函数时,Applicative(<*>)运算符定义为 f <*> g = \x -> f x (g x) 。我将其作为练习,使用该定义来转换 bool id . (:) <*> p进入 \x -> bool id (x:) (p x) .

关于haskell - 我的过滤器实现可以改进吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53197120/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com