Newtypes通常用于在某一类的上下文中使用时,更改某些类型的行为。 例如,一种将使用Data.Monoid.All
包装改变的行为Bool
作为使用时Monoid
。
我目前正在写这样一个适用于大范围的不同类型的NEWTYPE包装。 该包装应该是改变一个特定的类实例的行为。 这可能是这样的:
newtype Wrapper a = Wrapper a
instance Special a => Special (Wrapper a) where
-- ...
然而,加入这个包装往往会改变包装类型的可用性。 例如,如果我以前能使用的功能mconcat :: Monoid a => [a] -> a
,我不能现在用它来包裹值的列表。
当然,我可以使用-XGeneralizedNewtypeDeriving
和newtype Wrapper a = Wrapper a deriving (Monoid)
。 然而,这仅仅解决了这个问题Monoid
并没有其他类,而我会用一个开放的世界充满了不同类别的被处理,和独立孤儿广义NEWTYPE推导是不是一个真正的实际的选择。 理想情况下,我想写出deriving hiding (Special)
(除派生每个类Special
),但是这不是有效的Haskell,当然。
是否有这样做的一些方法或者我只是拧紧,并需要添加一个GHC功能提出要求?