1

Data.Derive インスタンス ジェネレーターを作成する方法の段階的なチュートリアルを知っている人はいますか? 既存の派生インスタンス ジェネレーターの使用方法については、多くのドキュメントがあるようです。

Data.Derive に慣れていない人 (または、特によくわからない場合) のために、これが私がやりたいことです。次のような単純な newtype の例を考えると、

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

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

これらすべてのインスタンス (および Constraints データ ファミリ) を生成したいと考えています。それらは文字列 "WrapperT"、"WrapperTE"、および "StateT Integer α" によってほとんどパラメータ化されています。

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
4

0 に答える 0