Как создать новый генератор экземпляров Data.Derive? - PullRequest
1 голос
/ 24 января 2012

Кто-нибудь знает пошаговое руководство по созданию генератора экземпляров 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
...