Я прорабатываю некоторые вводные материалы по Haskell и в настоящее время изучаю Monads. Я концептуально понимаю, что оператор >>=
имеет тип:
(Monad m) => m a -> (a -> m b) -> m b
.
В этом контексте я не понимаю, почему следующий код работает, то есть почему он не приводит к несоответствию типов:
main = getLine >>= \xs -> putStrLn xs
Поскольку мы знаем, что getLine :: IO String
, я бы предположил, что он может быть «связан» с функцией типа String -> IO String
. Однако putStrLn
относится к другому типу: putStrLn :: String -> IO ()
.
Так почему же Haskell позволяет нам использовать >>=
с этими двумя функциями?
a
— этоString
,m
— этоIO
, аb
— это()
(единица или пустой кортеж). Таким образом, тип лямбдаString -> IO ()
- person Mephy   schedule 14.10.2014