29

我发现定义以下

(%)  = flip fmap

我可以这样写代码:

readFile "/etc/passwd" % lines % filter (not . null)

对我来说,它比替代方案更有意义:

filter (not . null) <$> lines <$> readFile "/etc/passwd"

显然,这只是顺序问题。

还有其他人这样做吗?有正当理由不写这样的代码吗?

4

5 回答 5

11
(<&>) :: Functor f => f a -> (a -> b) -> f b 

现在可从Data.Functor. base

https://hackage.haskell.org/package/base-4.12.0.0/docs/Data-Functor.html#v:-60--38--62-

于 2019-12-07T21:08:31.233 回答
11

(%)的操作员正是(<&>)镜头包中的操作员。

它可以通过以下方式导入:

import Control.Lens.Operators ((<&>))
于 2016-07-01T13:24:49.943 回答
7

Applicative类型类有一个类似的函数,称为<**>; 想要或使用 Functor 也是一件非常合理的事情。不幸的是,语义有点不同<**>,因此也不能直接扩展以适用于Functor

于 2009-11-05T03:14:54.263 回答
5
-- (.) is to (<$>) as flip (.) is to your (%).  

我通常定义 (&) = flip (.) 就像你的例子一样,你可以应用函数组合反词。在我看来,允许更容易理解无积分代码。

于 2009-11-05T05:31:31.583 回答
2

就我个人而言,我不会使用这样的运算符,因为那样我必须学习两个阅读程序的顺序。

于 2009-11-05T08:46:29.180 回答