
On Wed, Jun 10, 2015 at 12:35 PM, Mike Houghton wrote: asString ioStr = do
str <- ioStr
return $ str and the compiler tells me its signature is asString :: forall (m :: * -> *) b. Monad m => m b -> m b which, at this stage of my Haskell progress, is just pure Voodoo.
Why isn’t it’s signature asString :: IO String -> String ? Because the only thing it knows about ioStr is that it is a monadic action.
IO is not the only monad, nor even the only useful monad. And "do" syntax
including <- is not specific to IO.
That said, most of the type signature it showed you is only important if
you are doing advanced things like type level programming. The short
version of that type signature is
asString :: Monad m -> m b -> m b
asString ioStr = str where str <- ioStr and then compiler says
parse error on input ‘<-’ <- is part of "do" syntax, it cannot be used by itself like that.
Just to give you some idea of what's really going on, let me show you that
first one without the "do" syntax:
asString ioStr = ioStr >>= (\s -> return $ s)
(Let me additionally note that the "$" does nothing whatsoever in either
case, and can and should be left out. Moreover, (x >>= \y -> return y) is
just a long-winded way of writing (x).)
--
brandon s allbery kf8nh sine nomine associates
allbery.b@gmail.com ballbery@sinenomine.net
unix, openafs, kerberos, infrastructure, xmonad http://sinenomine.net