Рассмотрим тип DateTime, в котором дата должна присутствовать, но часть времени в секундах необязательна. Если есть часть времени, может быть необязательная часть миллисекунд. Если присутствуют миллисекунды, может быть и наносекундная часть.
Есть много способов справиться с этим, например.:
--rely on smart constructors
data DateTime = DateTime { days:: Int,
sec :: Maybe Int,
ms :: Maybe Int,
ns :: Maybe Int
}
-- list all possibilities
data DateTime = DateOnly Int
| DateWithSec Int Int
| DateWithMilliSec Int Int Int
| DateWithNanoSec Int Int Int Int
-- cascaded Maybe
data DateTime = DateTime Int (Maybe (Int, Maybe (Int, Maybe Int)))
-- cascaded data
data Nano = NoNano | Nano Int
data MilliSec = NoMilliSec | MilliSec Int Nano
data Sec = NoSec | Sec Int MilliSec
data Date = Date Int Sec
Какую конструкцию вы бы использовали (, конечно, не ограничиваясь приведенными выше примерами), и почему?
[Намерения]
Я изучаю возможности для типа даты во Фреге(http://code.google.com/p/frege/), используя date4j DateTime
в качестве ориентира (поскольку библиотека дат и времени Haskell слишком сложна, а java.util.Date
тоже сломано). В моей текущей игрушечной реализации все поля являются обязательными, но, конечно, было бы неплохо избавить пользователя от нежелательной точности (, а исходная реализация имеет необязательные поля).
Таким образом, основными целями являются:
Не так важны:
Тем не менее, все это очень условно и не должно восприниматься слишком серьезно.