Haskell:从其他typeclass派生的typeclass
假设我有一个typeclass用于保存在数据库中的实体。一些简化示例可能如下所示:Haskell:从其他typeclass派生的typeclass,haskell,Haskell,假设我有一个typeclass用于保存在数据库中的实体。一些简化示例可能如下所示: class Persistent a where fetch :: Int -> IO (Maybe a) store :: a -> IO Bool class Persistent a deriving (Typeable) where fetch :: Int -> IO (Maybe a) store :: a -> IO Bool 现在我发现对
class Persistent a where
fetch :: Int -> IO (Maybe a)
store :: a -> IO Bool
class Persistent a deriving (Typeable) where
fetch :: Int -> IO (Maybe a)
store :: a -> IO Bool
现在我发现对于store
我可能需要知道实体的类型,因此它也应该是可键入的
是否有某种方法可以判断所有的持久性
实体都是可键入的
,而不向每个特定的数据
子句添加派生(可键入)
?例如,像这样:
class Persistent a where
fetch :: Int -> IO (Maybe a)
store :: a -> IO Bool
class Persistent a deriving (Typeable) where
fetch :: Int -> IO (Maybe a)
store :: a -> IO Bool
不,这是不可能的 在类a中,a不必表示数据类型声明。这只是一种类型。例如,可以为
可能的整数添加一个持久性
实例
instance Persistent (Maybe Integer) where ...
因此,谈论“将派生(可键入)
子句添加到所有碰巧是持久的的a
子句中”没有多大意义。不能说数据可能是整数派生的Typeable
或诸如此类的东西
如果您完全确定每个持久性
对象都必须是可键入的
,那么您可能需要向持久性
类添加一个约束:
class Typeable a => Persistent a where ...
但是,这对自动派生Typeable
没有任何帮助。它只要求对于每个持久的
实例,都应该有一个可键入的
实例,您仍然需要以某种方式生成自己的实例(例如,通过向所有相关数据类型添加派生(可键入)
。那么派生实际上只是自动生成一个实例。但是您可以编写类Typeable a=>Persistent a where…
。不,这是不可能的。在类持久化a
中,a
不必表示数据类型声明。这只是一种类型。例如,您可以将一个持久
实例添加到可能是整数
。因此,谈论“将一个派生Typeable
子句添加到所有碰巧是持久的的a
子句中”没有多大意义---您不能说数据可能是整数派生的Typeable
或诸如此类的东西。@WillemVanOnsemclass Typeable a=>Persistent a
添加了一个约束,即Persistent
的任何内容也必须是Typeable
。它可能是需要的,但它不能帮助您满足约束。您仍然需要以这种或那种方式生成Typeable
实例(例如,将派生(Typeable)
添加到所有相关的数据
子句中)。@n.m感谢您的解释,请随意回答,以便我可以“接受”它!还要感谢您澄清向typeclass添加约束并没有帮助:)但您为什么需要这样做呢?在每个特定的实例中,您都知道类型——您只是在实例声明中写下了它Typeable
可能是一个特殊的例子,因为在现代GHC中,所有东西都隐式地是Typeable
类的成员,派生Typeable
是不可操作的。因此,超类约束已经足够好了,并且实际上是“免费的”,除了传递字典的运行时成本。