Образец синонимов производного чтения? - PullRequest
0 голосов
/ 07 июня 2018

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

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

Есть идеи?

...