Haskellerへの道 #4 - 高階関数

Last Edited: 6/15/2024

このブログ記事では、高階関数や無名関数といった、Haskellにおいて重要な概念を紹介します。

Haskell & Higher Order

高階関数

前に少し触れたように、Haskellでは関数が値と同じように扱われます。つまり、関数は他の高階関数の引数として渡すことができます。

app:: (a -> b) -> a -> b
app f x = f x

上記の関数 app は関数 f と値 x を入力として取り、関数 fx に適用します。これはHaskellで以下のようなことができることを意味します。

addOne x = x + 1
app addOne 3 --- Output 4

これが一見あまり役に立たない機能に見えるかもしれませんが、非常に便利です。

無名関数

addOne のような単純な操作を行う関数を見ると、すべての関数に名前を付けて適切に定義する必要があるのかと考えるかもしれません。 幸運なことに、Haskellには無名関数があり、次のように構文を簡素化できます。

(\<args> -> <expr>)
--- <args>: 無名関数の引数/入力
--- <expr>: 無名関数の式/操作
 
--- 例
(\ x y z -> x + y + z) 1 2 3 --- Output: 6

無名関数を使用することで、Haskellで最も便利な高階関数の2つを構築できます。

マップ、フィルター

次の関数、mapfilter は非常に便利なので、どのように動作するかを理解し覚えておくべきです。

--- マップ (リストのすべての要素に操作を実行)
map::(a -> b) -> [a] -> [b]
map (\x -> x + 1) [1,2,3,4,5] --- Output: [2,3,4,5,6]
 
--- フィルター (条件を満たさない要素を削除)
filter::(a->Bool) -> [a] -> [a]
filter (\x -> x > 2) [1,2,3,4,5] --- Output: [3,4,5]

クイズ

この記事では、学習した内容を確認するためのクイズを設けます。記事のメイン部分を読んだ後に、ぜひ自分で問題を解いてみることを強くお勧めします。各問題をクリックすると答えが表示されます。

リソース