트랙
/
Elm
Elm
/
연습 문제
/
발렌타인 데이
발렌타인 데이

발렌타인 데이

학습 연습 문제

소개

사용자 정의 타입

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"

지침

이 연습 문제는 발렌타인데이를 배경으로 해요. 함께 즐거운 일을 하려고 파트너와 계획을 세우는 중이에요.

파트너는 아이디어가 아주 많아요. 그래서 함께 할 활동을 정하기 위해, 이제 그 아이디어들을 평가해 달라고 해요.

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

  • 보드게임 하기
  • 느긋하게 쉬기
  • 영화 보기
  • 레스토랑에 가기

발렌타인데이 활동을 고르는 데 도움이 될 여섯 개의 과제가 있어요.

1. 승인 정의하기

파트너가 제안한 각 아이디어에 대해 예, 아니요, 어쩌면 중 하나로 답해요.

이런 선택지를 다음 세 가지 케이스로 나타내는 Approval 사용자 정의 타입을 정의해요: Yes, No, Maybe.

2. 요리 종류 정의하기

파트너는 레스토랑 두 곳을 골랐어요. 하나는 한국 요리를, 다른 하나는 터키 요리를 하는 곳이에요.

이 요리 종류를 다음 두 가지 케이스로 나타내는 Cuisine 사용자 정의 타입을 정의해요: Korean, Turkish.

3. 영화 장르 정의하기

고를 수 있는 영화가 정말 많아요. 그래서 선택의 폭을 좁히려고 파트너는 장르도 함께 알려 줬어요.

다음 장르를 케이스로 나타내는 Genre 사용자 정의 타입을 정의해요: Crime, Horror, Romance, Thriller.

4. 활동 정의하기

앞서 말했듯이, 파트너는 보드게임 하기, 느긋하게 쉬기, 영화 보기, 레스토랑에 가기 이렇게 다섯 가지 서로 다른 활동을 떠올렸어요.

이런 활동 유형을 나타내는 Activity 사용자 정의 타입을 정의해요:

  • BoardGame: 연관 데이터가 없어요.
  • Chill: 연관 데이터가 없어요.
  • Movie: Genre를 연관 데이터로 가지고 있어요.
  • Restaurant: Cuisine을 연관 데이터로 가지고 있어요.

5. 활동 평가하기

드디어 파트너의 아이디어를 평가할 준비가 됐어요. 파트너의 아이디어에 대한 생각은 다음과 같아요:

  • 보드게임 하기: 아니요.
  • 느긋하게 쉬기: 아니요.
  • 영화 보기: 로맨스 영화라면 예, 그렇지 않으면 아니요.
  • 레스토랑에 가기: 한국 요리라면 예, 터키 요리라면 어쩌면.

위에 적은 대로 Activity 값을 받아 Approval을 반환하는 rateActivity 함수를 구현해요:

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

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

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