Grokking Functional Programming - 2부 7장
7 유형으로서의 요구사항
이 장에서는 다음을 수행하는 방법을 배웁니다.
- 오류를 최소화하기 위해 불변 데이터 모델링
- 불변 데이터로 요구 사항 모델링
- 컴파일러를 사용하여 요구 사항에서 문제 찾기
- 논리가 항상 유효한 데이터에서 실행되는지 확인하십시오.
재미있는 점은 그것들이 모두 String 및 Int 와 같은 기본 유형을 사용하여 실제 세계의 더 복잡한 비즈니스 엔터티 및 관계를 모델링 하는 것에서 비롯 되었다는 것입니다.
위의 세 가지 요구 사항 중에서 처음 두 개는 행동 요구 사항 이고 마지막 하나는 데이터 요구 사항 입니다. 지금까지 동작(함수)에 중점을 두었고 데이터 요구 사항을 간단한 유형( String s, Int s, Boolean s)으로 모델링했습니다. 우리는 이 접근 방식으로 시작하여 행동과 데이터 모두에 더 안전한 함수형 프로그래밍 기술을 사용하도록 빠르게 전환할 것입니다.
Option의 비교하는 고차함수 forall, exist
forall 은 주어진 Option 내부의 요소 ( Option 이 Some 인 경우)가 익명 함수로 전달된 조건을 만족하거나 Option 내부에 요소가 없는 경우 (즉, None 인 경우) true 를 반환
exist는 none인 경우 false를 반환

두 매개변수가 연도 단위로 기간을 나타내는 단일 엔터티로 함께 결합됩니다. 끝은 여전히 이 값이 없을 수 있음( None )을 전달하는 Option 으로 표시되어 이러한 Period 인스턴스를 개방형으로 만듭니다.
FP에서는 합계 유형 의 작업입니다 . Scala에서는 enum 으로 인코딩됩니다 .
특정 아티스트가 활동한 기간을 연 단위로 모델링하고 싶었습니다. 지금까지 찾은 두 가지 옵션이 있습니다. 아티스트가 여전히 활동 중일 수 있으며 기간이 제한되어 있거나( end = None ) 아티스트가 더 이상 활동하지 않고 고정된 기간이 있습니다( end = Some(endYear) ). .
우리가 방금 쓴 것을 눈치채셨나요? 두 가지 옵션 이 있습니다 . 동일한 아티스트 에 대해 함께 사용할 수 없으며 유일하게 가능한 값입니다. 그것은 우리가 유한한 가능성을 모델링했을 때와 정확히 같은 경우입니다. 합계 유형을 다시 사용해야 합니다 !
enum YearsActive {
case StillActive(since: Int)
case ActiveBetween(start: Int, end: Int)
}
제품 유형 + 합계 유형 = 대수 데이터 유형(ADT)
패턴 일치 ( java 14인가 17에서 추가된 기능인데, 함수형 데이터 모델링을 더 강력하게 해주는 것이라고 지금 이해한다. )
ADT, 패턴 매칭, 뉴타입 !