【问题标题】:Haskell: typeclass deriving from other typeclassHaskell:从其他类型类派生的类型类
【发布时间】: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


【解决方案1】:

不,这是不可能的。

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

instance Persistent (Maybe Integer) where ...

因此,谈论“将deriving (Typeable) 子句添加到恰好是Persistent 的所有as ”没有多大意义。不能说data Maybe Integer deriving Typeable 或类似的话。


如果您绝对确定每个Persistent 事物必须Typeable,您可能需要向您的Persistent 类添加一个约束: p>

class Typeable a => Persistent a where ...

但是,这对自动派生Typeable 没有任何帮助。 要求对于每个 Persistent 实例都应该有一个 Typeable 实例,您仍然必须以一种或另一种方式自己生成(例如,通过将 deriving (Typeable) 添加到所有相关数据类型) .

【讨论】:

  • Typeable 可能是一个特殊的例子,因为在现代 GHC 中,所有内容都隐含地属于 Typeable 类,而 deriving Typeable 是无操作的。因此,超类约束已经足够好并且实际上是“免费的”,除了传递字典的运行时成本。
猜你喜欢
  • 1970-01-01
  • 2011-10-09
  • 1970-01-01
  • 2017-08-13
  • 2011-05-24
  • 1970-01-01
  • 2014-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多