假设我有一个用于保存在数据库中的实体的类型类。一些简化的示例可能看起来像这样:
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
答案 0 :(得分:2)
否,这是不可能的。
在class Persistent a
中,a不必表示数据类型声明。这只是一种。例如,可以为Persistent
添加一个Maybe Integer
实例。
instance Persistent (Maybe Integer) where ...
因此,谈论“向恰好是deriving (Typeable)
的所有a
添加Persistent
子句并没有多大意义”。一个人不能说data Maybe Integer deriving Typeable
或类似的话。
如果您完全确定每个Persistent
事物 必须为Typeable
,则可能要向您的{{1 }}类:
Persistent
但这对自动派生class Typeable a => Persistent a where ...
毫无帮助。只是要求,对于每个Typeable
实例都应该有一个Persistent
实例,您仍然必须以一种或另一种方式(例如通过添加Typeable
所有相关的数据类型)。