Любой способ настроить один или два метода экземпляров GeneralizedNewtypeDeriving? - PullRequest
4 голосов
/ 02 января 2012

Отличный механизм Haskell GeneralizedNewtypeDeriving; для тех, кто этого не видел, пишет что-то вроде

newtype SkewOptT ? α = SkewOptT (StateT Bool ? α)
    deriving (Applicative, Functor, Monad, MonadTrans)

автоматически генерирует такие экземпляры, как,

instance [overlap ok] Monad ? => Monad (SkewOptT ?)

Однако для одного из моих классов типов я хочу настроить несколько методов. Есть ли способ переопределить или отключить то, что GeneralizedNewtypeDeriving делает для этих методов? Класс типов кодирует некоторые базовые инструкции DSL, такие как for (цикл), parfor (параллельный цикл), fcndef (добавление новой функции) и т. Д., И не существует идеального способа его разделения. до нескольких классов типов [и затем автоматически выводит один и вручную записывает другой].

1 Ответ

4 голосов
/ 02 января 2012

Нет, это невозможно. Подписи по умолчанию (новое в GHC 7.2) может помочь вам разделить классы здесь; поскольку вы можете определять реализации методов по умолчанию в терминах других классов типов, вы можете получить некоторые экземпляры и заполнить только те методы, которые хотите переопределить в экземпляре другого класса.

На самом деле, кроме Show и Read, вывод нового типа просто проверяет выполнение нескольких предварительных условий, а затем напрямую использует словарь (поскольку у новых типов такое же представление, как и у базового типа); см. документацию для более подробной информации.

...