Posted at

Haskell ListモナドのBindについて

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は難しく感じますが、やってて非常に楽しい言語なので、バリバリ書けるようになりたいと夢見ながら頑張ります。