On 15/06/06, Stefan Holdermans <

[hidden email]> wrote:

> transpose = foldr (zipWith (:)) (repeat [])

While one-liners like this are very pretty, it's worth thinking about

how they work:

1. (:) takes an element and a list and prepends that element to the list.

2. zipWith (:) takes a list of elements and a list of lists and

prepends each element to its corresponding list.

3. repeat [] is the infinite list [[], [], [], [], ... ], i.e. the

infinite list of empty lists.

4. transpose, therfore, takes the last list in your list-of-lists

input, then prepends each element of it to the empty list. That is, if

the last list in the input was [x1, x2, ..., xn] then it produces

[[x1], [x2], ..., [xn]].

5. Then this is repeated with the penultimate list in the input (say

its elements are y1..yn), giving [[y1, x1], [y2, x2], ..., [yn, xn]]

6. And so on down the input list.

--

-David House,

[hidden email]
_______________________________________________

Haskell-Cafe mailing list

[hidden email]
http://www.haskell.org/mailman/listinfo/haskell-cafe