2014-06-22 5 views
6

Scrap your type classes numaralı makaleyi okuduktan sonra, gösterilen fikirlerin bazılarını yeniden uyguladık. Bunu yaparken gerçekten garip bir şeyle karşılaştım: Tip Sınıfı - Tip, tip kısıtlaması olarak kullanılabilir! Benim sorum: Neden bu?Tip Sınıfı Veri Türleri

Benim 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 

GHCi yılında şu şey olur:

>>> :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

Bu sadece bir hatadır. – augustss

+0

@augustss Rapor edildi mi? Öyleyse nerede? – rightfold

+1

Hangi ghc versiyonunuz var? – augustss

cevap

1

Bu ghc 7.8.2 çalışmaz. Expected a constraint, but ‘IFunctor f’ has kind ‘*’ hatasını verir.

GHC'nin eski sürümlerinde, belirli durumlarda -> gibi kullanılacak => izin verilen bir hata vardı. Bunun nedeni büyük olasılıkla dahili tip sınıf kısıtlarının metod sözlükleri biçiminde argüman olarak geçmesidir.