Invariant(不変条件)
値同士の間にある必ず満たすべき不変な条件
型で表せるものとそうでないものとある
どうやるか
smart constructorを使用する
データはimmutableなので、作成時にのみvalidationすれば十分にIntegrityは保証される
primitiveでは同じ型の値も型レベルで異なるものとして扱う
hsやpursならばnewtypeを使う
ref https://stackoverflow.com/a/17048411
こんなのもあった
https://hackage.haskell.org/package/units
F#ならば、Units of Measureを使う
型で表せるものの例
「Orderは必ず1つ以上のOrderLineを持つ」
OrderLines :: NotEmptylist<OrderLine>という型にする
型で表せないものの例
「UnitQuantityは、1~1000の間の値を取る」
普通はsmart constructorとかで対応すると思う
参考
/mrsekut-book-97816805025/122 (Enfocing Invariants with the Type System)~