Kotlin高階関数(Higher-Order Functions)

概要

高階関数(Higher-Order functions)は、関数型プログラミングでよく出てくる概念である。

次のいずれか1つ以上を満たすと、高階関数と呼ばれる。

  • 1つ以上の関数を引数として受け取る。
  • 関数を結果として返す。

これは、第一級関数(First-class Function)が成立する3条件のうち2つを満たすものであり、これを満たさない他のすべての関数は一次関数(first-order function)と呼ばれる。

つまり、関数を作る関数だと言える。

代表的な高階関数には、mapfilterreducelambdaなどがある。

高階関数

次の例は、関数を引数として受け取り、関数を結果として返す。

fun returnParamFunc(func: () -> String): () -> String {
    return func
}

fun main() {
    val hello: () -> String = { "Hello world!" }
    
    val returned = returnParamFunc(hello)
    print("${returned()}")
}

Output:

Hello world!

上の例のreturnParamFunc関数は、引数としてhelloを受け取り、再び関数を返している。この返された関数は"Hello world!"を出力した。

引数と戻り値の型

fun returnParamFunc(func: () -> String): () -> String {
    return func
}

関数を引数として渡すときは、関数の変数名の後ろに: () -> Stringのように関数の型を明示する必要がある。

Intを引数として受け取り、Stringを返す関数は(Int) -> Stringのように書く。->の左側の括弧内の型((Int))は引数であり、->の右側の型(String)は戻り値の型を意味する。

引数としてIntを2つ渡すなら、(Int, Int) -> Stringのように書く。さらに多くの引数を渡す必要がある場合は、引数を追加すればよい。引数がない場合は、() -> Stringのように空の括弧だけを書く。

戻り値がない場合は、(Int, Int) -> UnitのようにUnitを入れればよい。

参考