Haskell 我可以在运行时区分typeclass实例吗?

Haskell 我可以在运行时区分typeclass实例吗?,haskell,type-level-computation,Haskell,Type Level Computation,是否可以按如下方式实现类型类: class SomeClass e where isEq :: (SomeClass e') => e -> e' -> Bool 其中isEq x y在x和y都是此类型类的相同实例时将返回true 上下文:这是获取运行时类型测试的一次不加掩饰的尝试。虽然我一开始读到Haskell有类型擦除,但我也读到了GHC最近的扩展,其中包含了一些运行时信息 编辑:对于那些想知道我的用例的人。。。我一直在使用类型级编程来确保我的一些ADT的某些属性

是否可以按如下方式实现类型类:

class SomeClass e where
    isEq :: (SomeClass e') => e -> e' -> Bool
其中
isEq x y
x
y
都是此类型类的相同实例时将返回true

上下文:这是获取运行时类型测试的一次不加掩饰的尝试。虽然我一开始读到Haskell有类型擦除,但我也读到了GHC最近的扩展,其中包含了一些运行时信息

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

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


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

正如Karolis Juodelė所暗示的那样,您可以使用
数据来实现这一点。可键入的

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

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

您知道吗?似乎相关…这个问题具有误导性。您似乎想要并且答案提供了一种在运行时区分类型的方法。我对另一个问题感兴趣:是否可以在运行时枚举特定类型所居住的类。@ThomasM.DuBuisson类型类没有量化(即haskell中没有类型类变量),因此不太可能。@permeakra不要急于回答,有提示显然是可能的(解释或JIT编译Haskell提供了运行时知识的效果)。问题更多:有没有比我们已经知道的可怕的黑客更好的方法?@ThomasM.DuBuisson好的,让我这样说:编译的模块不包含这样的信息。Typeclass实例在运行时作为字典传递。哇!我不知道ghci的
:{:}
语法,太棒了:D“为什么在运行时不知道类型是什么,为什么关心它们是否相等?”-很好的问题。+1