(タイトル字余り) この記事は筆者が社内勉強会で発表した内容を(個人的に出来が良いと思ったので)外部向けに再構成したものです。(大変長くなってしまった) 状況その1 いきなり以下のコードをご覧ください。 type Contact = { Name: PersonalName; EmailContactInfo: EmailContactInfo option; PostalContactInfo: PostalContactInfo option; } そして以下の仕様をご確認ください。 Business Rule: “A contact must have an email or a postal address” 出典と動機、課題 上掲コード及び仕様はDesigning with types: Making illegal states unrepresentable | F# for