Haskellのtransposeの実装を読むと良くわからなかったので、自分用のメモとして残しておきます。
transpose :: [[a]] -> [[a]]
transpose [] = []
transpose ([] : xss) = transpose xss
transpose ((x:xs) : xss) = (x : [h | (h:_) <- xss]) : transpose (xs : [ t | (_:t) <- xss]) -- ?
[h | (h:_ ) <- xss]とあります。一見よさそうに思えるのですが、
xssが空リストの場合はどうなのだろうと疑問に思いました。空リストの場合はheadやtailパターンマッチが適用できないとずっと認識していました。
試しに
>[h | xs <- [[]], let h = head xss ]
>*** Exception: Prelude.head: empty list
となり、自分の想定してた結果となります。
対して
>[h | (h:_) <- [[]]]
>[]
となり??となりました。
種明かし
@waddlawさんのBigmoonのここにそのまま乗っていました。本当にいつもこのサイトにお世話になってます。
Haskell 2010 Language Report の 3.11 List Comprehensionsに書いてるようです。
最後に
Haskellの記事をいつか書こうと思っていたのですが、こんな記事ながら書くことたっせいできました。Haskellは難しく感じますが、やってて非常に楽しい言語なので、バリバリ書けるようになりたいと夢見ながら頑張ります。