首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >带有两个参数的Haskell列表过滤

带有两个参数的Haskell列表过滤
EN

Stack Overflow用户
提问于 2019-05-23 04:08:59
回答 1查看 336关注 0票数 0

我必须编写一个函数,它用一个结果为True的参数过滤,然后用另一个结果为False的参数过滤

我试过这个:

代码语言:javascript
复制
selectUnless :: (t -> Bool) -> (t -> Bool) -> [t] -> [t]
selectUnless fx gx (x:xs) = filter gx (filter fx (x:xs))

但我需要那个“不是gx”的列表。

例如:

代码语言:javascript
复制
selectUnless (>= 2) (==2) [1,2,3,4] == [3,4]
selectUnless even odd [1..50] == [2,4..50]
EN

回答 1

Stack Overflow用户

发布于 2019-05-23 04:17:43

因为filter f . filter g = filter (\x -> f x && g x),我们只需要一些方法来反转g。正如Willem提到的那样,它以not的形式存在。所以我们有:

代码语言:javascript
复制
selectUnless f g = filter (\x -> f x && not (g x))

如果你想变得更聪明一点,你可以提升&&

代码语言:javascript
复制
(<&&>) = liftA2 (&&)
infixr 3 <&&>

selectUnless f g = filter (f <&&> not . g) 

您甚至可能会认为这是简洁和意图-揭示了足够的不需要自己的名称。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56264267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档