2014-06-22 16 views
6

Po przeczytaniu artykułu Scrap your type classes ponownie zaimplementowałem niektóre z przedstawionych pomysłów. Robiąc to natknąłem się na coś naprawdę dziwnego: Klasa Typu - Typ może być używana jako ograniczenie typu! Moje pytanie: dlaczego tak jest?Typy danych klas typu

mój kod:

{-# LANGUAGE Rank2Types #-} 

data IFunctor f = IFunctor { 
    _fmap :: forall a b. (a -> b) -> f a -> f b 
} 

-- this type checks... 
_fmap2 :: IFunctor f => (a -> b) -> f (f a) -> f (f b) 
_fmap2 = \inst -> _fmap inst . _fmap inst 

W GHCi dodaje coś się dzieje:

>>> :t _fmap2 :: IFunctor f => (a -> b) -> f (f a) -> f (f b) 
_fmap2 :: IFunctor f => (a -> b) -> f (f a) -> f (f b) 
     :: IFunctor f -> (a -> b) -> f (f a) -> f (f b) 
+7

To tylko błąd. – augustss

+0

@augustss Czy zostało zgłoszone? Jeśli tak, to gdzie? – rightfold

+1

Którą wersję GHC masz? – augustss

Odpowiedz

1

To nie działa na GHC 7.8.2. Daje błąd Expected a constraint, but ‘IFunctor f’ has kind ‘*’.

Starsze wersje GHC miały błąd, w którym zezwalały na używanie w pewnych sytuacjach =>, takich jak ->. Jest tak prawdopodobnie dlatego, że wewnętrzne ograniczenia klasy typów są przekazywane jako argumenty w postaci słowników metod.