오늘은 코딩 블로그에서 함수 합성 관점에서의 모나드 법칙에 대해 알아보려고 합니다. 모나드는 함수형 프로그래밍에서 굉장히 중요한 개념이며, 특히 코틀린에서 유용하게 사용됩니다. 모나드의 핵심 법칙들을 이해하는 것은 코드의 표현력을 향상시키고, 더욱 세련된 프로그래밍 패러다임을 구사할 수 있게 합니다.
모나드의 핵심 법칙들
모나드 법칙에는 주로 항등 법칙과 결합 법칙이 있습니다. 이 법칙들을 직관적으로 이해하기 위해, 함수 합성의 성질을 이용해 설명해 보겠습니다.
항등 법칙
항등 법칙은 다음과 같이 두 가지 형태로 나타낼 수 있습니다.
identity compose f = f
f compose identity = f
여기서 identity 함수는 입력된 값을 변경 없이 그대로 반환하는 함수입니다. 이 법칙은 어떤 함수 f를 identity 함수와 합성해도, 항상 원래의 함수 f를 반환한다는 것을 의미합니다.
결합 법칙
결합 법칙은 함수의 합성 순서가 결과에 영향을 주지 않는다는 법칙입니다.
(f compose g) compose h = f compose (g compose h)
함수 f, g, h를 합성하는 순서에 관계없이 결과가 동일함을 의미합니다. 이는 기초 수학에서의 함수 합성 법칙과 동일합니다.
모나드 합성의 예시
모나드를 함수 합성과 결합하여 더 강력한 표현력을 얻을 수 있습니다. 예를 들어, 모나드 함수는 어떤 값 x를 받아서 모나드를 반환합니다. pure 함수는 모나드의 항등 함수로, 입력된 값을 변경 없이 그대로 모나드에 담아 반환합니다.
infix fun <F, G, R> ((F) -> Monad).compose(g: (G) -> Monad): (G) -> Monad {
return { gInput: G -> g(gInput) flatMap this }
}
여기서 flatMap을 사용하여 두 모나드 함수를 합성합니다. 이렇게 정의된 모나드 합성 함수를 사용해 보겠습니다.
fun main(args: Array) {
val f = { a: Int -> Just(a \* 2) }
val g = { a: Int -> Just(a + 1) }
val h = { a: Int -> Just(a \* 10) }
val pure = { a: Int -> Just(a) }
println((pure compose f)(10) == f(10)) // "true" 출력
println((f compose pure)(10) == f(10)) // "true" 출력
println(((f compose g) compose h)(10) == (f compose (g compose h))(10)) // "true" 출력
}
이 예시를 통해 모나드가 항등 법칙과 결합 법칙을 만족한다는 것을 확인할 수 있습니다. 함수 합성의 관점에서 모나드를 바라보면, 이러한 법칙들을 더 직관적으로 이해할 수 있게 됩니다.
'함수형 프로그래밍' 카테고리의 다른 글
모나드(monad)의 법칙 (0) | 2024.03.09 |
---|---|
메이비 모나드를 활용한 안전한 널 처리 (함수형 프로그래밍) (0) | 2024.03.03 |
메이비 모나드와 리스트 모나드 (함수형 프로그래밍) (0) | 2024.03.02 |