top page > computer > haskell > web_lecture > for_programmer > list_comprehensions1.html
更新日:
文責: 重城良国

構文: リスト内包表記1

はじめに

リスト内包表記という記法がある。まずは単純な例を見ていくことで考えかたを理解しよう。

構文糖

リスト内包表記はプログラミングという側面から見れば構文糖である。最も単純な例であれば関数mapを使った表記に脱糖されると考えて良い。

集合論

「表記」という側面ではリスト内包表記は集合論における表記を借りてきたものだ。

リストの要素を2倍にする

リスト[2, 3, 5]のすべての要素を2倍にするには

map (* 2) [2, 3, 5]

とすれば良い。仮引数を明示すると

map (\n -> n * 2) [2, 3, 5]

となる。これをリスト内包表記で書くと

[ n * 2 | n <- [2, 3, 5] ]

となる。リストのそれぞれの要素2, 3, 5で順にnを束縛しそれぞれについてn * 2を求める。

% ghci
Prelude> [ n * 2 | n <- [2, 3, 5] ]
[4,6,10]

構文

全体は[]で囲まれる。|で左と右に分けられ左側が結果の値となり右側がリストからの値の取り出しとなる。

[ 結果 | パターン <- リストを返す表現 ]

リストから取り出された値がパターンによって変数を束縛しそれを使って結果が計算される。リストのすべての要素についてこれが行われ結果は再びリストにまとめられる。

脱糖

[ 結果 | パターン <- リスト ]

map (\パターン -> 結果) リスト

のように脱糖される。

まとめ

関数mapの実現する機能である「リストのすべての要素について何かをする」を読みやすく表現できるリスト内包表記について学んだ。リスト内包表記はより複雑なことも実現できる。

「関数concatMapによる関数filterの定義」へもどる 「リスト内包表記2」へ

正当なCSSです! HTML5 Powered with CSS3 / styling, and Semantics