4

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

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

将自动生成实例,例如,

instance [overlap ok] Monad  => Monad (SkewOptT )

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

4

1 回答 1

4

不,这是不可能的。不过,默认签名(GHC 7.2 中的新功能)可能会帮助您在此处拆分类;由于您可以根据其他类型类定义方法的默认实现,因此您可能能够派生一些实例,并且只在另一个类的实例中填写您想要覆盖的方法。

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

于 2012-01-01T21:49:55.360 回答