我怎么能优雅地不这样做。在哈斯克尔?

时间:2015-04-24 00:58:35

标签: haskell

我正在试图弄清楚如何否定两个参数布尔函数的结果,如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

3 个答案:

答案 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)。

请参阅http://conal.net/blog/posts/semantic-editor-combinators

答案 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