# Domain Modeling made Functional / Domain Modeling with Types / Modeling Complex Data ###### tags: `ddd` ## Modeling with Record Types ``` data Order = CustomerInfo AND ShippingAddress AND BillingAddress AND list of OrderLines AND AmountToBill ``` translates directly to an F# record structure ``` type Order = { CustomerInfo : CustomerInfo ShippingAddress : ShippingAddress BillingAddress : BillingAddress OrderLines : OrderLine list AmountToBill : ... } ``` ## Modeling Unknown Types ``` type CustomerInfo = Undefined type ShippingAddress = Undefined type BillingAddress = Undefined type OrderLine = Undefined type BillingAmount = Undefined type Order = { CustomerInfo : CustomerInfo ShippingAddress : ShippingAddress BillingAddress : BillingAddress OrderLines : OrderLine list AmountToBill : BillingAmount } ``` This approach means that you can keep modeling the domain with types and compile the code. But when you try to write the functions that process the types, you will be forced to replace Undefined with something a bit better. ## Modeling with Choice Types ``` data ProductCode = WidgetCode OR GizmoCode data OrderQuantity = UnitQuantity OR KilogramQuantity ``` ``` type ProductCode = | Widget of WidgetCode | Gizmo of GizmoCode type OrderQuantity = | Unit of UnitQuantity | Kilogram of KilogramQuantity ```