Ainda mais generalizado newtype derivando

Newtypes são frequentemente usados ​​para alterar o comportamento de certos tipos quando usados ​​em determinados contextos de classe. Por exemplo, alguém usaria oData.Monoid.All invólucro para mudar o comportamento deBool quando usado comoMonoid.

Atualmente estou escrevendo um wrapper newtype que se aplicaria a uma grande variedade de tipos diferentes. O wrapper deve alterar o comportamento de uma instância de classe específica. Pode parecer assim:

newtype Wrapper a = Wrapper a

instance Special a => Special (Wrapper a) where
  -- ...

No entanto, adicionar esse wrapper geralmente altera a usabilidade do tipo empacotado. Por exemplo, se eu anteriormente era capaz de usar a funçãomconcat :: Monoid a => [a] -> a, Não consigo usá-lo agora para uma lista de valores agrupados.

Eu posso, claro, usar-XGeneralizedNewtypeDeriving enewtype Wrapper a = Wrapper a deriving (Monoid). No entanto, isso só resolve o problemaMonoid e nenhuma outra classe, enquanto eu vou estar lidando com um mundo aberto cheio de classes diferentes, e o derivado generalizado órfão independente não é realmente uma opção prática. Idealmente, eu gostaria de escreverderiving hiding (Special) (derivando todas as aulas, excetoSpecial), mas isso não é válido Haskell, é claro.

Existe alguma maneira de fazer isso ou estou apenas ferrado e precisa adicionar uma solicitação de recurso do GHC?

questionAnswers(2)

yourAnswerToTheQuestion