【发布时间】:2013-03-24 21:34:54
【问题描述】:
编写 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 搜索没有帮助。我找到的最接近的东西是>>>(箭头),但这似乎有点过头了。
【问题讨论】:
-
不,它没有,尽管正如你所说的
>>>有。 There was another SO question about why F# uses|>where Haskell uses.and$, which is pretty relevant.(另请注意,只是为了好玩,使用.或>>>,您可以编写无点函数:tText = reverse . map (drop 4) . lines . someFun或tText = someFun >>> lines >>> map (drop 4) >>> reverse。) -
前段时间,邮件列表上有一个关于将其添加到标准库的对话。 haskell.org/pipermail/libraries/2012-November/018832.html
-
"函数的应用顺序与函数的编写顺序相同。"嗯——这是 Haskeller 避免的那种想法:你没有指定“做这个,然后结果做那个,然后......”而是专注于期望的结果,所以很自然地从最后一个计算步骤开始。此外,对于惰性评估,这个“最后”步骤实际上将是第一个被评估的步骤! — 对于程序类型的函数,你实际上需要按顺序思考的函数,Haskell 有 Monads,它的
do符号总是“向前”。 -
还有,
tText cs = ($ cs) $ someFun >>> lines >>> map (drop 4) >>> reverse
标签: haskell