在某些类上下文中使用时,新类型通常用于更改某些类型的行为。例如,可以使用Data.Monoid.All
包装器来更改Bool
用作Monoid
.
我目前正在编写一个适用于各种不同类型的新型包装器。包装器应该改变一个特定类实例的行为。它可能看起来像这样:
newtype Wrapper a = Wrapper a
instance Special a => Special (Wrapper a) where
-- ...
但是,添加此包装器通常会改变包装类型的可用性。例如,如果我以前能够使用 function mconcat :: Monoid a => [a] -> a
,我现在不能将它用于包装值的列表。
我当然可以使用-XGeneralizedNewtypeDeriving
and newtype Wrapper a = Wrapper a deriving (Monoid)
。但是,这仅解决了Monoid
其他类的问题,而我将处理一个充满不同类的开放世界,并且独立的孤儿广义新类型派生并不是一个实际的选择。理想情况下,我想写deriving hiding (Special)
(派生除 之外的所有类Special
),但这当然不是有效的 Haskell。
有什么方法可以做到这一点,还是我只是搞砸了,需要添加 GHC 功能请求?