是否可以按如下方式实现类型类:
class SomeClass e where
isEq :: (SomeClass e') => e -> e' -> Bool
当isEq x y
和x
都是此类型类的相同实例时,y
将返回true?
上下文:这是一次获得运行时类型测试的薄薄尝试。虽然起初我读过Haskell有类型擦除,但我也读过GHC最近的扩展,那里有一些运行时信息。
编辑:对于那些想知道我的用例的人......我一直在使用类型级编程来确保某些ADT的某些属性,即涉及资源使用。这些资源由不同类型表示(因此资源锁在类型级别实现)。
我正在尝试编写一个需要识别资源写入/读取的优化过程。但由于我的所有资源都由不同的单例表示,其唯一的共同因素(除了所有值都是底部)是将它们组合在一起的类型类。
简而言之,我想在运行时,值级别使用我的类型级编程的结果。
答案 0 :(得分:15)
正如KarolisJuodelė在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
问题是:为什么你不会在运行时知道这些类型是什么,然后你为什么要关心它们是否平等 - 你能详细说明你的用例吗?