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 の関数にシフトしている。