• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    해결됨

전체적인 질문있습니다..!

19.06.10 21:12 작성 조회수 19

0

삭제된 글입니다

답변 2

·

답변을 작성해보세요.

1

1. 모나드에 대하여

일단 모나드는 많이 생각 안하셔도 됩니다.

저도 모나드에 대해서는 가볍게만 설명한 것이고 깊이 다루지는 않았습니다. 제가 모나드에 대해 아주 깊게 알지 못하기도 하구요. 

클로저, 엘릭서 등의 함수형 프로그래밍 언어에서는 모나드에 대한 개념을 거의 알 필요가 없으며, 언어에서도 책에서도 거의 설명하지 않습니다. 하스켈, 스칼라 등에서는 모나드가 강조됩니다. 보통 동적 타입 언어 혹은 Lisp계열 언어에서는 모나드가 강조되지 않고 정적타입 언어에서 강조됩니다.

동적 타입 언어인 자바스크립트에서 함수형 프로그래밍을 할 때도 클로저나 Lisp 계열의 패러다임으로 함수형 프로그래밍을 바라볼 때는 자바스크립트의 기본 값을 다루는 함수형 프로그래밍을 합니다. 본 강의는 ES6+의 이터러블/이터레이터/제너레이터 프로토콜과 Promise를 주된 값으로 바라보고 Lisp 스타일의 프로그래밍을 합니다. Promise가 배열이나 Promise 등이 모나드의 성질을 띄지만 이것을 꼭 모나드라 말하지도 않고 별로 강조하지 않습니다. 오히려 Promise라는 값 자체의 스펙을 정확히 아는 것에 집중합니다. 

자바스크립트에서도 ADT 식으로 함수형 프로그래밍을 하는 fantasy-land, Ramda.js 등에서는 모나드를 강조합니다. 런타임에서 타입을 체크하기는 하지만요. 혹은 자바스크립트로 컴파일 되는 정적 타입 언어인 PureScript 같은 언어 등에서도 모나드가 강조됩니다. TypeScript위에 ADT를 얹어서 가는 시도도 있습니다.

혹은 RxJS 처럼 Observable 을 중심으로 map, filter, take 등의 오퍼레이터를 만들어서 함수형 리액티브 프로그래밍을 하는데, 여기서도 모나드를 특별히 언급하지 않습니다.

부연이 길었네요.

요지는 저 개인적으로는 동적타입인 자바스크립트에서는 map, filter, take, reduce를 언어로 보고, 잘 추상화된 내장 값들을 기반으로 함수형 프로그래밍을 하는 것이 가장 잘 맞고 어울린다고 생각합니다. 그리고 추가로 비동기 동시성 프로그래밍을 위해 Promise/async/await 프로토콜에 대해 잘 알아야하겠구요. 그 다음에 에러 핸들링을 위해 try/catch,  async/await/try/catch에 대해 잘 알고 활용해야한다고 생각합니다. 해당 언어에 꼭 맞는 방법이기 때문입니다. 

아무리 에러를 내가 다른 방법으로 핸들링하고자 해도 내가 사용해야하는 라이브러리나 프레임워크가 에러를 던집니다. 그런 모든 에러를 항상 모나드로 랩핑하거나 ADT로 랩핑해서 효과를 관리한다는 것도 생각보다 쉽지 않습니다.

언어 클로저나 엘릭서에서도 try catch를 합니다. try catch를 안하는 것이 곧 함수형 프로그래밍은 아닙니다.

2. 에러 핸들링

저는 에러 핸들링은 기본적으로 try catch를 기반으로 합니다. 에러일 필요 없는 로직들은 map, filter, reduce, take를 기반으로 핸들링을 합니다. 

3. 안전한 합성

안전한 합성에 대해서는 '응용편'의 '안전한 합성에 대해'를 참고해주세요. map, filter 등을 사용해서 없을 수 있는 상황을 다룰 수 있습니다.

4. 실행순서에 대해

두 Promise 체인 실행을 순서를 제어하지 않은 상황에서, 뭐가 왜 먼저 로그가 출력되었는지는 큰 의미는 없습니다. 

감사합니다.

 

0

큰돌님의 프로필

큰돌

질문자

2019.06.11

자세한 설명 정말 감사합니다. try catch는 캐바케였군요.. https://jhc9639.blog.me/221505074700?Redirect=Log&from=postView

 

이 책에 보면 try catch를 쓰지 말라고 되어있었거든요 하하하 저는 유인동개발자님의 케이스를 따르겠습니다. 좋은 강의 감사합니다.