一个快速的问题,Haskell 中是否有一个像美元符号一样工作但优先于左侧的运算符。IE而不是
f (x 1)
被写为
f $ x 1
我想把它写成
x 1 $ f
这纯粹是文体问题。我正在按顺序运行一系列函数,如果我可以从左到右编写它们以匹配我从左到右阅读的内容,那就太好了。如果有这方面的运营商?
[更新] 有几个人问我是否不能定义我自己的。作为回答,我想在重新发明轮子之前检查是否有现有的操作员。
一个快速的问题,Haskell 中是否有一个像美元符号一样工作但优先于左侧的运算符。IE而不是
f (x 1)
被写为
f $ x 1
我想把它写成
x 1 $ f
这纯粹是文体问题。我正在按顺序运行一系列函数,如果我可以从左到右编写它们以匹配我从左到右阅读的内容,那就太好了。如果有这方面的运营商?
[更新] 有几个人问我是否不能定义我自己的。作为回答,我想在重新发明轮子之前检查是否有现有的操作员。
从 GHC 7.10(base
4.8.0.0)开始,&
位于Data.Function
:https ://hackage.haskell.org/package/base-4.8.0.0/docs/Data-Function.html
在 Haskell 中,您可以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
(它是此运算符的类型)没有发现任何用处。
这个组合器是在data-aviary包中定义的(舌尖上的):
Prelude Data.Aviary.BirdsInter> 1 `thrush` (+2)
Loading package data-aviary-0.2.3 ... linking ... done.
3
尽管实际上使用该包是一件相当愚蠢的事情,但阅读源代码很有趣,并揭示了这个组合器是通过flip id
(或者,用鸟类学的说法,cardinal idiot
)的魔法咒语形成的。
我不知道任何标准版本,但我在几个地方看到 (#) 用于此目的。特别想到的是 HOC,它以如下成语使用它:
someObject # someMessage param1 param2
我似乎记得看到其他“面向对象”库以相同的方式使用 # 运算符,但不记得有多少或哪些。
你不能重新定义$
.
let ($) x f = f x
或者只是选择一个不同的运营商,比如$$