Gerekli türleri girer.
Biz MaybeT :: m (Maybe a) -> MaybeT a
(bir fonksiyonu olarak alınmıştır), biz return
s iç yığın olmalıdır bildiğimize
returnMaybeT :: Monad m => a -> MaybeT m a
returnMaybeT x = MaybeT (return (return x))
tanımlamak çalışıyoruz bir instance
tanımının anlamından açık tip
return (return x) :: Monad m => a -> m (Maybe a)
Şimdi, return
gibi bir türü olan bir polimorfik fonksiyonu olduğunu biliyoruz
için
. Bu ilk return
durumunda, Monad m =>
kısıtlaması bize m
'un Monad
olduğunu ve böylece geri dönüş tanımını kullanabileceğimizi bildirir. Bu bize iç return
return x :: a -> Maybe a
aşağı tüm yol almak sağlar ve biz Maybe
bir Monad
örneği olduğunu biliyoruz çünkü biz bundan return
kullanabilirsiniz.
Sonuçta, tüm derleyici yapması gereken whittle onun yolu, her return
ihtiyaç türlerini belirlemeye çalışıyor ifade aşağıda. Gerekli türü belirledikten sonra, bu tür için Monad
örneğini bildiğini kontrol etmek zorundadır. Bu, beton olduğu için Maybe
için basit, ancak sadece bir değişken olduğundan m
için biraz daha zor. biz kesinlikle Monad
başlatır bazı tipi olmak değişkeni kısıtlı çünkü
nedeni m
çalışır.
Son satırdaki ilk dönüş, "Belki a -> m (Belki a)" ya da "b ~ Belki a" ile daha genel "b -> m b" türünde yazılmalıdır. – Laar
@Laar Teknik olarak evet, ama bu şekilde tedavi etmek daha kolay (ve ahlaki olarak eşdeğer). – jozefg