트랙
/
Gleam
Gleam
/
연습 문제
/
밸런타인데이
밸런타인데이

밸런타인데이

학습 연습 문제

소개

사용자 정의 타입

사용자 정의 타입은 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"
  }
}

지침

이 연습 문제에서는 밸런타인데이를 맞아 파트너와 함께 즐거운 일을 하려고 계획하고 있어요. 파트너에게는 아이디어가 아주 많아서, 함께할 활동을 고르기 위해 아이디어를 평가해 달라고 해요.

파트너가 제안한 아이디어는 다음과 같아요:

  • 보드 게임 하기
  • 휴식하기
  • 영화 보기
  • 레스토랑 가기
  • 산책하기

밸런타인데이 활동을 고르는 데 도움이 될 여섯 가지 과제가 있어요.

1. 승인 정의하기

파트너가 제안한 각 아이디어에 대해 세 가지 중 하나로 답해요: 네, 아니요, 아마도.

이 선택지들을 다음 세 가지 케이스로 나타내는 Approval 커스텀 타입을 정의해요: Yes, No, Maybe.

2. 요리 종류 정의하기

파트너는 가능한 레스토랑 두 곳을 골랐어요: 하나는 한국 요리를 바탕으로 하고, 다른 하나는 터키 요리를 바탕으로 해요.

이 요리들을 다음 두 케이스로 나타내는 Cuisine 커스텀 타입을 정의해요: Korean, Turkish.

3. 영화 장르 정의하기

고를 수 있는 영화가 정말 많아서, 범위를 좁히기 위해 파트너가 장르도 함께 알려줘요.

다음 장르들을 케이스로 나타내는 Genre 커스텀 타입을 정의해요: Crime, Horror, Romance, Thriller.

4. 활동 정의하기

앞서 말했듯이, 파트너가 다섯 가지 활동을 생각해 냈어요: 보드 게임 하기, 휴식하기, 영화 보기, 레스토랑 가기, 산책하기.

이 활동 유형들을 나타내는 Activity 커스텀 타입을 정의해요:

  • BoardGame: 연결된 데이터가 없어요.
  • Chill: 연결된 데이터가 없어요.
  • Movie: Genre를 연결된 데이터로 가져요.
  • Restaurant: Cuisine을 연결된 데이터로 가져요.
  • Walk: 걸을 킬로미터 수를 나타내는 Int를 연결된 데이터로 가져요.

5. 활동 평가하기

이제 파트너의 아이디어를 평가할 준비가 됐어요. 각 아이디어에 대한 느낌은 이래요:

  • 보드 게임 하기: 아니요.
  • 휴식하기: 아니요.
  • 영화 보기: 로맨스 영화라면 네, 그렇지 않으면 아니요.
  • 레스토랑 가기: 요리가 한국 요리라면 네, 터키 요리라면 아마도.
  • 산책하기: 산책 거리가 11킬로미터를 넘으면 네, 6킬로미터를 넘으면 아마도, 그렇지 않으면 아니요.

위 느낌에 따라 Activity 값을 받아 Approval을 반환하는 rate_activity 함수를 구현해요:

rate_activity(Restaurant(Turkish))
// -> Maybe
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Gleam Exercism

밸런타인데이 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 Gleam 트랙을 개념 33개연습 문제 122개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.