On 27 nov 2007, at 10:14, Reinier Lamers wrote:
Chris Eidhof wrote:
On 26 nov 2007, at 19:48, Henning Thielemann wrote:
I wonder whether it is a typical mistake of beginners
to write 'return' within a do-block (that is, not at the end)
and if it is possible to avoid this mistake by clever typing.
In a proper monad 'return' can be fused with subsequent actions,
and thus it is not necessary within a sequence of actions.
However, although sensible, 'return' is also not required at the
end of a block.
Has someone already thought about a replacement for monads?
I also made that mistake in the beginning, I used return instead
of lets. I don't think it's a big problem, most users will find
out once they've got some more experience, and it doesn't really
do any harm.
It might be possible for the compiler to emit a warning when a
return is used in the middle of a do block as the top level operator
on a line. OTOH, that still wouldn't catch something like "when (x
== 0) (return ())" which doesn't do what an imperative programmer
expects.
Well, there are two things about the return:
First, some people want to use return just as an imperative programmer
would use it: to exit from a function. So the programmer doesn't
expect the commands after that return are executed.
Second, the problem I had was that I didn't know how to do
computations with the data I got from the monad, for example:
> main = do
> myLine <- getLine
> reversed <- return $ unwords $ reverse $ words myLine
> putStrLn reversed
Instead of the 3rd line I could have written
> let reversed = unwords $ reverse $ words myLine
This is another problem, but it doesn't affect the computation,
whereas the first problem is more serious.
-chris
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe