Синонимы шаблона обеспечивают сокращенный способ выражения значения;также они могут предоставить абстрактное имя, чтобы избежать взлома клиентским модулем данных.Вот не очень полезный пример для обсуждения:
data MyNum = MkNum Int
pattern Zero :: MyNum
pattern Zero = MkNum 0
Что я могу сделать, чтобы помочь в сборе данных, так это предоставить экземпляр Read
для MyNum
.Как получить экземпляр Read
для Zero
?(Zero
- это конструктор псевдоданных, не - конструктор типов, поэтому возникает вопрос об ошибке категории.)
Все, что я могу придумать, - это избегать deriving (Read, ...)
дляMyNum
, а затем ручная работа
instance Read MyNum where
... parse "MkNum ..."
... parse "Zero"
Для разбора Zero
должен быть просто еще одним конструктором для MyNum
.Это может быть получено - или это может быть?
Я не думаю, что какой-либо из продвинутых механизмов получения мог бы помочь здесь.Поскольку типом является MyNum
и единственный связанный конструктор, т.е. MkNum
.
, я мог бы предоставить функцию readZero :: String -> MyNum
.Но я не могу перегрузить read
, поэтому я не могу встроить Zero
в длинный строковый литерал, который я читаю, для создания структуры данных.
Есть идеи?