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

밸런타인데이

학습 연습 문제

소개

구별된 공용체

구별된 공용체 타입은 이름이 있는 고정된 개수의 케이스를 나타내요. 구별된 공용체의 각 값은 이름이 있는 케이스 중 정확히 하나에 해당해요.

구별된 공용체는 type 키워드로 정의하고, 각 케이스는 파이프(|) 문자로 구분해요:

type Season =
    | Spring
    | Summer
    | Autumn
    | Winter

구별된 공용체의 각 케이스에는 선택적으로 데이터를 연결할 수 있고, 케이스마다 서로 다른 타입의 데이터를 가질 수 있어요. 어떤 케이스에도 데이터가 연결되어 있지 않다면, 구별된 공용체는 다른 언어에서 보통 열거형(또는 enum)이라고 부르는 것과 비슷해요.

type Number =
    | Integer of int
    | Float of float
    | Invalid

특정 케이스의 값을 만들려면 그 케이스의 이름을 사용하면 돼요(예: Success). 케이스 이름은 그냥 생성자 함수이기 때문에, 연결된 데이터는 일반 함수 인자처럼 전달할 수 있어요. 다른 구별된 공용체가 같은 이름의 케이스를 정의했다면, 전체 이름을 사용해야 해요(예: Result.Success).

let byName = Integer 2
let byFullName = Number.Invalid

구별된 공용체는 _구조적 동등성_을 가져요. 즉, 같은 케이스이고 같은 (선택적) 데이터를 가진 두 값은 서로 같아요.

구별된 공용체를 다룰 때 if/elif/else 식을 사용할 수도 있지만, 권장하는 방법은 _식별자 패턴_을 사용한 패턴 매칭이에요:

let describe number =
    match number with
    | Integer i -> sprintf "Integer: %d" i
    | Float d  -> sprintf "Float: %f" d
    | 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을 연결된 데이터로 가져요.
  • Walk: 걸을 거리를 킬로미터 단위로 나타내는 int 값을 연결된 데이터로 가져요.

5. 활동 평가하기

이제 연인의 아이디어를 평가할 준비가 됐어요. 각 아이디어에 대한 생각은 다음과 같아요:

  • 보드게임 하기: 아니요.
  • 쉬기: 아니요.
  • 영화 보기: 로맨스 영화라면 예, 그렇지 않으면 아니요.
  • 식당 가기: 한식이면 예, 터키 음식이면 어쩌면.
  • 산책하기: 3킬로미터 미만이면 예, 5킬로미터 미만이면 어쩌면, 그렇지 않으면 아니요.

위 기준에 따라 Activity 값을 받아 Approval을 반환하는 rateActivity라는 함수를 구현해요:

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

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

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