사용자 정의 타입은 Gleam에서 새로운 데이터 타입을 정의하는 방법이에요. 여러 개의 _변형_을 가질 수 있고, 각 변형에는 고유한 이름이 붙어요.
pub type Season {
Spring
Summer
Autumn
Winter
}
사용자 정의 타입의 각 케이스는 선택적으로 데이터를 담을 수 있고, 케이스마다 담을 수 있는 데이터의 타입이 달라도 돼요. 변형이 데이터를 담고 있는 경우를 _레코드_라고 해요.
pub type Number {
SomeInt(Int)
SomeFloat(Float)
Invalid
}
특정 케이스의 값은 추가 데이터가 없으면 이름을 그대로 써서 만들고 (Spring), 데이터가 있으면 함수처럼 호출해서 만들어요 (SomeInt(2)).
let spring = Spring
let integerTwo = SomeInt(2)
사용자 정의 타입은 Gleam의 모든 값과 마찬가지로 _구조적 동등성_을 가져요. 즉, 변형이 같고 데이터도 같은 두 값은 서로 같아요.
Spring == Spring // -> True
Spring == Autumn // -> False
SomeInt(2) == SomeInt(2) // -> True
SomeInt(2) == SomeFloat(2.0) // -> False
사용자 정의 타입의 변형은 case 식으로 패턴 매칭할 수 있어요.
import gleam/int
import gleam/float
pub fn describe(flexible_number: Number) -> String {
case flexible_number {
SomeFloat(f) -> "Float: " <> float.to_string(f)
SomeInt(i) -> "Int: " <> int.to_string(i)
Invalid -> "Neither a float nor an int"
}
}
이 연습 문제에서는 밸런타인데이를 맞아 파트너와 함께 즐거운 일을 하려고 계획하고 있어요. 파트너에게는 아이디어가 아주 많아서, 함께할 활동을 고르기 위해 아이디어를 평가해 달라고 해요.
파트너가 제안한 아이디어는 다음과 같아요:
밸런타인데이 활동을 고르는 데 도움이 될 여섯 가지 과제가 있어요.
파트너가 제안한 각 아이디어에 대해 세 가지 중 하나로 답해요: 네, 아니요, 아마도.
이 선택지들을 다음 세 가지 케이스로 나타내는 Approval 커스텀 타입을 정의해요: Yes, No, Maybe.
파트너는 가능한 레스토랑 두 곳을 골랐어요: 하나는 한국 요리를 바탕으로 하고, 다른 하나는 터키 요리를 바탕으로 해요.
이 요리들을 다음 두 케이스로 나타내는 Cuisine 커스텀 타입을 정의해요: Korean, Turkish.
고를 수 있는 영화가 정말 많아서, 범위를 좁히기 위해 파트너가 장르도 함께 알려줘요.
다음 장르들을 케이스로 나타내는 Genre 커스텀 타입을 정의해요: Crime, Horror, Romance, Thriller.
앞서 말했듯이, 파트너가 다섯 가지 활동을 생각해 냈어요: 보드 게임 하기, 휴식하기, 영화 보기, 레스토랑 가기, 산책하기.
이 활동 유형들을 나타내는 Activity 커스텀 타입을 정의해요:
BoardGame: 연결된 데이터가 없어요.Chill: 연결된 데이터가 없어요.Movie: Genre를 연결된 데이터로 가져요.Restaurant: Cuisine을 연결된 데이터로 가져요.Walk: 걸을 킬로미터 수를 나타내는 Int를 연결된 데이터로 가져요.이제 파트너의 아이디어를 평가할 준비가 됐어요. 각 아이디어에 대한 느낌은 이래요:
위 느낌에 따라 Activity 값을 받아 Approval을 반환하는 rate_activity 함수를 구현해요:
rate_activity(Restaurant(Turkish))
// -> Maybe
Exercism에 가입하고 Gleam 트랙을 개념 33개연습 문제 122개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.