Образец синонимов производного чтения?

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

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 внутри длинного строкового литерала, который я читаю, чтобы создать структуру данных.

Есть идеи?

0 ответов

Другие вопросы по тегам