[Haskell-cafe] Desugaring of infix operators is (always?) the
wrong way round
Brian Hulley
brianh at metamilk.com
Tue Sep 25 16:32:14 EDT 2007
Ryan Ingram wrote:
> My comments inlined below...
>
> On 9/25/07, Brian Hulley <brianh at metamilk.com> wrote:
>
>> let
>> shiftLeftByThree = shiftL' 3
>> in
>> map shiftLeftByThree [10, 78, 99, 102]
>>
>
> let shiftLeftByThree = (`shiftL` 3) in ...
>
>
Aha! but this is using section syntax which is yet another complication.
Hypothesis: section syntax would not be needed if the desugaring order
was reversed.
>> Can anyone think of an example where the current desugaring of infix
>> arguments gives the correct order when the function is used in a postfix
>> application? (apart from commutative functions of course!)
>>
>
> A couple off the top of my head:
>
> (:) :: a -> [a] -> [a]
>
Yes that's one that had totally slipped my mind ;-)
> <|> :: MonadPlus m => m a -> m a -> m a
> (how do you define "correct" in this case, anyways?)
>
I'm not so sure about this one eg:
first <|> second
(trychoice second) first
because (trychoice second) encapsulates what to do when its argument
action fails.
> Even for "shift" I can think of several reasons to want to use it both
> ways; for example, unpacking a bitfield from a Word16:
>
> unpack v = (getM 0 255, getM 8 1, getM 9 31, getM 14 3)
> where getM = (.&.) . (shiftR v)
>
>
I suppose with some ops perhaps there is no "most common" way of wanting
to use them and hence no "one-true-way" argument order for those ops.
Thanks for the examples,
Brian.
More information about the Haskell-Cafe
mailing list