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 타입을 구조 분해해서 보물을 꺼낼 수 있었어요.
불투명 타입을 사용해서 이 문제를 해결해 봐요.
TreasureChest 불투명 타입을 정의해요TreasureChest에는 두 개의 필드가 있어요:
String인 비밀번호.TreasureChest 타입은 불투명해야 해요.
create 함수를 정의해요이 함수는 두 개의 인자를 받아요:
String.함수는 비밀번호와 값을 담은 TreasureChest를 반환해요.
비밀번호가 8자보다 짧으면 함수는 Password must be at least 8 characters long라는 오류를 반환해야 해요.
open 함수를 정의해요이 함수는 두 개의 인자를 받아요:
TreasureChest.String.비밀번호가 TreasureChest에 있는 비밀번호와 일치하면 함수는 보물을 반환하고, 그렇지 않으면 Incorrect password라는 오류를 반환해야 해요.
Exercism에 가입하고 Gleam 트랙을 개념 33개연습 문제 122개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.