假设我有一个用于保存在数据库中的实体的类型类。一些简化示例可能如下所示:
class Persistent a where
fetch :: Int -> IO (Maybe a)
store :: a -> IO Bool
现在我发现,对于store
,我可能需要知道实体的类型,所以它也应该是Typeable
。
有没有办法告诉所有Persistent
实体是Typeable
而不添加deriving (Typeable)
到每个特定的data
条款?例如。像这样:
class Persistent a deriving (Typeable) where
fetch :: Int -> IO (Maybe a)
store :: a -> IO Bool
不,这是不可能的。
在class Persistent a
中,a不必表示数据类型声明。这只是一种类型。例如,可以为Persistent
添加Maybe Integer
实例。
instance Persistent (Maybe Integer) where ...
因此,谈论“将deriving (Typeable)
条款添加到碰巧是a
的所有Persistent
s”没有多大意义。人们不能说data Maybe Integer deriving Typeable
或类似的东西。
如果你完全确定每个Persistent
都必须是Typeable
,你可能想要为你的Persistent
类添加一个约束:
class Typeable a => Persistent a where ...
然而,这并不会以任何方式帮助您自动推导Typeable
。它只需要对每个Persistent
实例都应该有一个Typeable
实例,你仍然必须以这种或那种方式自己生成(例如通过将deriving (Typeable)
添加到所有相关数据类型)。