我想使用GHC.Generics
为data X s = X0 s | X1 O1 (X s) | X2 O2 (X s) (X s) | ...
形式的所有对象创建类的默认实现。
具体来说,我想要以下内容:
class C (a :: * -> *) where
cmap :: Applicative m =>
(s -> m (a s')) -> ((a s) -> m (a s')) -> a s -> m (a s')
例如,在后面的Expr
类型中:
data BEOp = EAdd | ESub | EMul | EDiv deriving (Generic, Eq)
data UEOp = EId deriving (Generic, Eq)
data Expr s = BinExpr BEOp (Expr s) (Expr s)
| UnExpr UEOp (Expr s)
| NExpr s deriving (Eq, Generic)
GHC将派生类型类C
的默认实现,该实现等同于:
instance C Expr where
cmap _ f (BinExpr o q q') = BinExpr o <$> f q <*> f q'
cmap _ f (UnExpr o q) = UnExpr o <$> f q
cmap f _ (NExpr s) = f s