
On Thu, Aug 30, 2012 at 11:09 PM, David McBride
It is a syntatic sugar that is expanded to
getLine >>= \x -> putStrLn $ reverse x
= is defined in the typeclass for Monad.
Interesting. Does that mean the lines following a "x <- getLine" are simply balled up into a function? What if there are multiple lines? main = do fn <- getLine ln <- getLine putStr $ reverse ln putStr " " putStr $ reverse fn
In general, if something is using <- notation, it's type is Monad m => m a, where m could be any of many monads, IO, Maybe, [] (lists), Parser or even some type of yours that you made an instance of Monad, which you can do if you would like to use that syntax.
I thought it might start to get at monads..
On Thu, Aug 30, 2012 at 11:10 PM, Tony Morris
The (<-) symbol is syntax, so doesn't really have a type and probably shouldn't be thought of as having one.
It's more like, given the expression that appears to its right of the type (m a) implies that the value to its left is of the type a.
And then that implication is realized through the syntactic
transformation which occurs when (<-) is desugared..? I'll keep
reading.
On Thu, Aug 30, 2012 at 11:54 PM, Karl Voelker
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.)
I've taken a pl class in which we learned that "let <name> = <expr1> in <expr2>" is implemented by expanding to something like "(\<name> -> <expr2>) <expr1>", so I'm familiar with this, but I appreciate your making the parallel to (<-). Thanks!