Haskell 的 GeneralizedNewtypeDeriving 机制很棒;对于那些没有看过的人,写一些类似的东西
newtype SkewOptT 𝔪 α = SkewOptT (StateT Bool 𝔪 α)
deriving (Applicative, Functor, Monad, MonadTrans)
将自动生成实例,例如,
instance [overlap ok] Monad 𝔪 => Monad (SkewOptT 𝔪)
但是,对于我的一个类型类,我想自定义一些方法。有没有办法覆盖或禁用 GeneralizedNewtypeDeriving 对这些方法的作用? typeclass 编码一些基本的 DSL 指令,如
for
(一个循环),parfor
(并行循环),fcndef
(添加一个新函数)等,并没有一种完美的方法可以将其拆分为多个类型类[然后自动派生一个,然后手动编写另一个]。
最佳答案
不,这是不可能的。 Default signatures (GHC 7.2 中的新功能)可能会帮助您在这里拆分类;由于您可以根据其他类型类定义方法的默认实现,因此您可能能够派生一些实例,并且只在另一个类的实例中填写要覆盖的方法。
其实除了Show
和 Read
, newtype deriving 只是检查一些前提条件是否满足,然后直接重用字典(因为 newtypes 与底层类型具有相同的表示);见 the documentation了解更多详情。
关于haskell - 有什么方法可以自定义 GeneralizedNewtypeDeriving 实例的一种或两种方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8695722/