単純な値の完全性
e.g.
code:fsharp
type WidgetCode = WidgetCode of string // 先頭が "W" + 数字 4 桁
type UnitQuantity = UnitQuantity of int // 1 以上 1000 以下
type KilogramQuantity = KilogramQuantity of float // 0.05 以上 100.00 以下
上記は制約をコメントで記載しているが、そもそも値を作成できないようにしたい
コンストラクタをプライベートにして別の関数を用意し、無効な値の場合はエラーを返すようにする
他の言語でも再現できる radish-miyazaki.icon
code:fsharp
type UnitQuantity = private UnitQuantity of int
module UnitQuantity =
type UnitQuantity = private UnitQuantity of int
let create qty =
if qty < 1 then
Error "UnitQuantity can not be negative"
else if qty > 1000 then
Error "UnitQuantity can not be more than 1000"
else
Ok (UnitQuantity qty)
// ラップされたデータを抽出するための関数
let value = (UnitQuantity qty) qty
使用例
code:fsharp
let unitQtyResult = UnitQuantity.create 1
match unitQtyResult with
| Error msg -> printfn "Failure, Message is %s" msg
| Ok uQty ->
printfn "Success. Value is %A" uQty
let innerValue = UnitQuantity.value uQty
printfn "innerValue is %i" innerValue