Al sınıfı Functor
:Tip sınıflarında tip kurucuların herhangi bir avantajı var mı? örneğin
class Functor a
instance Functor Maybe
İşte
Maybe
bir tür yapıcı olduğunu.
Ama biz başka iki yolla yapabilirsiniz:
Öncelikle, çok parametreli tip sınıfları kullanarak:
class MultiFunctor a e
instance MultiFunctor (Maybe a) a
İkincisi kullanarak tipi aileleri:
class MonoFunctor a
instance MonoFunctor (Maybe a)
type family Element
type instance Element (Maybe a) a
Şimdi bariz bir tane var Son iki yöntemin avantajı, yani şu gibi şeyler yapmamıza izin verir:
instance Text Char
Veya:
instance Text
type instance Element Text Char
yüzden monomorfik konteynerlerin çalışabilirsiniz.
İkinci avantaj, son parametresi olan type parametresine sahip olmayan tiplerin örneklerini yapabilmemizdir. biz Either
stil türünü yapmak ama etrafında tipleri yanlış şekilde koymak Diyelim:
data Silly t errorT = Silly t errorT
instance Functor Silly -- oh no we can't do this without a newtype wrapper
instance MultiFunctor (Silly t errorT) t
Oysa gayet iyi çalışıyor ve
instance MonoFunctor (Silly t errorT)
type instance Element (Silly t errorT) t
da iyidir.
Bu tip esneklik tanımlarında yalnızca tam türlerin (tip imzaları değil) kullanılmasıyla ilgili bu esneklik avantajları göz önüne alındığında, GHC kullandığınızı ve uzantıları kullanmayı düşünmediğiniz varsayılarak orijinal stil tanımını kullanmanın bir nedeni var mıdır? Yani, bir tip kurucuyu, çok tipli tip sınıflarla veya tip ailelerle yapamayacağınız bir tip sınıfında tam bir tip değil, özel bir şey yapabiliyor musunuz?
Geleneksel yaklaşımla, özellikle de basit bir örnekle, tip ailelerle elde edilemeyen objektif hakkında daha fazla bilgi verir misiniz? – Clinton
@ Clinton: Bunu düşündüm; 'lens' _could_ muhtemelen bir '* -> * -> Constraint 'functor sınıfı ile ifade edilebilir (oldukça garip de olsa). Farklı bir örnek ekledim. – leftaroundabout