Aaron McDaid wrote:
Apologies for referring to this old thread...

At least for me, this is not old. It is still very
much on my mind.

Simply, 'undefined >> undefined' is a bit more defined than simply
'undefined'. Just like 'undefined:undefined' is at least a non-empty
list; which can be matched by (_:_) for example. This explains the
differing behaviour of the two seemingly equivalent actions above.

I think you are correct. And that is the problem.

As a simple Haskell programmer, I am starting from
the fact that seq exists and works in a certain
way.

Given that reality, I want to look at what monads
should look like and what strictness properties they
should have.

Well, even with seq around, Haskell types and
functions still form a nice category - except you
have to be careful to use strict composition
instead of regular Haskell composition when
viewing Haskell functions as morphisms in
the category.

So then what is a monad? There is
one obvious extra requirement:

Monad Strictness Law:
(>>=) must be strict in its second argument.

That law follows from the monad law:

(>>= f) .! return = f

when we take f = _|_ (and we make the
assumption that our monad is not
degenerate - return x /= _|_ for some x).

Making (>>=) strict in the second argument
would be a very minor change. That
change would affect few, if any, existing
Haskell programs.

I am becoming convinced that this should be
considered a bug in IO.

Unfortunately, I don't think that fixing this
bug will help much with other known monad
strictness problems, such as the State/StateT
strictness bug.

Regards,
Yitz
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to