Haskell - Monadlar

Monadsbazı ekstra özelliklere sahip bir Uygulama İşlevi türünden başka bir şey değildir. Olarak bilinen üç temel kuralı yöneten bir Tip sınıfıdırmonadic rules.

Üç kuralın tümü, aşağıdaki gibi bir Monad beyannamesi için kesinlikle geçerlidir:

class Monad m where  
   return :: a -> m a 
   (>>=) :: m a -> (a -> m b) -> m b 
   (>>) :: m a -> m b -> m b 
   x >> y = x >>= \_ -> y 
   fail :: String -> m a  
   fail msg = error msg

Bir Monad beyannamesi için geçerli olan üç temel yasa şunlardır:

  • Left Identity Law - returnişlevi değeri değiştirmez ve Monad'da hiçbir şeyi değiştirmemelidir. "Return> => mf = mf" olarak ifade edilebilir.

  • Right Identity Law - returnişlevi değeri değiştirmez ve Monad'da hiçbir şeyi değiştirmemelidir. "Mf> => return = mf" olarak ifade edilebilir.

  • Associativity- Bu yasaya göre, hem Functors hem de Monad örneği aynı şekilde çalışmalıdır. Matematiksel olarak "(f> ==> g)> => h = f> => (g> = h)" şeklinde ifade edilebilir.

İlk iki yasa aynı noktayı yineler, yani a return her iki tarafında da kimlik davranışı olmalıdır bind Şebeke.

Daha önceki örneklerimizde Monad olduklarını fark etmeden çok sayıda Monad kullandık. Belirli bir liste oluşturmak için List Monad kullandığımız aşağıdaki örneği düşünün.

main = do
   print([1..10] >>= (\x -> if odd x then [x*2] else []))

Bu kod aşağıdaki çıktıyı üretecektir -

[2,6,10,14,18]