我正在试图弄清楚如何否定两个参数布尔函数的结果,如not . any
。我理解为什么它不能通过如下所示分解它,但我不知道如何编写一个优雅地执行此操作的函数。我设法做curry $ not . uncurry any
Prelude> :t not
not :: Bool -> Bool
Prelude> :t any
any :: Foldable t => (a -> Bool) -> t a -> Bool
Prelude> :t (.)
(.) :: (b -> c) -> (a -> b) -> a -> c
curry $ not . uncurry any
:: Foldable t => (a -> Bool) -> t a -> Bool
答案 0 :(得分:11)
有一个标准的免费ifier,可以单独使用或通过lambdabot,它提供:
18:02 <dmwit> ?pl \f xs -> any (\x -> not (f x)) xs
18:02 <lambdabot> any . (not .)
18:04 <dmwit> ?pl \f xs -> not (any f xs)
18:04 <lambdabot> (not .) . any
有many ways to spell this general operation。
修改:感谢zudov以下建议的额外文字:您还可以通过安装pointfree
或使用其中一个网络界面访问pointfree
工具(例如http://pointfree.io)。
答案 1 :(得分:6)
定义
result = (.)
argument = flip (.)
然后你想要
(result.result) not any
即,否定any
的第二个结果。
(也是
argument (result not) all
即,否定谓词然后将其传递给all
)。
答案 2 :(得分:5)
(.:) :: (r -> z) -> (a -> b -> r) -> a -> b -> z
(f .: g) x y = f (g x y)
foo :: (a -> Bool) -> [a] -> Bool
foo = not .: any
来自.:
包的Data.Composition
也提供了 composition
。