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

问题描述 投票:1回答: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
haskell
1个回答
2
投票

不,这是不可能的。

class Persistent a中,a不必表示数据类型声明。这只是一种类型。例如,可以为Persistent添加Maybe Integer实例。

instance Persistent (Maybe Integer) where ...

因此,谈论“将deriving (Typeable)条款添加到碰巧是a的所有Persistents”没有多大意义。人们不能说data Maybe Integer deriving Typeable或类似的东西。


如果你完全确定每个Persistent都必须是Typeable,你可能想要为你的Persistent类添加一个约束:

class Typeable a => Persistent a where ...

然而,这并不会以任何方式帮助您自动推导Typeable。它只需要对每个Persistent实例都应该有一个Typeable实例,你仍然必须以这种或那种方式自己生成(例如通过将deriving (Typeable)添加到所有相关数据类型)。

© www.soinside.com 2019 - 2024. All rights reserved.