IO をアプリカティブとして見てみる。

IO の性質は Monad と一緒に出てくる。でも Applicative としても動くはず。
なので試してみた。

1. <$> = pure f <*> = fmap のケース (Functor)

      fmap F
 m a -----------> m b
  ↑       F      ↑
   a -----------> b
Prelude> :m Control.Applicative
Prelude>  ord <$> getChar
r
114

2. IO(a->b) を <*> で移すケース

       G <*> <------------- G ∈ m (a->b)
 m a -----------> m b
  ↑              ↑
   a -----------> b
Prelude> let g = do {c<-getLine;return(\x->c++"("++x++")")}
Prelude> :t g
g :: IO ([Char] -> [Char])
Prelude> g <*> getLine
func
ok
"func(ok)"

getLine が IO String 空間の元を生成するのと同じように g も IO(String->String) 空間の元を生成している。<*> によって IO String -> IO String の関数にシフトしている。