⚙️

リスト内包表記とは?(Haskell)

2022/05/16に公開

この記事ではリスト内包表記について解説します。
リスト内包表記を使えばリストを扱う関数を簡潔に定義できます。

内包表記とは?

内包表記とは元々、数学の集合に関する仕組みです。既存の集合から新たな集合を作るために使われます。 具体例として2の倍数の集合を内包表記で作ります。

{x*2 | x <- [1,2,3,4,5]}

|(パイプ)で挟んだ右側と左側で役割が異なります。右側が既存の集合、左側が新しく作る集合を意味します。

つまり既存の集合:[1,2,3,4,5]から新しい集合を作ることを意味しています。元あった集合xを2倍にするよう指定されていますので、新しい集合としては[2,4,6,8,10]を作ります。

リスト内包表記とは?

既存のリストから新しいリストを作ることができる、リスト作成方法の一つです。 数学の内包表記の仕組みを使って新たなリストを作ることができます。構文はこちらです。

[出力する式 | リスト名 <- [リスト], (条件を追加することも可能)]

|を挟んで、右側が既存のリスト、左側が新しく作るリストです。(必要なら右側には条件を追加で付け加えることができます。)まずは先ほどと同じように、2の倍数の集合をリストで作ってみます。

Prelude> [x*2 | x <- [1..5]]
[2,4,6,8,10]

[1..5]が既存のリスト、x*2が新しく作るリストとなっています。xを2倍するように左側では指定されています。なので新しい集合として[2,4,6,8,10]を作ります。

<-には「〜から取り出す」という意味があります。 ここでは「リスト[1..5]から要素を取り出す」ということを意味します。そして取り出した各要素の値をxが受け取る仕組みとなっています。

条件を追加する場合

では次に、既存の集合へ条件を追加します。条件を追加するには、カンマ,区切りで書きます。他のパートとは別に最後に追加することで、条件を適用することができます。5~15の値の中で、2倍した値が20以上のモノからなるリストを作ってみます。

Prelude> [x*2 | x <- [5..15], x*2 >= 20]
[20,22,24,26,28,30]

カンマで区切ることでたくさんの条件を追加できます。先ほどのリストから22,26を除いてみます。

Prelude> [x*2 | x <- [5..15], x*2 >= 20, x/=22, x/=26]
[20,22,24,26,28,30]

複数のリストを扱う場合

複数のリストも内包表記で扱うことができます。その場合、それらのリストの全ての要素が組み合わされることになります。ここでは2つのリスト(x:[1,2,3]、y:[10,20,30])の全てを要素を掛け算させてみました。

Prelude> [x*y | x <- [1,2,3], y <-[10,20,30]]
[10,20,30,20,40,60,30,60,90]

3×3で全部で9パターンの結果が出ていることに注目して下さい。ここから更に条件も追加できます。

Prelude> [x*y | x <- [1,2,3], y <-[10,20,30], x*y > 50]
[60,30,60,90]

Discussion