Я работаю над некоторыми вводными материалами Haskell и в настоящее время переживаю Монады. Я концептуально понимаю, что оператор >>=
имеет тип:Haskell: Смутно о типе `>> =` operator
(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' is'() '(единица или пустой кортеж). Таким образом, тип лямбда - 'String -> IO()' – Mephy