There's no use of head or tail functions. Two list comprehensions equivalent to two applications of mapMaybe, rather than one of mapMaybe and a second of unzip. The whole situation is rather sad; a generalization of the selector thunk trick could in principle plug the leak without hurting performance, but that will require various GHC changes.
On Sun, 23 Aug 2020, David Feuer wrote:
> Data.List.transpose, unfortunately, can potentially leak space. The
> problem is that it walks a list of lists twice: once to get the heads
> and once to get the tails. Depending on the way the result is consumed,
> it's possible that heads or tails that are never used will be retained
> by the garbage collector. I have a fix[*] that probably makes the
> function slower in typical cases, but that plugs the leak. What do y'all
> say?
Your way sounds more correct than using 'head' and 'tail'. I have no
numbers, though.