【发布时间】:2018-09-02 15:33:24
【问题描述】:
假设我有一个类型类用于保存在数据库中的实体。一些简化的示例可能如下所示:
class Persistent a where
fetch :: Int -> IO (Maybe a)
store :: a -> IO Bool
现在我发现对于store,我可能需要知道实体的类型,所以它也应该是Typeable。
有没有办法告诉所有Persistent 实体都是Typeable 而无需在每个特定的data 子句中添加deriving (Typeable)?例如。像这样:
class Persistent a deriving (Typeable) where
fetch :: Int -> IO (Maybe a)
store :: a -> IO Bool
【问题讨论】:
-
好吧
deriving实际上只是自动生成一个实例。但是你可以写class Typeable a => Persistent a where ...。 -
不,这是不可能的。在
class Persistent a中,a不必表示数据类型声明。它只是一种类型。例如,您可以将Persistent实例添加到Maybe Integer。因此,谈论“将deriving Typeable子句添加到恰好是Persistent的所有as ”没有多大意义——你不能说data Maybe Integer deriving Typeable或类似的东西。 -
@WillemVanOnsem
class Typeable a => Persistent a添加了一个约束,即任何Persistent也必须是Typeable。它可能是必需的,但它不能帮助您满足约束。您仍然需要以一种或另一种方式生成Typeable实例(例如,将deriving (Typeable)添加到所有相关的data子句中)。 -
@n.m 感谢您的解释并随时回答,以便我可以“接受”它!还要感谢您澄清向 typeclass 添加约束没有帮助:)
-
但是你为什么需要这个?在每个特定实例中,您知道类型——您只是在实例声明中写下它!
标签: haskell