Haskell は純粋な関数型プログラミング言語です。Haskell では、すべての関数は純粋です (つまり、常に同じ入力に対して同じ出力を返します)。しかし、Haskell で副作用をどのように処理するのでしょうか? さて、この問題はモナドを使用することで見事に解決されます。
例として I/O を取り上げます。Haskell では、I/O を行うすべての関数が IO 計算、つまり IO モナドでの計算を返します。したがって、たとえば、キーボードから int を読み取る関数は、int を返す代わりに、実行時に int を生成する IO 計算を返します。
askForInt :: String -> IO Int
ではなく I/O 計算を返すため、Int
この結果を直接合計に使用することはできません。値にアクセスするにInt
は、計算を「アンラップ」する必要があります。これを行う唯一の方法は、バインド関数 ( >>=
) を使用することです。
(>>=) :: IO a -> (a -> IO b) -> IO b
これも IO 計算を返すため、常に I/O 計算になります。これが、Haskell が副作用を分離する方法です。IO モナドは、現実世界の状態の抽象化として機能します (実際、内部では通常RealWorld
、状態部分にちなんで名付けられた型で実装されています)。