2013-01-24 69 views
6

是否有可能實現一個類型類,如下所示:我可以在運行時區分類型實例嗎?

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

在當xy都是這種類型的類的同一個實例isEq x y將返回true?

上下文:這是獲取運行時類型測試的一個細微的嘗試。雖然起初我讀到Haskell已經進行了類型擦除,但我最近也讀到了GHC的擴展,那裏有一些運行時信息。

編輯:對於那些想知道我的用例的人...我一直在使用type-level編程來確保某些ADT的某些屬性,即涉及資源使用情況。這些資源由不同的類型表示(並且資源鎖相應地在類型級別實現)。

我正在嘗試編寫一個需要識別資源寫入/讀取的優化過程。但是由於我所有的資源都是由不同的單身人士代表的,他們唯一的共同因素(除了所有的價值都是底部)是將他們歸類在一起的類型類別。

簡而言之,我想在運行時的價值級別上使用我的類型級編程的結果。

+9

您是否知道[Data.Typeable](http://hackage.haskell.org/packages/archive/base/latest/doc/html/Data-Typeable.html)?似乎有關... –

+1

問題是誤導。你似乎想要的,並提供了答案,一種在運行時區分類型的方法。我對另一個問題感興趣:是否可以在運行時枚舉特定類型居住的類。 –

+0

@ ThomasM.DuBuisson對類型類沒有定量(即haskell中沒有類型類變量),所以不太可能。 – permeakra

回答

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 

的問題是是否它們是平等的 - 你能否詳細說明你的用例?

+11

哇!我不知道':{:}'ghci的語法,這太好了:D – sinan

+1

「爲什麼你不知道運行時類型是什麼,爲什麼你會關心它們是否相等? - 非常好的問題。 +1 – AndrewC

相關問題