합성 함수 : 수학에서 합성함수와 같다. 함수를 매개변수로 받고, 함수를 반환할 수 있는 고차 함수를 이용해서 두 개의 함수를 결합하는 것.
fun main(args: Array<String>){
println(composed(3))
}
fun composed(i : Int) : addThree(twice(i))
fun addThree(i: Int) = i+3
fun twice(i: Int) = i*2
composed 함수가 합성 함수의 예시이다.
이 함수를 일반화해보자.
fun main(args: Array<String>){
val addThree = { i :Int -> i+3 }
val twice = { i : Int -> i*2 }
val composedFunc = addThree compose twice
println(composedFunc(3)) // 9 출력
}
infix fun <F,G, R> ((F) -> R).compose(g: (G) -> F): (G) -> R {
return { gInput : G -> this(g(gInput)) }
}
infix 는 입력 매개변수를 양쪽으로 받을 수 있도록 한다.( A compose B 처럼) 본래는 A.compse(B)으로 표현한다.
수학에서 합성함수처럼 뒤에서부터 연산을 한다. twice하고, addThree 연산한다.
포인트 프리 스타일 프로그래밍 : 함수 합성을 사용하여 매개변수나 타입 선언 없이 함수를 만드는 방식
val absolute = { i : List<Int> -> i.map { it -> abs(it) } }
val negative = { i : List<Int> -> i.map { it -> -it } }
val minimum = { i: List<Int> -> i.min() }
// 방법 1
minimum(negative(absolute(listOf(3,-1,5,-2,-4,8,14))))
// 방법2 : 함수 합성 이용하기
val composed = minimum compose negative compose absolute
composed(listOf(3,-1,5,-2,-4,8,14))
방법1에서는 List<Int>와 같이 타입선언이나, i : List<Int>와 같이 매개변수 선언을 하였다.
하지만, 방법2 에서 함수를 만들기 위해 타입이나 매개변수에 대한 선언을 하지 않았다. 이 방법을 Point Free Style Programming 이라고 한다.
장점
1. 코드의 가독성을 높이고 간결하게 한다.
2. 간단한 함수들을 조합하여 복잡한 함수를 만들 수 있다. (-> 지나치게 많은 함수들의 합성 : 가독성 해침)
728x90
반응형
'프로그래밍 > 프로그래밍언어' 카테고리의 다른 글
[rust] note: the msvc targets depend on the msvc linker but `link.exe` was not found (0) | 2021.12.22 |
---|---|
[rust] 윈도우에서 러스트 시작해보기 (0) | 2021.12.22 |
[4장 고차함수] 커링함수 - 확장함수 만들기 (0) | 2021.12.03 |
[4장 고차함수] 커링함수 (2) | 2021.12.01 |
[4장 고차함수] 4.3 부분 적용 함수 (0) | 2021.11.30 |