top page > computer > haskell > web_lecture > for_programmer > io.html
更新日:
文責: 重城良国

IO型

(工事中 60%)

はじめに

IOMcn型と(>>>), arr, appでやりたいことは全部できる。全部できるがIOMcn型やその道具はもっとスマートな形になおせる。

入力か引数か

iomcn_io.hs

IOMcn a b
a -> IOMcn () b

のふたつが相互に変換可能であるということを示す。a型の値を入力とする機械とa型の値を引数として機械を返す関数とが同じ意味であるということだ。

入力を引数にする

IOMcn a b

の入力aを外に出して関数の引数とする。つまり

a -> IOMcn () b

とする関数を書く。

outArg :: IOMcn a b -> a -> IOMcn () b
outArg m x = arr (const x) >>> m

値xを出力する機械を作りそれと機械mとをつなげている。

引数を入力にする

a -> IOMcn () b

の引数aを入力にする。つまり

IOMcn a b

という機械にする関数を作る。

inArg :: (a -> IOMcn () b) -> IOMcn a b
inArg f = arr (\x -> (f x, ())) >>> app

まずは

\x -> (f x, ()) :: a -> (IOMcn () b, ())

を作る。これを機械にする。

arr (\x -> (f x, ())) :: IOMcn a (IOMcn () b, ())

IOMcn () bに()を入力値として与えるために機械appにつなぐ。

arr (\x -> (f x, ()))) >>> app :: IOMcn a b

IO型

IOMcn a b
a -> IOMcn () b

のふたつは同じものと考えられる。a型の値を入力するとb型の値を出力する機械をa型の値を引数として「b型の値を出力する機械」を返り値とする関数に変換できる。

IOMcn a b

という機械をすべて

a -> IOMcn () b

という形に統一し

type IO = IOMcn ()

のようにすることができる。

道具の変換

outArg, inArgを使うことで

(>>>) :: IOMcn a b -> IOMcn b c -> IOMcn a c
arr :: (a -> b) -> IOMcn a b

のふたつを

(>=>) :: (a -> IO b) -> (b -> IO c) -> (a -> IO c)
arr' :: (a -> b) -> (a -> IO b)

におきかえられる。これらはモナド関数と同じことだ。

(>>=) :: IO a -> (a -> IO b) -> IO b
return :: a -> IO a

機械に値をわたす機械も変換する。

app :: IOMcn (IOMcn a b, a) b

(a -> IO b, a) -> IO b

となるがこれはたんなる関数適用なのでわざわざ定義する必要はない。

IO型の機械の例

文字列を表示する機械に

putStrLn :: String -> IO ()

がある。これはインターフェイスとしては文字列をとって機械を返す関数となっている。しかし、本質的にはIOMcn String ()である。文字列を入力値とする機械をoutArgで変換して「文字列を引数とし機械を返り値とする関数」として公開されている。

% ghci
Prelude> putStrLn "Hello"
Hello

対話環境は評価された値が機械だったときにはそれを「実行」する。入力についても試してみよう。

% ghci
Prelude> getLine
hello
"hello"

型クラスMonad

IOはモナドなのでMonadクラスのインスタンスである。do記法が使える。

some :: IO ()
some = do
str <- getLine
putStrLn str

手続き型言語のように見える。

まとめ

IOモナドを説明するためにIOMcnという型を導入した。IOMcnのインターフェイスは

(>>>) :: IOMcn a b -> IOMcn b c -> IOMcn a c
arr :: (a -> b) -> IOMcn a b
app :: IOMcn (IOMcn a b, a) b

のみっつだ。IOMcnを変換することでIOが導きだせる。IOはモナドだ。

(>>=) :: IO a -> (a -> IO b) -> IO b
return :: a -> IO a

HaskellではこのようなIO型が採用されている。

「IOMcn型: まとめ」へもどる 「1から学ぶHaskell」トップへ

正当なCSSです! HTML5 Powered with CSS3 / styling, and Semantics