On 15/06/06, Stefan Holdermans
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, dmhouse@gmail.com