Образец синонимов производного чтения?
Синонимы шаблона обеспечивают краткий способ выражения значения; также они могут предоставить абстрактное имя, чтобы избежать взлома клиентским модулем данных. Вот не очень полезный пример для обсуждения:
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
внутри длинного строкового литерала, который я читаю, чтобы создать структуру данных.
Есть идеи?