Haskell:派生自其他类型类的类型类

时间:2018-09-02 06:59:16

标签: haskell

假设我有一个用于保存在数据库中的实体的类型类。一些简化的示例可能看起来像这样:

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

1 个答案:

答案 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所有相关的数据类型)。