트랙
/
Gleam
Gleam
/
연습 문제
/
안전한 보물 상자
안전한 보물 상자

안전한 보물 상자

학습 연습 문제

소개

불투명 타입

Gleam의 불투명 타입은 사용자 정의 타입이에요. 이 타입의 값은 그 타입을 정의한 모듈에서만 만들거나 패턴 매칭할 수 있어요. 불투명 타입은 특정한 방식으로만 사용해야 하는 타입을 만들 때 유용해요.

불투명 타입은 opaque 키워드로 정의해요.

pub opaque type PositiveInt {
  PositiveInt(inner: Int)
}

이 PositiveInt 타입은 정수가 필요하지만 그 값이 0 이상이어야 하는 상황에서 사용해요. 일반적인 Gleam Int는 음수가 될 수도 있어서 사용할 수 없어요.

이 타입을 정의한 모듈에서는 안쪽 정수 값을 가져오는 함수와, 값이 양수가 아닐 때 오류를 반환하는 PositiveInt 생성 함수를 정의할 수 있어요.

pub fn from_int(i: Int) -> Result(PositiveInt, String) {
  case i {
    _ if i < 0 -> Error("Value must be positive")
    _ -> Ok(PositiveInt(i))
  }
}

pub fn to_int(i: PositiveInt) -> Int {
  i.inner
}

이런 API 덕분에 다른 모듈에서는 음수 값을 가진 PositiveInt를 만들 수 없어요. 그래서 PositiveInt를 받는 함수는 그 값이 양수라고 확신할 수 있어요.

지침

눈썰미가 좋은 학생이라면 이전 연습 문제의 TreasureChest 타입이 그렇게 안전하지 않았다는 걸 눈치챘을 거예요!

get_treasure 함수를 사용하려면 비밀번호를 넘겨야 했지만, 비밀번호를 몰라도 TreasureChest 타입을 구조 분해해서 보물을 꺼낼 수 있었어요.

불투명 타입을 사용해서 이 문제를 해결해 봐요.

1. TreasureChest 불투명 타입을 정의해요

TreasureChest에는 두 개의 필드가 있어요:

  • String인 비밀번호.
  • 제네릭 타입인 보물.

TreasureChest 타입은 불투명해야 해요.

2. create 함수를 정의해요

이 함수는 두 개의 인자를 받아요:

  • 비밀번호 String.
  • 아무 타입이나 될 수 있는 보물 값.

함수는 비밀번호와 값을 담은 TreasureChest를 반환해요.

비밀번호가 8자보다 짧으면 함수는 Password must be at least 8 characters long라는 오류를 반환해야 해요.

3. open 함수를 정의해요

이 함수는 두 개의 인자를 받아요:

  • TreasureChest.
  • 비밀번호 String.

비밀번호가 TreasureChest에 있는 비밀번호와 일치하면 함수는 보물을 반환하고, 그렇지 않으면 Incorrect password라는 오류를 반환해야 해요.

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

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

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