SAFE 스텍을 보면 아래와 같이 Model이 정의되어 있다.

Counter가 뭔가 싶어서 찾아보니 검색해보니

{ Value: int } 라는 레코드였다.
https://docs.microsoft.com/ko-kr/dotnet/fsharp/language-reference/records
레코드 - F#
레코드가 명명 F# 된 값의 단순 집계를 나타내는 방법, 선택적으로 멤버를 사용 하는 방법에 대해 알아봅니다.
docs.microsoft.com
근데... 음? { Counter: Counter option } 에서 저 option은 뭔가 싶어 찾아보았다.

즉 OCaml, Scala, F# 에서는 Option이라 부르고
Haskell 에서는 Maybe라고 부르는 그것이다.
아주 유명한 글인 그림으로 보는 Functors, Applicatives, Monads에 아주 잘 나와있다. 여기에 Maybe도 설명이 되어 있으니 보면 이해하기 쉽다.
https://netpyoung.github.io/external/functors_applicatives_and_monads_in_pictures/
Functors, Applicatives, And Monads In Pictures
Functors, Applicatives, And Monads In Pictures egonSchiele blog twitter Haskell, Ruby에 관심이 많으며, 그림에도 소질이 있어 보인다. original site link 여기, 단순한 값(value)이 있습니다. 그리고, 우리는 이 값에 함수(f
netpyoung.github.io
F#에서의 정의는 이렇게 되어있다.

여기서 타입스크립트 유저로써 <'T>가 무엇인가? 왜 '가 붙는건가 싶어서 찾아보니
https://docs.microsoft.com/ko-kr/dotnet/fsharp/language-reference/generics/
제네릭 - F#
코드를 반복 하지 F# 않고 다양 한 형식에서 작동 하는 코드를 작성할 수 있는 제네릭 함수 및 형식을 사용 하는 방법에 대해 알아봅니다.
docs.microsoft.com
명시적 제네릭을 <'T> 처럼 사용한다고 되어있다. 그래서 에디터에서 테스트를 해보니

makeList1와 makeList2 둘 다 타입이 같게 나온다.
위의 makeList1은 암시적인 타입으로써 언어적 추론이 들어간 것 같고
makeList2는 명시적으로 제네릭 타입을 명시해준 것이다.
헌데 문제는 여기서부터 시작되었다.
레코드 공식 문서에서도 { Counter: Counter option } 처럼 두개의 타입? 을 지정하는 것 처럼 사용하는 예가 안나와 있는데 도대체 이것은 도대체 무엇인가. 가관인건 그 밑에 더 있다.

init 함수의 타입으로 Model 타입과 Cmd<Msg> 를 곱한?? 타입을 반환 타입으로 선언이 되어있기 때문이다.
그런데 아까 makeList 함수를 만들어보다보니

이렇게 만들었을때 'a * 'a -> 'a list로 타입이 명시되는 것을 보아하니....
아하 () 안에 들어가는 튜플이였다.! *로도 표시하는 것 같다. (귀찮아서 문서 안읽고씀)
https://docs.microsoft.com/ko-kr/dotnet/fsharp/language-reference/tuples
튜플 - F#
다른 형식의 명명 F# 되지 않은 정렬 된 값의 그룹인 튜플에 대해 알아봅니다.
docs.microsoft.com
이러면 레코드 안의 Counter는 option에서 Counter 타입을 랩핑하는 타입이 된다.

REPL 에서 테스트를 해보았다.

'개발 > F#' 카테고리의 다른 글
SAFE - Client.fs - 1: 모듈 (0) | 2020.06.22 |
---|---|
SAFE Stack (0) | 2020.06.13 |
fable-elmish Startup (0) | 2020.06.10 |
F# Start up (0) | 2020.06.10 |