前回の続き
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]
今回はカリー化と部分適用、ラムダ式まで。