트랙
/
Elm
Elm
/
연습 문제
/
보물 상자
보물 상자

보물 상자

학습 연습 문제

소개

제네릭

소개

제네릭은 코드 재사용을 가능하게 하는 언어 기능이에요. 예를 들어, 배열이 어떤 타입을 담고 있든 길이를 계산하는 데에는 영향이 없어야 해요. 그래서 length 함수는 타입 시그니처에 제네릭 타입 매개변수 a를 사용해요.

length : List a -> Int

타입에서의 매개변수

어떤 타입이 다른 타입에 대해 제네릭할 때는, 그 다른 타입에 소문자 이름을 붙이고 이를 타입 매개변수라고 불러요. 대표적인 예로 List, Maybe, Result 같은 커스텀 타입이 있어요.

-- Maybe is generic over the type a
type Maybe a
    = Nothing
    | Just a

someString : Maybe String
someString = Just "hello"

someInt : Maybe Int
someInt = Just 42

타입 매개변수의 이름에 대해 한 가지 중요한 점은, 여러 글자로 이루어질 수 있다는 거예요. 유일한 제약은 소문자 이름이어야 한다는 것뿐이에요. 그래서 도움이 될 때는 설명적인 이름을 붙이는 편이에요.

타입은 여러 다른 타입에 대해 제네릭할 수 있고, 따라서 여러 개의 타입 매개변수를 가질 수 있어요. 이 경우 각각의 독립적인 타입은 서로 다른 소문자 이름을 가져요. 독립적이라는 것이 같은 타입이 되는 걸 막지는 않아요. 다만 서로 달라질 수 있게 해줄 뿐이에요.

-- Result is generic over the types error and value
type Result error value
    = Ok value
    | Err error

레코드 타입 별칭도 타입 매개변수를 가질 수 있어요. 다만 흔한 경우는 아니에요.

-- Event is generic over the type a
type alias Event a =
    { at : Time
    , data : a 
    }

함수에서의 타입 매개변수

타입이 제네릭할 수 있으니 함수도 제네릭할 수 있어요. 제네릭 타입을 다루는 함수를 작성할 수도 있는데, Maybe.withDefault가 그 예예요.

withDefault : a -> Maybe a -> a
withDefault default maybe =
    case maybe of
      Just value -> value
      Nothing -> default

다른 함수를 매개변수로 받는 함수를 고차 함수라고 부르는데, 이런 함수도 제네릭할 수 있어요.

map : (a -> b) -> Maybe a -> Maybe b
map function maybe =
  case maybe of
    Just value ->
      Just (function value)

    Nothing ->
      Nothing

지침

이 연습 문제에서는 보물을 보관할 제네릭(그리고 마법 같은!) TreasureChest를 만들어 볼 거예요.

1. TreasureChest 제네릭 커스텀 타입 정의하기

변형이 하나뿐인 TreasureChest 커스텀 타입을 정의해요.

이 변형은 연관된 String 값을 가져야 하는데, 이 값은 보물 상자의 비밀번호를 저장하는 데 쓰여요.

이 변형은 보물을 저장하는 데 쓰일 연관된 제네릭 값도 가져야 해요. 이 값이 제네릭이기 때문에 보물은 무엇이든 될 수 있어요.

2. getTreasure 함수 정의하기

이 함수는 두 개의 매개변수를 받아요.

  • 비밀번호를 시험해 볼 String
  • TreasureChest 제네릭 커스텀 타입

이 함수는 주어진 비밀번호 시도가 TreasureChest 안의 String과 일치하는지 확인해요.

함수는 Maybe를 반환해야 해요.

비밀번호가 일치하면 TreasureChest에 있는 제네릭 값(보물!)을 담은 Just를 반환해요.

비밀번호가 일치하지 않으면 Nothing을 반환해요.

3. multiplyTreasure 함수 정의하기

이 (고차) 함수는 두 개의 매개변수를 받아요.

  • 제네릭 매개변수 하나를 받아 같은 제네릭 타입의 배열을 반환하는 곱하는 함수
  • 같은 제네릭 타입을 가진 TreasureChest 제네릭 커스텀 타입

이 함수는 상자 안의 보물을 가지고 곱하는 함수를 호출해야 해요.

함수는 원래와 같은 비밀번호를 가지고, 곱해진 보물(반환값)을 담은 새로운 TreasureChest를 반환해야 해요.

GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Elm Exercism

보물 상자 문제를 시작해 볼 준비가 됐나요?

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