17

编写 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

4 回答 4

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
于 2013-03-24T21:50:39.800 回答
12

lens将此运算符&定义为.

于 2013-03-24T22:25:37.533 回答
7

您还可以将 (|>) 定义为“flip id”,并且理解其工作原理是 Haskell 中使用的统一类型推断的重要一课。

于 2013-03-25T21:38:48.040 回答
0

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


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

以我的经验,恕我直言等等......

如果与通常的构图相比,前向构图提高了可读性(不仅在处理镜头时),在该模块中定义特殊运算符或通过letor在本地定义一个特殊运算符是有益的where。为此,我倾向于使用单个 unicode 符号而不是 ascii 组合。

(·) = flip (.)
infixl 1 (·)

(§) = ($) -- left associative, no flip
infixl 0 (§)

几年前(当时还没有镜头),我也想过为这些镜头定义自己的模块。但是后来我越来越少地使用该模块,以至于我倾向于重新发明轮子。将这些运算符放在库中甚至可能会增加阅读代码的工作量:读者必须查找那些很少使用的运算符。在这种情况下,本地定义的运算符要好得多。

于 2013-04-04T11:57:43.973 回答