在Haskell中是否有类似于美元符号的操作符,但是它会优先处理左侧的表达式?也就是说,代替像这样使用dollar符号:
f (x 1)
被编写为
f $ x 1
我想把它写成
x 1 $ f
这纯粹是一种样式上的事情。我按顺序运行一系列函数,如果我能够从左到右编写它们以匹配我的阅读方式,那将会很好。是否有这样一个运算符?
[更新] 有几个人问我是否不能定义自己的。答案是,我想在重新发明轮子之前检查是否存在现有的运算符。
f (x 1)
被编写为
f $ x 1
我想把它写成
x 1 $ f
这纯粹是一种样式上的事情。我按顺序运行一系列函数,如果我能够从左到右编写它们以匹配我的阅读方式,那将会很好。是否有这样一个运算符?
[更新] 有几个人问我是否不能定义自己的。答案是,我想在重新发明轮子之前检查是否存在现有的运算符。
flip
来改变任意二元函数或运算符的参数顺序:ghci> let (|>) = flip ($)
ghci> 3 |> (+4) |> (*6)
42
我不知道是否存在标准运算符,但是什么阻止你自己编写一个呢?在ghci中可以这样实现:
Prelude> let a $> b = b a
Prelude> 1 $> (+2)
3
Prelude> sum [1, 2] $> (+2)
5
Prelude> map (+2) [1, 2] $> map (+3)
[6,7]
更新:在hoogle上搜索a -> (a -> b) -> b
(这是此操作符的类型)没有找到有用的内容。
|>
。如上所述,在 F# 中,该运算符正好可以实现你想要的功能,因此使用相同的名称将有助于人们更容易地理解你的代码。 - C. A. McCann|>
符号。使用 #
符号似乎更好。 - michau这个组合子(半开玩笑地)在data-aviary包中定义:
Prelude Data.Aviary.BirdsInter> 1 `thrush` (+2)
Loading package data-aviary-0.2.3 ... linking ... done.
3
虽然实际使用那个包有些荒谬,但阅读源代码是有趣的,并揭示了这个组合子是通过神奇的咒语flip id
(或者在鸟类学语境下,cardinal idiot
)形成的。
我不知道是否有任何标准版本,但我在一些地方看到过(#)被用于这个目的。特别是 HOC(Higher-Order Component)中使用了像这样的习语:
someObject # someMessage param1 param2
我记得看到其他“面向对象”的库也使用#运算符,但是不记得有多少个或哪些。
你不能重新定义$
吗?
let ($) x f = f x
或者选择不同的运算符,比如$$
f . g $ 1
是相反的。 - dopatraman