2011-12-31 16 views
13
class Monad m where 
    return :: a -> m a 
    (>>=) :: m a -> (a -> m b) -> m b 
    (>>) :: m a -> m b -> m b 
    m >> n = m >>= \_ -> n 

    fail :: String -> m a 

Daha önce hiç yazmadan önce bir denklem (veya işlev bildirimi?) Görmedim. Tipnotta neden bir denklem var?Monad'ın beyanında "m >> n = m >> = _ -> n" lambda notasyonu ile bu denklem nedir?

Biliyorum _ bir öğeyi eşleştirmek için kullanılan bir terimdir. ama ne m >> = \ _ -> n maçı?

+1

Sadece fark ettim ki, \\ _ -> n ** ilk parametreyi atar. – snow

cevap

17

Bu yöntem için varsayılan bir uygulama. Örnek bildiriminiz (>>) açık bir uygulama içermiyorsa, kullanılacak tanım budur. Bazı yöntemler başka bir yöntem kullanılarak uygulanabiliyorsa, varsayılan yöntemler yaygındır, ancak bazı veri türleri için potansiyel olarak daha verimli uygulamalar olabilir.

m >>= \_ -> n 

bağımsız değişkenini göz ardı eder ve n olursa olsun ile döner beslenir m arasında 'sonucu' anlamına gelir. Ayrıca efektleri ile monads bağlamında

m >>= const n 

yazılmış olabilir, bu daha sonra n yapmak m dönüş değeri etkilere sahip fakat görmezden yok 'bulunuyor. (>>)'un orada olması gerekiyor.

İlgili konular