Haskell-モナド

Monadsいくつかの追加機能を備えた一種のアプリケーションファンクターに他なりません。これは、として知られている3つの基本的なルールを管理する型クラスです。monadic rules

3つのルールはすべて、次のようなモナド宣言に厳密に適用されます。

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

モナド宣言に適用される3つの基本法は次のとおりです。

  • Left Identity Lawreturn関数は値を変更せず、モナド内の何も変更しないはずです。「return> => mf = mf」と表現できます。

  • Right Identity Lawreturn関数は値を変更せず、モナド内の何も変更しないはずです。「mf> => return = mf」と表現できます。

  • Associativity−この法則によれば、ファンクターとモナドインスタンスの両方が同じように機能する必要があります。数学的には「(f> ==> g)> => h = f> =>(g> = h)」と表すことができます。

最初の2つの法則は同じ点を繰り返します。つまり、 return の両側でアイデンティティの動作が必要です bind オペレーター。

前の例では、モナドであることに気付かずに、すでに多くのモナドを使用しています。リストモナドを使用して特定のリストを生成している次の例について考えてみます。

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

このコードは次の出力を生成します-

[2,6,10,14,18]