2014-07-20 43 views

cevap

4

Aslında bağlamdan net değil.

, en typechecker oynamak

-- From the signature 
MaybeT . return . return :: a -> MaybeT a 
-- From the type of MaybeT 
return . return :: a -> m (Maybe a) 
-- From the type of `.` 
(return :: Maybe a -> m a) . (return :: a -> Maybe a) 

Let Ve her return türünü bir kez, "örnek seçimi algoritması" doğru ilk m s return kullanmayı tercih edecek ve ikinci Maybe olmak.

+0

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

+0

@Laar Teknik olarak evet, ama bu şekilde tedavi etmek daha kolay (ve ahlaki olarak eşdeğer). – jozefg

4

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.

İlgili konular