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を受け取る関数は、その値が正であると確信できます。