:: a - > (a - > b) - > b运算符(Haskell)

时间:2013-03-24 21:34:55

标签: haskell

编写Haskell程序我发现自己需要这样的运算符。

(|>) :: a -> (a -> b) -> b
(|>) = flip ($)
infixl 0 |>

我认为将多个功能粘合在一起时很有用。

tText cs = someFun cs   |>
           lines        |>
           map (drop 4) |>
           reverse

我比.更喜欢它,因为使用|>函数的顺序与函数的编写顺序相同。

tText' cs = reverse      . 
            map (drop 4) . 
            lines        . 
            someFun $ cs

问题是:|> /其他基本库中是否存在这个(Prelude)的内容?重新实现简单的东西是愚蠢的,我想避免。

Hoogle搜索没有帮助。我发现的最近的东西是>>>(箭头),但似乎有点矫枉过正。

4 个答案:

答案 0 :(得分:16)

不,我所知道的标准库中没有任何内容。多年前我的很多代码都导入了我的breif但是方便的Forwards模块:

> module Forwards where

> infixl 0 |>
> infixl 9 .>

> (|>) = flip ($)
> (.>) = flip (.)

我甚至使用了和你一样的名字!

这些天我根本不使用它 - 我习惯了函数组合使用的顺序。

随意使用您自己的便捷捷径。

我也比以前少用$。我曾经写过的地方

thing = this $ that arg $ an other $ it

现在我写

thing = this . that arg . an other $ it

答案 1 :(得分:12)

答案 2 :(得分:7)

您还可以将(|>)定义为"翻转ID",并理解其工作原理,这是Haskell中使用的统一类型推断的一个很好的教训。

答案 3 :(得分:0)

就我的经验而言,我不知道任何这样的图书馆。如果存在这样的库,我建议不要使用它。


除非您使用镜头包,否则我建议不要使用此类外部定义的操作符。 (如果是镜头包,你真的需要并且已经有这样的操作员。)

根据我的经验,恕我直言等...

如果可读性与正常成分相比增强,而不是通常的成分(不仅仅是在处理镜片时),在该模块中定义一个特殊的运算符或通过let或{{在本地定义1}}。为此,我倾向于使用单个unicode符号而不是ascii组合。

where

几年前(当没有镜头的时候),我也想过为这些镜头定义自己的模块。但后来我逐渐使用那个模块,以至于我总是倾向于重新发明轮子。要让这些运算符在库中,甚至可以增加读取代码的工作量:读者必须查看那些很少使用的运算符。在这种情况下,本地定义的运算符更好。