Elm의 사용자 정의 타입은 정해진 개수의 이름 있는 경우를 나타내요. 각 값은 그 이름 있는 경우 중 정확히 하나에 대응해요.
사용자 정의 타입은 type 키워드로 정의하고, 필요한 문법도 아주 적어요. Elm 프로그래밍에서 가장 중요한 기법 중 하나로, 코드에서 가능한 값이 실생활에서 유효한 값과 정확히 일치하도록 만드는 데 쓰여요. 덕분에 잘못된 데이터가 끼어들 여지가 없고, 불가능한 상태를 코드로 표현할 수 없게 만들어요.
type Season
= Spring
| Summer
| Autumn
| Winter
사용자 정의 타입의 각 경우에는 선택적으로 데이터를 함께 붙일 수 있고, 경우마다 서로 다른 타입의 데이터를 가질 수 있어요. 어떤 경우에도 데이터가 붙어 있지 않다면, 이 판별 합집합은 다른 언어에서 흔히 열거형(enum)이라고 부르는 것과 비슷해요.
type FlexibleNumber
= Integer Int
| Float Float
| Invalid
특정 경우의 값을 만들 때는 그 이름(Spring)을 그대로 쓰면 돼요. 이름이 같은 모듈 안에 정의되어 있거나 import SeasonModule exposing (Season(..)) 형태의 문법으로 가져왔을 때 그렇게 해요. import SeasonModule exposing (Season) 형태로 가져왔다면 완전히 한정된 이름(Season.Spring)을 써요.
integerTwo = Integer 2
invalid = FlexibleNumber.Invalid
사용자 정의 타입은 Elm의 모든 것과 마찬가지로 _구조적 동등성_을 가져요. 즉, 같은 경우이고 같은 (선택적) 데이터를 가진 두 값은 서로 같아요.
사용자 정의 타입을 다룰 때 가장 권장되는 방법은 패턴 매칭이에요:
let describe flexibleNumber =
case flexibleNumber of
Integer i ->
"Integer: " ++ fromInt(i)
Float f ->
"Float: " ++ fromFloat(f)
Invalid ->
"Invalid"
이 연습 문제는 발렌타인데이를 배경으로 해요. 함께 즐거운 일을 하려고 파트너와 계획을 세우는 중이에요.
파트너는 아이디어가 아주 많아요. 그래서 함께 할 활동을 정하기 위해, 이제 그 아이디어들을 평가해 달라고 해요.
파트너가 제안한 아이디어는 다음과 같아요:
발렌타인데이 활동을 고르는 데 도움이 될 여섯 개의 과제가 있어요.
파트너가 제안한 각 아이디어에 대해 예, 아니요, 어쩌면 중 하나로 답해요.
이런 선택지를 다음 세 가지 케이스로 나타내는 Approval 사용자 정의 타입을 정의해요: Yes, No, Maybe.
파트너는 레스토랑 두 곳을 골랐어요. 하나는 한국 요리를, 다른 하나는 터키 요리를 하는 곳이에요.
이 요리 종류를 다음 두 가지 케이스로 나타내는 Cuisine 사용자 정의 타입을 정의해요: Korean, Turkish.
고를 수 있는 영화가 정말 많아요. 그래서 선택의 폭을 좁히려고 파트너는 장르도 함께 알려 줬어요.
다음 장르를 케이스로 나타내는 Genre 사용자 정의 타입을 정의해요: Crime, Horror, Romance, Thriller.
앞서 말했듯이, 파트너는 보드게임 하기, 느긋하게 쉬기, 영화 보기, 레스토랑에 가기 이렇게 다섯 가지 서로 다른 활동을 떠올렸어요.
이런 활동 유형을 나타내는 Activity 사용자 정의 타입을 정의해요:
BoardGame: 연관 데이터가 없어요.Chill: 연관 데이터가 없어요.Movie: Genre를 연관 데이터로 가지고 있어요.Restaurant: Cuisine을 연관 데이터로 가지고 있어요.드디어 파트너의 아이디어를 평가할 준비가 됐어요. 파트너의 아이디어에 대한 생각은 다음과 같아요:
위에 적은 대로 Activity 값을 받아 Approval을 반환하는 rateActivity 함수를 구현해요:
rateActivity (Restaurant Turkish)
-- => Maybe
Exercism에 가입하고 Elm 트랙을 개념 28개연습 문제 110개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.