"I am wary of all papers with the term 'Monad' in it. I've stated it before, if your operators are solely determined by unit and bind, I cannot trust you're thinking straight. I.e.,
> unit: a -> M a
> bind: M b -> (b -> M a) -> M a
It is trivial to note that any result object is a value in 'M a' and, in the absence of observers, you cannot state anything meaningful about that value. (Absurdly, for any 'a', 'M a' might denote a singleton set - everything is mapped to the same value - for instance.)
So, sure, you can chain effect types but you do not know anything in a formal mathematical sense about the result value.
I have already stated that Haskell's IO paradigm predominantly relies on the/this fact that a Monad acts as a logical sink. Everything is supposedly pure since you cannot even express what an impure computation even does (worse, it is categorical mathematical sloppiness which makes it work.) At least, Clean's uniqueness types gives you that; moreover, that extends to formal efficient treatment of 'impure' data structures."
(Taken from a post of me somewhere on the internet.)