generated at
IOモナド
IOモナドは副作用を扱い、その副作用がIOモナドの外にもれないように、一度IOモナドの中にいれた値は原則として取り出すことはできない
「副作用を伴う」という文脈を扱う
PureScriptでは、「Effectモナド」と言う(たぶん)

型のイメージ
hs
type IO a = World -> (a, World)
これはあくまでもイメージ
内部実装は処理系の裏側に隠されている
Stateモナドと同じ様に考えられる

実装
hs
instance Monad IO where m >> k = m >>= \ _ -> k return = returnIO (>>=) = bindIO fail s = failIO s


架空の定義 ref
hs
newtype IO a = IO (RealWorld -> (RealWorld, a)) instance Monad IO where return a = IO $ \w -> (w, a) (IO h) >>= f = IO $ \w -> let (nw, a) = h w (IO g) = f a in g nw


関連する関数
putStrLn :: String -> IO ()
引数の文字列を画面に出力し、改行する
putStr
引数の文字列を画面に出力し、改行しない
putChar
引数の文字を画面に出力する
print :: Show a => a -> IO ()
引数の値を文字列化し、画面に出力する
putStrLn . show と同じ
getLine :: IO String
入力を一行読み込む
hs
name <- getLine -- 一行読んで変数nameに束縛


IOモナド変換子は定義できない?
>HaskellのIO操作の実行は他の関数やモナドに勝手に入れ子にしてはならず、IOモナドでのみ可能になっているからです。 ref





参考
命令をデータとして表現する
なに?
IO野中を覗く