Infix expressions: Difference between revisions
BrettGiles (talk | contribs) (Reformatting) |
(Right associativity for the dual solution this time, so infix expressions behave naturally for left-to-right readers.) |
||
Line 1: | Line 1: | ||
==Mail info== | ==Mail info== | ||
The original header posted here: | The original header posted here: | ||
Line 31: | Line 28: | ||
For completeness, here's the `dual': | For completeness, here's the `dual': | ||
<haskell> | <haskell> | ||
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 | |||
</haskell> | </haskell> | ||
[[Category:Idioms]] | [[Category:Idioms]] |
Revision as of 00:28, 23 March 2006
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
The solution
In Haskell we write `f`
in order to infixify the identifier f. In ABC the stuff between backquotes is not limited to an identifier, but any expression may occur there. This would allow one to write e.g.
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