开发者

Is there an inverse of the Haskell $ operator?

A quick question, is there an operator in Haskell that works like the dollar sign but gives precedence to the left hand side. I.E. instead of

f (x 1) 

being written as

f $ x 1

I'd like to write it as

x 1 $ f

This is purely a stylistic thing. I'm running a sequence of functions in order and it would be nice 开发者_开发知识库if I could write them left to right to match that I read left to right. If there an operator for this?

[update] A couple of people have asked if I can't define my own. In answer, I wanted to check there wasn't an existing operator before I reinvented the wheel.


As of GHC 7.10 (base 4.8.0.0), & is in Data.Function: https://hackage.haskell.org/package/base-4.8.0.0/docs/Data-Function.html


In Haskell you can use flip to change arguments' order of any binary function or operator:

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


I do not know, whether there is an standart operator, but what prevents you from writing your own? This works in 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]

UPDATE: searching on hoogle for a -> (a -> b) -> b (it is the type of this operator) found nothing useful.


This combinator is defined (tongue in cheek) in the data-aviary package:

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

Although actually using that package is a rather silly thing to do, reading the source is fun, and reveals that this combinator is formed via the magic incantation of flip id (or, in ornithological parlance, cardinal idiot).


I am not aware of any standard version, but I've seen (#) used for that purpose in a couple places. The one in particular that comes to mind is HOC, which uses it in an idiom like:

someObject # someMessage param1 param2

I seem to recall seeing other "object-oriented" libraries using the # operator in the same way, but cannot remember how many or which ones.


Can't you just redefine $.

let ($) x f = f x

Or just choose a different operator, like $$

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜