Gleam 的不透明型別(opaque type)是一種自訂型別,只有定義該型別的模組才能建構或模式比對該型別的值。這很適合用來建立只能以特定方式使用的型別。
不透明型別是用opaque關鍵字定義的。
pub opaque type PositiveInt {
PositiveInt(inner: Int)
}
這個PositiveInt型別適合用在你需要整數、但這個整數必須大於或等於零的情況。一般的 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的函式都能確定這個值是正數。