이 시리즈는 "스칼라로 배우는 함수형 프로그래밍"을 TypeScript로 실습한 내용을 정리하고 있습니다
참조에 투명한 표현식: 문맥에 의존하지 않으며 지역적으로 추론 가능
참조에 불투명한 표현식: 문맥에 의존적이고 전역적인 추론이 필요
예외는 참조 투명성을 위반하고 문맥 의존성을 도입한다. 치환 모형을 사용할 수 없고 코드의 흐름이 혼란스러워진다.
함수의 타입만 보고서는 예외 발생 여부를 알 수 없기 때문에 형식에 안전하지 않다.
예외를 던지는 대신 예외적인 조건이 발생했음을 뜻하는 값을 돌려준다. 오류처리와 전파에 대한 공통 패턴들을 고차 함수를 이용해서 캡슐화한다. 이렇게 하면 형식에 완전히 안전하며 오류 처리 논리의 통합과 중앙집중화를 유지할 수 있다.
부분 함수(partial function): 일부 입력에 대해서는 출력 값이 정의되지 않는 함수
특정 계산을 할 수 없는 경우 null이나 특수 값(0.0, -1등)을 리턴하는 함수를 떠올려 볼 수 있겠다.
그러나 이런 접근 방법은 여러가지 문제점을 안고 있다.
다른 대안으로는 함수가 입력을 처리할 수 없을때 무엇을 해야할지를 인수로 받을수도 있다. 그러나 함수 호출자가 내부 구현을 알고 있어야 하고, 그런 경우에도 항상 어떤 결과값을 함수의 출력 형식으로 돌려주어야 한다는 단점이 있다.
함수가 답을 내지 못한다는 점은 반환 형식으로 통해서 명시적으로 표현함으로서 오류 처리 전략을 호출자에게 미룰 수 있다. 계산이 가능한 경우는 Some, 불가능한 경우에는 None으로 표현되는 Option을 도입한다.
계산이 불가능한 경우가 있다는 점이 출력 형식에 반영 되어 있으며, 이 경우 정해진 출력 형식의 값을 돌려주는 완전 함수(total function)으로 만들 수 있다.
https://github.com/JsonKim/fpinscala-with-typescript/commit/1e930e57216edc143345161b9706d642e3f0cdd6