[Takusen] working out how to use bind variables

Jason Dagit dagit at codersbase.com
Thu Aug 12 15:52:33 EDT 2010


On Thu, Aug 12, 2010 at 8:09 AM, Michael Litchard <michael at schmong.org>wrote:

> It works, but I am confused about the final return.
> My understanding is that return takes a computation from one monad,
> and puts it in another . In this case IO (). But the pattern I have
> seen is this,
>
> return $ some computation
>
> so when I see
>
> return ()
>
> I am not sure what that means.
>

Let's start with the type of return:
return :: Monad m => a -> m a

It simply takes a value and put it into the monad.  For monads that are
containers, like Maybe a, return is extremely simple.  For example:
return x = Just x

And () is just a value of type () (pronounced as "unit").

So for the Maybe monad, return () = Just (), with type Maybe ().

In other words, it just puts unit into the monad.

In the context of the IO monad, IO () is the type of a monadic action that
may have side effects but does not produce a meaningful value.  Which is
exactly what main does.  It has a side effect, but it doesn't produce any
value that your program can use.  Similarly for print:
print :: Show a => a -> IO ()

You could do this if you really wanted to:
checkUnit = do
  () <- print "Hello, World!"
  return ()

Or, even give the result a name:
namedUnit = do
  x <- print "Hello, World!"
  return x

HTH,
Jason
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://projects.haskell.org/pipermail/takusen/attachments/20100812/067510ff/attachment.htm 


More information about the Takusen mailing list