# Infix expressions

### From HaskellWiki

(Difference between revisions)

BrettGiles (Talk | contribs) m (Infix Expressions moved to Infix expressions) |
BrettGiles (Talk | contribs) (Reformatting) |
||

Line 1: | Line 1: | ||

− | + | ==Disclaimer== | |

− | WORK IN PROGRESS | + | This is a '''WORK IN PROGRESS''', transcribed from an email log on haskell-prime@haskell.org. |

− | From: dons@cse.unsw.edu.au (Donald Bruce Stewart) | + | ==Mail info== |

− | To: Simon Peyton-Jones <simonpj@microsoft.com> | + | The original header posted here: |

− | Date: Wed, 15 Mar 2006 23:25:34 +1100 | + | From: dons@cse.unsw.edu.au (Donald Bruce Stewart) |

− | Cc: haskell-prime@haskell.org, oleg@pobox.com | + | To: Simon Peyton-Jones <simonpj@microsoft.com> |

− | Subject: Re: Infix expressions | + | 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: | |

− | + | [http://www.haskell.org/pipermail/haskell-cafe/2002-July/003215.html haskell-cafe message] | |

− | + | ||

+ | ==The solution== | ||

+ | In Haskell we write <hask>`f`</hask> 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. | ||

+ | <haskell> | ||

+ | xs `zipWith (+)` ys | ||

+ | </haskell> | ||

− | + | 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: | |

− | + | <haskell> | |

− | + | infixr 0 -:, :- | |

− | + | data Infix f y = f :- y | |

− | + | x -:f:- y = x `f` y | |

− | + | main = print $ [1,2,3] -: zipWith (+) :- [4,5,6] | |

− | + | </haskell> | |

− | + | ||

− | + | For completeness, here's the `dual': | |

− | + | <haskell> | |

− | + | infixr 5 -! | |

− | + | (-!) = flip ($) | |

− | + | infixr 5 !- | |

− | + | (!-) = ($) | |

− | + | ||

− | + | add2 x y = x + y | |

− | + | add3 x y z = x + y + z | |

− | + | add4 x y z u = x + y + z + u | |

− | + | ||

− | + | testa1 = 1 -! add2 !- 3 + 4 | |

− | + | testa2 = 1 -! add3 1 !- 3 + 4 | |

− | + | testa3 = 1 - 2 -! add4 1 5 !- 3 * 4 | |

− | + | </haskell> | |

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | > | + | |

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | > | + | |

− | + | ||

− | + | ||

− | > | + | |

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | |||

− | |||

[[Category:Idioms]] | [[Category:Idioms]] |

## Revision as of 03:01, 21 March 2006

## 1 Disclaimer

This is a **WORK IN PROGRESS**, transcribed from an email log on haskell-prime@haskell.org.

## 2 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

## 3 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':

infixr 5 -! (-!) = flip ($) infixr 5 !- (!-) = ($) add2 x y = x + y add3 x y z = x + y + z add4 x y z u = x + y + z + u testa1 = 1 -! add2 !- 3 + 4 testa2 = 1 -! add3 1 !- 3 + 4 testa3 = 1 - 2 -! add4 1 5 !- 3 * 4