GHC.Generics用于求和类型的默认方法

时间:2016-11-16 19:55:37

标签: haskell generic-programming

我想使用GHC.Genericsdata 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

0 个答案:

没有答案