TL;DR

  • 不変条件は、型システムで直接表現できる。
  • 「Order は 1 行以上の OrderLine を持つ」という条件は、空にならないリストの型で表す。

内容

不変条件は、型システムで直接表現できる。たとえば「Order は 1 行以上の OrderLine を持つ」という条件である。

空にならないリストは F# に組み込まれていないので、自分で定義する。この場合、add や remove のような操作関数も必要になる。

type NonEmptyList<'a> = {
    First: 'a
    Last: 'a list
}

FSharpx.Collections のようなライブラリを使う方法もある。このライブラリには NonEmptyList<'T> が用意されている。

type Order = {
    // ...
    OrderLine: NonEmptyList<OrderLine>
    // ...
}

キーワード