Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

series/monad-and-functional-architecture-part-3/ #6

Open
utterances-bot opened this issue Jun 7, 2021 · 4 comments
Open

series/monad-and-functional-architecture-part-3/ #6

utterances-bot opened this issue Jun 7, 2021 · 4 comments

Comments

@utterances-bot
Copy link

모나드와 함수형 아키텍처 3장. 모나드 - Burt.K

https://blog.burt.pe.kr/series/monad-and-functional-architecture-part-3/

Copy link

rjcnd105 commented Jun 7, 2021

정말 좋은 글이에요 닫혔던 눈 하나가 뜬 것 같아요.
감사합니다!

Copy link
Owner

skyfe79 commented Jul 18, 2021

@rjcnd105 힘이 되는 말씀 주셔서 감사합니다! 😊

Copy link

kim3339 commented May 19, 2022

모나드는 마치 외부 변수에 의해 side-effect가 되는 것을 모두 명시적으로 인자로 넘겨주어서 side-effect가 되지 않게 만드는 것 같네요. Optional은 "파일이 있는지 없는지 여부"라는 변수를 인자로 넘겨주어서 side-effect가 되지 않고 하스켈의 Monad IO는 "외부 입출력 모듈"자체를 변수로 넘겨주는 꼴이 되어서 side-effect가 되지 않는 거네요

Copy link
Owner

skyfe79 commented May 22, 2022

@kim3339 안녕하세요. 댓글 주셔서 감사합니다 😊 순수함수로 이루어진 수학의 함수 합성처럼 모나드는 사이드 이펙트가 반드시 필요한 컴퓨터 프로그래밍의 함수를 수학의 순수 함수처럼 합성 가능토록 해 주는 타입입니다. 사이드 이펙트를 관리하며 합성을 통한 확장 또는 흐름을 만들기 위해서 map 과 flatMap을 제공하는 타입입니다.

참고로 수학 함수와 프로그래밍 함수의 가장 큰 차이는 사이드 이펙트입니다.

예를 들어, 수학 함수는 데이터를 정의하면 됩니다. x + 1 함수 연산을 위해서 조건제시법으로 데이터를 제공할 수 있습니다.

f(x) = x + 1, { x | x는 정수, 0 <= x <= 10 } 

하지만 컴퓨터 프로그래밍의 함수는 다릅니다. 데이터가 로컬 변수에 정의될 수 있지만 그렇지 않고 파일에 있거나 네트워크 요청 응답으로 받아야 하거나 등의 데이터 제공을 위한 작업이 필요합니다.

func f(x: Int) -> Int {
   return x + 1;
}

func fetchData() -> [Int] {
   // 네트워크에서 데이터를 가져와 반환한다.
   ....
   return data;
}

func main() {
   // 수학의 순수함수에서는 정의하고 제시하면 되지만 
   // 컴퓨터 프로그래밍 함수는 파일에서 읽거나 네트워트에서 데이터를 읽어와야 하는 사이드 이펙트가 존재합니다.
   let numbers: [Int] = fetchData();
   // 그리고 우리는 항상 사이트 이펙트가 옳게 처리되었는지 확인하거나 메모리에서 제거해줘야 하는 등의 부가적인 처리도 필요합니다.

   // 그리고 이러한 처리가 모두 옳게 처리되었을 경우에만 우리가 원하는 연산을 할 수 있습니다.(수학의 순수 함수라고 볼 수 있는)
   let results = numbers.map { x in 
      f(x)
    }

    // 그리고 다시 결과를 처리(여기서는 출력)하는 사이드 이펙트를 사용합니다.
   print(results)
}

2장. 프로그래밍 패러다임에서 프로그램 = 데이터 + 로직으로 정의한 내용이 있는데 좀 더 깊게 보면 프로그램 = 사이드이펙트 + 데이터 + 로직 으로 생각할 수도 있습니다. 우리가 작성하는 모든 코드는 크게 사이드 이펙트를 사용하거나 처리하는 코드, 데이터를 정의하거나 제공하는 코드 그리고 주어진 데이터를 사용한 로직 또는 계산 부분으로 나누어 질 수 있습니다. 또 다른 측면으로는 사이드 이펙트를 관리하는 함수, 순수함수 그리고 이 두 개를 잘 섞어서 사용하는 Compose 함수입니다. 위 코드에서 f(x: Int)는 순수함수, fetchData()는 사이드 이펙트를 사용하는 함수, main 함수는 이 둘을 조합하여 원하는 프로그램 로직을 만드는 compose 함수로 나눌 수 있습니다.

컴퓨터 프로그램을 아주 작은 함수로 나누더라도 모든 함수를 순수함수로 나타낼 수 없습니다. 순수함수로 나타낼 수 있는 부분이 오히려 적습니다. 반드시 사이드 이펙트(예: 입,출력)을 사용하는 부분이 있게 마련입니다. 예를 들어 데이터를 준비, 화면에 출력, 파일에 저장, 종이에 출력, 원격 서버에 저장, DB에 읽기, 쓰기 등의 작업이 컴퓨터 프로그램에서는 반드시 필요하게 되죠. 수학의 함수 합성처럼 함수형 프로그래밍에서는 컴퓨터 프로그램을 함수 합성으로 추상화 하는데 사이드 이펙트를 지닌 함수는 그 자체로는 순수 함수가 아니기에 함수 합성에 참여할 수 없으므로 모나드 타입을 적용하여 합수 합성에 참여할 수 있도록 해 줍니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants