순수함수는 값을 반환하기만 하고 다른일은 하지 않아야 한다.
var percent1 = 5
fun applyTax1(a: Int): Int = a / 100 * (100 + percent1)
applyTax1 메서드는 결과가 percent1 값에 따라 달라지기 때문에 순수함수가 아니다.
percent1 을 함수 안에서 단 한번만 사용한다면 이를 암시적 파라미터로 생각해도 문제가 없지만, percent1 값을 여러번 사용한다면 반드시 그 값을 지역 변수에 보관해야 한다.
코틀린은 함수를 데이터처럼 다룰 수 있다. 함수를 일치하는 타임의 참조에 대입할 수 있다.
//fun 함수
fun double(x: Int): Int = x * 2
//함수 타입
val double: (Int) -> Int = { x -> x * 2 }
코틀린은 위처럼 함수가 두 종류가 있다.
fun으로 정의한 함수는 실제로는 함수가 아니라 메서드, 하위 프로그램, 프로시저 등으로 부를 수 있다. fun으로 정의한 함수로 순수 함수를 표현할 수 있지만, 이름 데이터처럼 취급할 수는 없다.
인자를 넘기고 그 인자에 따른 반환 값을 얻는 일만 하는 경우에는 fun으로 정의한 함수를 사용하는 것이 효율 적이다.
한편 함수를 데이터처럼 취급해야 하거나 함수에서 함수를 돌려줘야 하는 경우이거나 변수, 맵 그 밖의 데이터 구조에 함수를 저장해야 하는 경우라면 함수 타입의 식을 사용한다.
커리한 함수는 인자가 하나뿐이며 인자가 하나뿐인 다른 함수를 반환하는 함수이다. 이때 반환하는 함수도 마찬가지로 인자가 하나뿐인 다른 함수를 반환하는 함수일 수 있다. 이런 과정이 결과 값을 반환할 때 까지 반복된다.
val taxRate = 0.09
val addTax = { taxRate: Double ->
{ price: Double ->
price + price * taxRate
}
}
println(addTax(taxRate)(12.0))
fun 함수는 값이 아니기 때문에 반환할 수 없으므로 반환하는 함수는 반드시 함수 값을 사용해야 한다.
[출처] 코틀린을 다루는 기술