Proposal: Add (&) to Data.Function

Dan Burton danburton.email at gmail.com
Tue Nov 20 18:19:29 CET 2012


Just to bring up some prior art, from what I've heard, F# calls this |>. In
Clojure the -> function takes a value and a series of functions, and
applies them in order from left to right, e.g. (-> 5 zero? not) ;;=> true.
Obviously, In OO languages, this is usually accomplished by chaining calls
foo.bar().baz().quux().

I agree that Haskell should provide this idiom. I find & to be a strange
name for it, but to be honest, it's no stranger than $ so I say go for it.
I would suggest | to mimic the unix pipe, but this obviously clashes with
Haskell guard syntax. I think |> is a reasonable name, but Data.Sequence
has already claimed it.

-- Dan Burton


On Tue, Nov 20, 2012 at 9:59 AM, Yitzchak Gale <gale at sefer.org> wrote:
>
>  It is a common idiom to write a sequence of composed combinators in
>  reverse order to the way they would be written with ($) or (.). That
>  naturally expresses the idea of the combinators as operations being
>  applied in the given order.
>
>  This comes up so often, and is commonly used so many times in a single
>  expression, that Control.Arrow.>>> is far too wordy, and even a two-
>  character operator is awkward.
>
>  Surprisingly, until recently the operator (&) was still not used in any
>  of the popular libraries, and its name naturally expresses the idea we
are
>  looking for. This operator has now been defined in the lens package. We
>  hereby propose to move it to its natural home for more general use,
>  Data.Function.
>
>  As in the lens package, we define the operator as a flipped version of
>  ($), but with slightly higher precedence for better interaction with
>  ($), and with left associativity. This definition has already proven
>  useful and convenient even in the presence of the large  and varied
corpus
>  of combinators and operators in the lens package. (There it was formerly
>  known as (%), but that clashed with the usual meaning of (%) from
>  Data.Ratio.)
>
>  infixl 1 &
>  (&) :: a -> (a -> b) -> b
>  a & f = f a
>  {-# INLINE (&) #-}
>
> Discussion period: 2 weeks
>
> http://hackage.haskell.org/trac/ghc/ticket/7434
>
> Thanks,
> Yitz
>
> _______________________________________________
> Libraries mailing list
> Libraries at haskell.org
> http://www.haskell.org/mailman/listinfo/libraries
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/libraries/attachments/20121120/232493d1/attachment.htm>


More information about the Libraries mailing list