LoginSignup
5
1

More than 3 years have passed since last update.

Haskell ListモナドのBindについて

Posted at

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

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1