有什么方法可以自定义GeneralizedNewtypeDeriving实例的一个或两个方法?

时间:2012-01-01 21:37:36

标签: haskell typeclass newtype deriving

Haskell的GeneralizedNewtypeDeriving机制很棒;对于那些没有看过它的人,写一些类似

的东西
newtype SkewOptT  α = SkewOptT (StateT Bool  α)
    deriving (Applicative, Functor, Monad, MonadTrans)

会自动生成像

这样的实例
instance [overlap ok] Monad  => Monad (SkewOptT )

但是,对于我的一个类型类,我想自定义一些方法。有没有办法覆盖或禁用GeneralizedNewtypeDeriving为这些方法做什么?类型类编码一些基本的DSL指令,如for(循环),parfor(并行循环),fcndef(添加新函数)等等,并且没有将其拆分为多个类型的完美方法[然后自动派生一个,并手动编写另一个]。

1 个答案:

答案 0 :(得分:4)

不,这是不可能的。 Default signatures(GHC 7.2中的新内容)可能会帮助您在这里拆分课程;因为您可以根据其他类型类定义方法的默认实现,所以您可能能够派生一些实例,并且只在另一个类的实例中填写您要覆盖的方法。

实际上,除了ShowRead之外,newtype派生只检查是否满足一些前提条件,然后直接重用字典(因为newtypes与底层类型具有相同的表示);有关详细信息,请参阅the documentation