함수형 프로그래밍

함수 합성 관점에서의 모나드 법칙

태인킴 2024. 3. 10. 21:04
반응형

오늘은 코딩 블로그에서 함수 합성 관점에서의 모나드 법칙에 대해 알아보려고 합니다. 모나드는 함수형 프로그래밍에서 굉장히 중요한 개념이며, 특히 코틀린에서 유용하게 사용됩니다. 모나드의 핵심 법칙들을 이해하는 것은 코드의 표현력을 향상시키고, 더욱 세련된 프로그래밍 패러다임을 구사할 수 있게 합니다.

모나드의 법칙

 

모나드(monad)의 법칙

모나드의 이해와 기본 법칙 함수형 프로그래밍은 순수 함수와 불변성, 고차 함수 등의 개념을 활용하여 보다 명확하고 예측 가능한 코드를 작성하는 것을 목표로 합니다. 이러한 패러다임에서

coding-food-court.tistory.com

 

모나드의 핵심 법칙들

모나드 법칙에는 주로 항등 법칙과 결합 법칙이 있습니다. 이 법칙들을 직관적으로 이해하기 위해, 함수 합성의 성질을 이용해 설명해 보겠습니다.

 

항등 법칙

항등 법칙은 다음과 같이 두 가지 형태로 나타낼 수 있습니다.

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" 출력
}  

이 예시를 통해 모나드가 항등 법칙과 결합 법칙을 만족한다는 것을 확인할 수 있습니다. 함수 합성의 관점에서 모나드를 바라보면, 이러한 법칙들을 더 직관적으로 이해할 수 있게 됩니다.

 

반응형