프로그래밍/프로그래밍언어

[4장 고차함수] 4.5 합성 함수

Hithero 2021. 12. 6. 15:15

합성 함수 : 수학에서 합성함수와 같다. 함수를 매개변수로 받고, 함수를 반환할 수 있는 고차 함수를 이용해서 두 개의 함수를 결합하는 것.

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
반응형