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