データ定義への識別子の追加
フィールドを追加するだけ
識別子を内側(各ケースで関連付けられている)と外側(どのケースにも関連付けられていない)のどちらに置くべきか
外側の場合
code:fsharp
// 未払いのケースの情報(ID 無し)
type UnpaidInvoiceInfo = ...
// 支払済みのケースの情報(ID 有り)
type PaidInvoiceInfo = ...
type InvoiceInfo =
| Unpaid of UnpaidInvoiceInfo
| Paid of PaidInvoiceInfo
type InvoiceId = ...
// トップレベルの請求書型
type Invoice = {
InvoiceID : InvoiceId // 子のケースの外側
InvoiceInfo : InvoiceInfo
}
1 つのケースのデータが型の様々な部分に分散しているため、簡単に処理できない
そのため内側のケースをよく用いる
内側の場合
code:fsharp
type UnpaidInvoice = {
InvoiceId : InvoiceId // 内側に保持する ID
// 未払いのケース情報
}
type PaidInvoice = {
InvoiceId : InvoiceId
// 支払済みのケースの情報
}
type Invoice =
| Unpaid of UnpaidInvoice
| Paid of PaidInvoice
外側の場合とは異なり、パターンマッチの際にすべてのデータに一度にアクセスできる
code:fsharp
let invoice = Paid { InvoiceId = ... }
match invoice with
| Unpaid unpaidInvoice ->
printfn "The unpaid invoiceId is %A" unpaidInvoice.InvoiceId
| Paid paidInvoice ->
printfn "The paid invoiceId is %A" paidInvoice.InvoiceId