是否有Haskell $运算符的反转?

时间:2010-11-03 18:08:49

标签: haskell operators dollar-sign

一个简单的问题,Haskell中的运算符是否与美元符号一样,但优先于左侧。 I.E.而不是

f (x 1) 

写成

f $ x 1

我想把它写成

x 1 $ f

这纯粹是一种风格。我按顺序运行了一系列函数,如果我可以将它们写成左边写入以匹配我读到的左边写,那将会很好。如果有运营商吗?

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

6 个答案:

答案 0 :(得分:29)

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

ghci> let (|>) = flip ($)
ghci> 3 |> (+4) |> (*6)
42

答案 1 :(得分:29)

自GHC 7.10(base 4.8.0.0)起,&位于Data.Functionhttps://hackage.haskell.org/package/base-4.8.0.0/docs/Data-Function.html

答案 2 :(得分: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(这是此运算符的类型)没有任何用处。

答案 3 :(得分:10)

这个组合子在data-aviary包中定义(舌头):

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

虽然实际使用该包是一件相当愚蠢的事情,但阅读源代码很有趣,并且揭示了this combinator是通过flip id的神奇咒语形成的(或者,用鸟类的说法,{ {1}})。

答案 4 :(得分:4)

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

someObject # someMessage param1 param2

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

答案 5 :(得分:-1)

你不能只重新定义$

let ($) x f = f x

或者只选择其他运算符,例如$$