Infix expressions
From HaskellWiki
(Difference between revisions)
(Right associativity for the dual solution this time, so infix expressions behave naturally for left-to-right readers.) |
(Category:Syntax) |
||
| Line 48: | Line 48: | ||
[[Category:Idioms]] | [[Category:Idioms]] | ||
| + | [[Category:Syntax]] | ||
Current revision
1 Mail info
The original header posted here:
From: dons@cse.unsw.edu.au (Donald Bruce Stewart) To: Simon Peyton-Jones <simonpj@microsoft.com> Date: Wed, 15 Mar 2006 23:25:34 +1100 Cc: haskell-prime@haskell.org, oleg@pobox.com Subject: Re: Infix expressions
This refered to a variety of articles, the original was said to be: haskell-cafe message
2 The solution
In Haskell we write`f`
xs `zipWith (+)` ys
Chung-chieh Shan and Dylan Thurston showed the Haskell98 solution for exactly the same example, in their article `Infix expressions', back in 2002 in the article referenced above.
For ease of reference, here's their elegant solution:
infixr 0 -:, :- data Infix f y = f :- y x -:f:- y = x `f` y main = print $ [1,2,3] -: zipWith (+) :- [4,5,6]
For completeness, here's the `dual':
infixl 5 -! (-!) = flip ($) infixl 5 !- (!-) = ($) add2 x y = x + y add3 x y z = x + y + z add4 x y z u = x + y + z + u sub3 x y z = x + y - z testa1 = 1 -! add2 !- 3 + 4 testa2 = 1 -! add3 1 !- 3 + 4 testa3 = 1 - 2 -! add4 1 5 !- 3 * 4 -- 17 = (1-2) + (1+5) + (3*4) testa4 = 1 - 2 -! sub3 1 !- 3 * 4 -- -12 = (1-2) + (1) - 12
