44

一个快速的问题,Haskell 中是否有一个像美元符号一样工作但优先于左侧的运算符。IE而不是

f (x 1) 

被写为

f $ x 1

我想把它写成

x 1 $ f

这纯粹是文体问题。我正在按顺序运行一系列函数,如果我可以从左到右编写它们以匹配我从左到右阅读的内容,那就太好了。如果有这方面的运营商?

[更新] 有几个人问我是否不能定义我自己的。作为回答,我想在重新发明轮子之前检查是否有现有的操作员。

4

6 回答 6

43

从 GHC 7.10(base4.8.0.0)开始,&位于Data.Functionhttps ://hackage.haskell.org/package/base-4.8.0.0/docs/Data-Function.html

于 2015-07-11T01:49:21.080 回答
35

在 Haskell 中,您可以flip用来更改任何二元函数或运算符的参数顺序:

ghci> let (|>) = flip ($)
ghci> 3 |> (+4) |> (*6)
42
于 2010-11-04T11:20:28.410 回答
20

我不知道,是否有标准运算符,但是是什么阻止您编写自己的运算符?这适用于 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(它是此运算符的类型)没有发现任何用处。

于 2010-11-03T18:16:49.127 回答
10

这个组合器是在data-aviary包中定义的(舌尖上的):

Prelude Data.Aviary.BirdsInter> 1 `thrush` (+2)
Loading package data-aviary-0.2.3 ... linking ... done.
3

尽管实际上使用该包是一件相当愚蠢的事情,但阅读源代码很有趣,并揭示了这个组合器是通过flip id(或者,用鸟类学的说法,cardinal idiot)的魔法咒语形成的。

于 2010-11-04T02:43:14.853 回答
4

我不知道任何标准版本,但我在几个地方看到 (#) 用于此目的。特别想到的是 HOC,它以如下成语使用它:

someObject # someMessage param1 param2

我似乎记得看到其他“面向对象”库以相同的方式使用 # 运算符,但不记得有多少或哪些。

于 2010-11-03T18:22:41.583 回答
-1

你不能重新定义$.

let ($) x f = f x

或者只是选择一个不同的运营商,比如$$

于 2010-11-03T18:18:31.207 回答