Gleam 中的不透明类型是一种自定义类型,只有定义该类型的模块才能构造或模式匹配该类型的值。当你希望某个类型只能以特定方式使用时,这会很有用。
不透明类型使用opaque关键字定义。
pub opaque type PositiveInt {
PositiveInt(inner: Int)
}
这个PositiveInt类型适用于需要整数、但该整数必须大于等于零的场景。普通的 GleamInt类型不行,因为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的函数都能确信该值是正数。