【问题标题】:Can I differentiate between typeclass instances at runtime?我可以在运行时区分类型类实例吗?
【发布时间】:2013-01-24 08:41:02
【问题描述】:

是否可以如下实现一个类型类:

class SomeClass e where
    isEq :: (SomeClass e') => e -> e' -> Bool

xy 都是该类型类的同一个实例时,isEq x y 会在哪里返回 true?

上下文:这是一种获得运行时类型测试的隐蔽尝试。起初我读到 Haskell 具有类型擦除功能,但我也读到了最近对 GHC 的扩展,其中包含一些运行时信息。

编辑:对于那些想知道我的用例的人...我一直在使用类型级编程来确保我的一些 ADT 的某些属性,即涉及资源使用。这些资源由不同的类型表示(资源锁相应地在类型级别实现)。

我正在尝试编写一个需要识别资源写入/读取的优化过程。但是由于我所有的资源都由不同的单例表示,其唯一的共同因素(除了所有值都是底部)是将它们组合在一起的类型类。

简而言之,我想在运行时、值级别使用我的类型级别编程的结果。

【问题讨论】:

  • 你知道Data.Typeable吗?似乎相关...
  • 这个问题具有误导性。您似乎想要并且答案提供了一种在运行时区分类型的方法。我对另一个问题感兴趣:是否可以在运行时枚举特定类型所包含的类。
  • @ThomasM.DuBuisson 没有对类型类进行量化(即 haskell 中没有类型类变量),因此不太可能。
  • @permeakra 不要急于回答,有提示显然是可以的(Haskell 的解释或 JIT 编译给出了运行时知识的效果)。问题更多:有没有比我们已经知道的可怕黑客更好的方法?
  • @ThomasM.DuBuisson 好吧,让我这样说:编译的模块不包含此类信息。类型类实例在运行时作为字典传递。

标签: haskell type-level-computation


【解决方案1】:

正如 Karolis Juodelė 所暗示的那样,您可以通过 Data.Typeable 来做到这一点:

Prelude Data.Typeable> :{
Prelude Data.Typeable| let isEq :: (Typeable a , Typeable b) => a -> b -> Bool
Prelude Data.Typeable|     isEq x y = typeOf x == typeOf y
Prelude Data.Typeable| :}
Prelude Data.Typeable> isEq True ()
False
Prelude Data.Typeable> isEq True False
True

问题是:为什么您在运行时不知道类型是什么,然后又为什么要关心它们是否相等——您能详细说明您的用例吗?

【讨论】:

  • 哇!我不知道 ghci 的 :{ :} 语法,这很棒:D
  • “为什么你在运行时不知道类型是什么,你为什么要关心它们是否相等?” - 非常好的问题。 +1
猜你喜欢
  • 1970-01-01
  • 2016-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-14
  • 1970-01-01
  • 2018-08-28
  • 1970-01-01
相关资源
最近更新 更多