如何创建一个新的Data.Derive实例生成器?

时间:2012-01-24 06:57:03

标签: haskell typeclass deriving

有谁知道如何创建Data.Derive实例生成器的分步教程?似乎有大量关于如何使用现有派生实例生成器的文档。

对于那些不熟悉Data.Derive的人(或者如果我特别不清楚),这就是我想要做的。给出一个简单的新类型例子,

newtype WrapperT  α = WrapperT (StateT Integer  α)
    deriving (Applicative, Functor, Monad)

instance HzMonadBase  => HzMonadBase (WrapperT ) where
    data ExprTyp (WrapperT ) α = WrapperTE (ExprTyp (StateT Integer ) α)

我想生成所有这些实例(和Constraints数据系列)。它们几乎被字符串“WrapperT”,“WrapperTE”和“StateTIntegerα”参数化。

data instance Constraints (ExprTyp (WrapperT )) α =
    (Suitable (ExprTyp ) α) => WrapperT_Constr
instance (Suitable (ExprTyp ) α) => Suitable (ExprTyp (WrapperT )) α where
    constraints = WrapperT_Constr

instance HzMonadBase  => HzExprTrans (ExprTyp (WrapperT )) where
    type PrimExpr (ExprTyp (WrapperT )) = ExprTyp (StateT Integer )
    e_lift = fmap WrapperTE
    e_lower = fmap (\(WrapperTE x) -> x)
    e_lower_suitably x@(ExprT v) f =
        withConstraintsOf v $ \WrapperT_Constr -> f (e_lower x)

instance HzMonadBase  => BinaryCmpExpr (ExprTyp (WrapperT ))
instance HzMonadBase  => BinaryOpExpr (ExprTyp (WrapperT ))
instance HzMonadBase  => SketchConstrExpr (ExprTyp (WrapperT ))
instance HzMonadBase  => Arithmetic (ExprTyp (WrapperT ))
instance HzMonadBase  => VariablesExpr (ExprTyp (WrapperT ))

instance HzMonadBase  => HzMonadTrans (WrapperT ) where
    type BaseMonad (WrapperT ) = StateT Integer 
    lift = WrapperT
instance HzMonadBase  => HzMonadUnliftTrans (WrapperT ) where
    unlift (WrapperT x) = x

0 个答案:

没有答案