Haskell を使ってみる 9 (高階関数1)

前回の続き

Haskell を使ってみる 8 (再帰) - kntmr-blog

引数に取ったり返り値として返せる関数を高階関数と呼ぶ。

カリー化関数

Haskell のすべての関数は引数を1つだけ取る。複数の引数を受け取るような関数はカリー化されている。関数を本来より少ない引数で呼び出すことを部分適用と呼ぶ。

Prelude> :t max
max :: Ord a => a -> a -> a -- a 型の値を引数に取る関数で、「a 型の値を引数に取って a 型の値を返す関数」を返す

これは、max :: Ord a => a -> (a -> a) と同義。

中置関数はセクションを使って部分適用する。

divideByTen :: (Floating a) => a -> a
divideByTen = (/10) -- 片側に値を置いて括弧で囲む

*Main> divideByTen 200
20.0

高階プログラミング

引数に関数を取ったり返り値として関数を返す関数の例。

 applyTwice :: (a -> a) -> a -> a -- 「a 型の引数を受け取り a 型を返す関数」を引数に取る
 applyTwice f x = f (f x)

*Main> applyTwice (+2) 10
14
*Main> applyTwice ("Hello " ++) "Haskell"
"Hello Hello Haskell"

ラムダ式

1回だけ必要な関数を作るときに使う無名関数をラムダ式と呼ぶ。主に高階関数に渡す関数を作るときに使われる。ラムダ式を宣言する場合は \ を使う。

Prelude> map (+1) [1,2,3,4] -- 部分適用
[2,3,4,5]
Prelude> map (\x -> x + 1) [1,2,3,4] -- ラムダ式
[2,3,4,5]

今回はカリー化と部分適用、ラムダ式まで。