Haskell-高階関数
高階関数(higher-order function)とは
高階関数とは、引数として関数を受け取る、または返り値として関数を返すような関数のことです。
高階関数は主に関数型言語で多用される機能ですが、手続き型言語でも同様の機能を実現させることができます。
例えば、C言語の関数ポインタが該当します。
引数に関数を受け取る関数
高階関数サンプル
funcは「整数を引数として受け取り、整数を返す関数f」を引数として受け取り、引数の関数に対して「2を代入した結果を返す」高階関数です。
increaseは1を加算する関数であり、decreaseは1を減算する関数です。
funcに対してincrease(またはdecrease)を引数として渡すと、計算結果の整数を返します。
$ cat high_func.hs
#!/usr/bin/env runghc
func::(Int->Int)->Int
func f = (f 2)
increase x = x + 1
decrease x = x - 1
main = print(func increase)
$ ./high_func.hs
3
関数を戻り値とする関数
無名関数を用いて、関数を返り値として返す関数を定義することが出来ます。
高階関数サンプル
funcは2つの関数を引数として受け取り、関数を返す高階関数です。
doubleは2倍にする関数であり、tripleは3倍にする関数です。
funcに対してdoubleとtripleを引数として渡した後、戻り値となった関数に整数5を引数で渡すとdoubleとtripleを実行した計算結果が返ります。
$ cat high_func.hs
#!/usr/bin/env runghc
func argf1 argf2 = \ x -> argf2(argf1(x))
double x = x * 2
triple x = x * 3
main = print((func double triple) 5)
$ ./high_func.hs
30
関数合成(function composition)
Haskellでは「.」を用いると複数の関数を合成し、それぞれの関数を順番に適用する新しい関数を作成できます。
関数を戻り値とする関数を以下のように関数合成して作成することが可能です。
$ cat compose.hs
#!/usr/bin/env runghc
double x = x * 2
triple x = x * 3
main = print((double . triple) 5)
$ ./compose.hs
30