私はいくつかの入門的な Haskell 資料に取り組んでおり、現在モナドを検討しています。>>=
演算子が次のタイプであることを概念的に理解しています。
(Monad m) => m a -> (a -> m b) -> m b
.
そのコンテキストでは、次のコードが機能する理由、つまり型の不一致が発生しない理由について混乱しています。
main = getLine >>= \xs -> putStrLn xs
がわかっているのでgetLine :: IO String
、 type の関数で「バインド」できると思いString -> IO String
ます。ただしputStrLn
、タイプは異なります: putStrLn :: String -> IO ()
.
では、なぜ Haskell は>>=
これら 2 つの関数を使用できるようにしているのでしょうか?