2013-01-24 20 views
6

Czy można zaimplementować klasę typu następująco:Czy mogę rozróżnić wystąpienia typu typeclass w środowisku wykonawczym?

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

gdzie isEq x y wróci prawda kiedy x i y są zarówno sama instancja tej klasy typu?

Kontekst: To jest cienko zawoalowaną próbą coraz prób typu run-time. Na początku przeczytałem, że Haskell ma wymazanie tekstu, ale przeczytałem również, że z niedawnymi rozszerzeniami do GHC, niektóre informacje o czasie pracy tam.

edit: dla tych, zastanawiając się, o mój usecase ... Używam programowania typ poziomie, aby zapewnić pewne właściwości niektórych z moich ADTS, mianowicie obejmujących wykorzystanie zasobów. Zasoby te są reprezentowane przez różne typy (a blokady zasobów są odpowiednio wdrażane na poziomie typu).

jestem próby zapisu wyniku procesu optymalizacji, który wymaga identyfikacji zasobów pisania/czytania. Ale ponieważ wszystkie moje zasoby są reprezentowane przez odrębne single, których jedynym wspólnym czynnikiem (oprócz wszystkich wartości będących na dole) jest typeklass, który grupuje je razem.

W skrócie chcę wykorzystać wyniki mojego programowania typu szczebla w czasie wykonania, poziom wartości.

+9

Czy znasz [Data.Typeable] (http://hackage.haskell.org/packages/archive/base/latest/doc/html/Data-Typeable.html)? Wydaje się odpowiednie ... –

+1

To pytanie jest mylące. Wydaje się, że chcesz, a odpowiedzi dostarczają, sposób na rozróżnienie typów w czasie wykonywania. Interesuje mnie inne pytanie: czy można wyliczyć klasy zamieszkane przez określony typ w czasie wykonywania. –

+0

@ ThomasM.DuBuisson Nie ma ilościowe na typeclasses (czyli nie ma zmienne typeclass w Haskell), więc jest mało prawdopodobne. – permeakra

Odpowiedz

15

Można to zrobić, jak zasugerował Karolis Juodelė z 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 

Pytanie brzmi: Dlaczego nie znać w czasie wykonywania, jakie są typy, a następnie dlaczego zależy Ci czy są równe - czy możesz opracować swój przypadek użycia?

+11

whoa! Nie wiedziałem o składni ghci: '' {:} ', to świetnie: D – sinan

+1

" Dlaczego w czasie wykonywania nie wiesz, jakie są typy i dlaczego zależy ci na tym, czy są równe? " - Bardzo dobre pytanie. +1 – AndrewC

Powiązane problemy