1

假设我有一个用于保存在数据库中的实体的类型类。一些简化的示例可能如下所示:

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
4

1 回答 1

2

不,这是不可能的。

class Persistent a中,a 不必表示数据类型声明。它只是一种类型。例如,可以PersistentMaybe Integer.

instance Persistent (Maybe Integer) where ...

所以说“给所有恰好是的 s添加一个deriving (Typeable)子句”没有多大意义。一个人不能说或类似的话。aPersistentdata Maybe Integer deriving Typeable


如果您绝对确定每件事都Persistent必须Typeable您可能需要为您的类添加一个约束Persistent

class Typeable a => Persistent a where ...

然而,这并不能帮助您自动推导Typeable. 它只要求每个Persistent实例都应该有一个Typeable实例,您仍然必须以一种或另一种方式自己产生它(例如,通过添加deriving (Typeable)到所有相关数据类型)。

于 2018-09-02T07:33:24.793 回答