Haskellでfilter関数を使用してリストから特定の条件を満たす要素のみ抽出する方法を解説します。
Contents
filter関数によるデータ抽出
filter
関数は、関数とリストを受け取って、リストから特定の条件を満たす要素のみ抽出する関数です。
このように引数に関数を受け取る関数は、高階関数と言います。高階関数の概要については「高階関数の基本」でまとめているので参考にしてください。filter関数は高階関数の中でも代表的な関数であり、関数型プログラミングにおいて中心的な関数の一つです。
本記事では、filter
関数を使用してリストから特定の条件を満たす要素のみ抽出する方法を紹介します。
filter関数の基本的な使い方
filter関数の型シグネチャとしては、以下のようになっています。
filter :: (a -> Bool) -> [a] -> [a]
上記の型シグネチャの意味は「(a -> Bool)
:a
型を引数として受け取り、Boolを返却する関数」と「[a]
:a
型のリスト」の2つの引数を受け取って、「[a]
:a
型のリスト」を返却する関数ということを意味しています。
簡単に言うと、filter
関数は第1引数で受け取った判定の関数を使用し、第2引数のリストから関数の判定でTrue
になる要素のみ抽出したリストを返却します。第1引数で指定する関数は、Bool
を返却するような関数である必要があります。
具体的な使用例を見ていただくとイメージがつかめると思いますので、以降でいくつかの使用例を使いながらfilter関数の使い方を説明します。
型シグネチャの基本については「型シグネチャと型変数の基本」でまとめているので参考にしてください。
filter関数の使用例
ここではfilter関数の簡単な使用例を使ってイメージをつかんでもらいたいと思います。以下は説明のための簡単な例です。引数に渡す関数を変更することで様々な抽出ができますので、色々と試してみてください。
特定の数値条件を満たす要素の抽出
特定の数値条件を満たすような抽出の例を見てみましょう。5
よりも大きい数値のみ抽出する場合には、filter
関数を使用して以下のようにします。
-- 5よりも大きい数値のみ抽出する
valuesOver5 :: [Int]
valuesOver5 = filter (> 5) [1, 4, 7, 2, 8, 9, 3, 10, 5, 6]
【実行結果】
ghci> valuesOver5
[7,8,9,10,6]
上記では、5
より大きいことを判定する関数(> 5)
を、受け取ったリストに対して適用して条件に一致(True
)する要素を含むリストを返却します。結果としては、5より大きい値のみ含むリストになっていることが分かります。
偶数のみ抽出する
リストから偶数のみ抽出する例を見てみましょう。偶数を抽出する際には、even
関数を使用します。
-- 偶数のみ抽出する
valuesEven :: [Int]
valuesEven = filter even [1, 4, 7, 2, 8, 9, 3, 10, 5, 6]
【実行結果】
ghci> valuesEven
[4,2,8,10,6]
上記のように、Haskellに標準で用意されているeven
関数を使っても要素の抽出をすることが可能です。結果を見ると偶数のみ抽出されたリストになっていることが分かります。
文字列のリストから特定の文字を含む要素だけを抽出する
上記では数値の例を見てきましたが、もちろん文字列のリストに対してもフィルタが可能です。例えば、リスト内の文字列から特定の文字を含むものだけを抽出する例を考えます。リスト内に文字を含むかどうかは、elem
関数を使用して以下のように指定します。
-- 文字列のリストから特定の文字を含む要素だけを抽出する
strsElemA :: [String]
strsElemA = filter (elem 'a') ["apple", "banana", "cherry", "pine", "orange"]
【実行結果】
ghci> strsElemA
["apple","banana","orange"]
上記結果では、文字列(String
)を含むリストから指定した要素'a'
を含むような要素のみを抽出しています。
上記で見てきたようにfilter
関数を使用すると、様々なリストから特定の条件に一致した要素を抽出することが可能になります。
まとめ
Haskellでfilter関数を使用してリストから特定の条件を満たす要素のみ抽出する方法を解説しました。
filter
関数は、関数とリストを受け取って、リストから特定の条件を満たす要素のみ抽出する関数で、関数型プログラミングにおいて中心的な高階関数の一つです。簡単な例を用いてfilter
関数の使用方法を紹介しています。
filter関数は非常に基本的で中心的な高階関数なので、ぜひ使い方をしっかりと覚えてもらいたいと思います。