«Зависимые необязательные» данные в Haskell

Рассмотрим тип 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тоже сломано). В моей текущей игрушечной реализации все поля являются обязательными, но, конечно, было бы неплохо избавить пользователя от нежелательной точности (, а исходная реализация имеет необязательные поля).

Таким образом, основными целями являются:

  • безопасность:Недопустимых состояний следует избегать любой ценой
  • удобство:С типом должно быть легко работать, например. сопоставление с образцом было бы круто, вычисления календаря должны быть легкими...

Не так важны:

  • производительность:Конечно, работа с типом не должна быть слишком медленной, но для типичного использования это не так. нужно выжать последний такт
  • память:В тех случаях, когда это действительно важно, было бы легко получить более компактный формат хранения
  • краткая реализация:Это библиотека, и я готов чтобы добавить весь код, необходимый для гладкости

Тем не менее, все это очень условно и не должно восприниматься слишком серьезно.

12
задан Landei 13 April 2012 в 07:34
поделиться