# Question about typing

**Levent Erkok
**
erkok@cse.ogi.edu

*Thu, 05 Apr 2001 07:54:28 -0700*

Tom Pledger wrote:
>*
*>* Toby Watson writes:
*>* | Intuitively the following scenarios seem to be related, can anyone
*>* | point my in the direction of formal work on this, or give me the
*>* | formal terms I need to search around?
*>* |
*>* | 1. Adding two integers together: Int -> Int -> Int
*>* |
*>* | 2. Adding two lists of Integers together: [Int] -> [Int] -> [Int]
*>*
*>* If you're adding each element of the first list to the element in the
*>* corresponding position in the second list, it's usually called
*>* zipping. The zipWith function in the prelude takes as its parameter a
*>* function of type a->b->c (your scenario 1) and returns a function of
*>* type [a]->[b]->[c] (your scenario 2).
*
Jeff Lewis implemented zip comprehensions in the latest versions of both
GHC and Hugs. This notation provides special syntax to deal with the
second case above nicely.
You can say:
[x + y | x <- [1,2,3,4,5]
| y <- [5,6,7,8]]
to get:
[6,8,10,12]
The shorther list determines the final length (could of course be
infinite.)
It's an extension of the usual syntax, so multiple generators are OK
too:
[x + y | x <- [1,2,3,4,5], z <- [3, 4, 5], (x+z) `mod`2 == 1
| y <- [5,6,7,8], y `mod` 2 == 0]
gives:
[7, 10]
It's a great notation that avoids zipWith's. (You need to start hugs
with -98 and GHC needs -fglasgow-exts for zip comprehensions to be
recognized.)
-Levent.