Вы можете расширить Haskell с помощью всевозможных необычных функций, которые могут помочь вам в пути, но есть и несколько висячих фруктов. Как типично в программировании, они часто приходят в форме компромиссов. Это также относится и к случаю.
Программисты часто используют целые числа для представления чисел, даже если эти числа больше похожи на метки или идентификаторы, чем на цифры. Если вы не выполните арифметику c для чисел, они вместо этого являются кандидатами для типа суммы.
Например, вы можете определить месяцы следующим образом:
data Month =
Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec
deriving (Eq, Show, Ord, Enum, Bounded)
Это более безопасным для типов, чем использование Int
, потому что вы ограничены только этими двенадцатью значениями. Вы также можете обойти вопрос, указывает ли 0
или 1
январь и т. Д. c.
Вы можете сделать то же самое со значением district (здесь не показано).
Аналогично, если вы знаете, что у вас всегда есть три значения, список не самый лучший тип данных. Кортеж лучше.
Частичное улучшение типа данных Reg
будет примерно таким:
data Reg =
OldReg { code :: String }
| NewReg { loc :: Locality,
district :: Int,
month :: Month,
year :: Int,
random :: (Char, Char, Char) }
deriving (Eq, Show)
Это не решает все проблемы, потому что random
все еще может быть заполнен, скажем, ('1', '2', '2')
. Также сложнее придумать тип, который правильно ограничивает год, поэтому вам, вероятно, все еще понадобится умный конструктор.
Возможно, вы сможете сделать больше. Как правило, номерные знаки допускают только заглавные буквы. Интеллектуальный конструктор может проверять наличие строчных букв и отклонять их или преобразовывать, или вы можете смоделировать буквы как тип суммы с двадцатью шестью значениями: A | B | C | D | ...
et c.