Автоматическое получение экземпляра после объявления

В Haskell при определении типа данных вы можете автоматически выбирать в некоторых случаях, но могу ли я отложить автоматическое получение, возможно, даже положить его в другая библиотека?

Вот пример:

Автоматическое выведение в Haskell - это экономия в реальном времени!

module MoneyModule where

data Money = Money Int
  deriving Show

Теперь я хочу использовать MoneyModule, но мне также нужен экземпляр Read для Money:

module ExternalModule where

instance Read Money where
  read = error "Can't this be done automatically instead?"

Но я бы предпочел, чтобы он был получен автоматически, и я знаю, что ghc мог бы сделать, если бы только автор MoneyModule автоматически создал экземпляр Read.


Я знаю, что:

  • Лучше исправить проблему в фактическом MoneyModule, исправив ее отсутствующим экземпляром.
  • Чтобы считать, что у детей есть сироты. Имена экземпляров предпочтительно помещаются в модуль, где либо тип типа, либо данные тип был определен.

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

Ответ 1

GHC имеет расширение StandaloneDeriving, с этим вы можете

{-# LANGUAGE StandaloneDeriving #-}
import MoneyModule

deriving instance Read Money

выводить экземпляры для многих классов.

Ответ 2

Чтобы решить проблему автономного вывода, см. решение даниэлей. Но, как вы упомянули в своем вопросе, сироты не являются лучшей практикой, и ghc будет генерировать предупреждения. Чтобы подавить предупреждения сиротских сирот, вы можете использовать флаг -fno-warn-orphans. Вы также можете добавить его в свой файл cabal:

...
library
  exposed-modules: ...
  ...
  ghc-options: -fno-warn-orphans
...