Проблема, с которой я часто сталкиваюсь при разработке типа данных в Haskell, заключается в том, чтобы использовать тип суммы или записи Maybe Eithers.Sum Type Vs Record of Maybes
Простым примером может быть моделирование операции FX, spot или forward, где единственной разницей является наличие или отсутствие даты «зрелости» (один из способов - использовать тип суммы, явно указывать, является ли это пятном или вперед.
data Amount = Amount { amount :: Double, currency :: String }
data Fx = Spot { tranDate :: Day, soldAmount :: Amount, boughtAmount :: Amount }
| Forward { tranDate :: Day, paidAmount :: Amount, boughtAmount :: Amount , maturity :: Day}
Другим способом было бы просто иметь maturity
как `` Может быть»
data Fx = Fx { tranDate :: Day
, soldAmount :: Amount
, boughtAmount :: Amount
, maturity (Maybe Day)
}
или что-нибудь еще
Я не уверен, в какой области вы здесь говорите. Если 'Spot' и' Forward' - довольно четкое поведение, требующее одинаковых данных, я бы пошел с 'Spot | Forward' ADT; если они очень похожи, и просто добавляется немного информации/сложности, я бы пошел с решением 'Maybe Day'. – luqui