
On Thu, Aug 30, 2012 at 8:00 PM, Patrick Redmond
IO actions are given liberal coverage throughout the chapter, however it is never mentioned whether the value-extractor syntax (<-) has a type or not.
What sorts of things have types? Values have types, but x <- getLine is not a value. I will elaborate.
main = do x <- getLine putStrLn $ reverse x
As mentioned by others, this can be de-sugared into: main = getLine >>= \x -> putStrLn $ reverse x
In this little program, getLine has type "IO String" and x has type "String". This implies to me that (<-) has type "IO a -> a". However, GHCI chokes on ":t (<-)" and Hoogle says it's just a syntactic element http://www.haskell.org/haskellwiki/Keywords#.3C-.
You are right about the types of getLine and x. But look at the part of the de-sugared code that corresponds to x <- getLine: getLine >>= \x -> This isn't an expression. In fact, it's nothing valid on its own. Since you can't evaluate it to a value, don't expect it to have a type. I guess I don't have a specific question, but I was kind of expecting
it to be a function with a type because everything seems to be a function with a type in Haskell... Thanks for listening!
There are other things in Haskell which don't have a type. Here's something very similar to your example: foo = let x = 3 in x + x Does "let x = 3" have a type? Does the "=" in there have a type? (The answer is no, and the reasons are basically the same.) -Karl V.