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?