Функции первого порядка

Функции первого порядка

Функции первого порядка от обычных функций отличаются тем, что могут принимать функции в качестве параметров и возвращать функции. В данных функциях в качестве типа принимаемого аргумента функции указывается сигнатура функции.

Сигнатурой функции является список аргументов и тип возвращаемого значения функции.

Ниже приведён пример объявления функции первого порядка, который принимает два параметра, оба параметра должны быть функциями, первый функция которая не принимает параметров и не должна возвращать значения, вторая функция должна принимать два параметра типа Int и должна вернуть значение также типа Int (целое число), которое затем выводится в консоли:

fun higherOrderFunction(simpleFun: () -> Unit, withArgs: (Int, Int) -> Int) {
    // Вызывается первый параметр в виде функции
    simpleFun()
    // Вызывается второй параметр в виде функции с передачей двух параметров типа Int, чей результат затем выводится в консоль
    println(withArgs(10, 20))
}

Вызов подобной функции осуществляется подобным образом. В качестве кода функции передаются лямбда выражения, которые передаются в виде кода для выполнения.

В примере, функция переданная в качестве первого параметра выводит простой текст в консоль, а вторая функция должна получить два параметра с точки вызова и затем вывести их в консоль через println и вернуть сумму этих двух параметров. В лямбда выражениях последняя строка выполняет роль возврата значения, в данном случае он выглядит как a+b:

higherOrderFunction({
    println("This is function without params")
},
{ a: Int, b: Int -> Int
    println("Params are: a = $a, b = $b")
    a+b
})