私はいくつかの入門的な 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 つの関数を使用できるようにしているのでしょうか?