Кто-нибудь знает пошаговое руководство по созданию генератора экземпляров 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 ?) α)
Я хочу сгенерировать все эти экземпляры (и семейство данных ограничений).Они в значительной степени параметризованы строками "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