On Thu, Aug 30, 2012 at 8:00 PM, Patrick Redmond <plredmond@gmail.com> wrote:
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.