
On Wed, 2009-02-04 at 23:13 +0200, Tymur Porkuian wrote:
Actually, I understand these types in terms of containers that override standard method of function application for their contents.
Huh? You can't actually over-ride function application --- Haskell's built-in application always does exactly the same thing, at every type. You can, however, define new application-like operators that have other application-like behaviors. Haskell has a few of these: * return * (<$>) * (<*>) * (>>=)
In fact, there may be no contents, or several items, or nothing at all, or something strange, but the container behaves like there is a value of some type inside it.
In these terms: Maybe - container that may or may not contain something [a] - container that contains several values and applies function to all of them State - container that has some other "secondary" value in it. IO - container that remembers passed functions and later will ask user for value, then apply functions to it.
Nice but irrelevant. And I think your definition of IO is wrong.
* Monad: A monad M allows a function of n arguments (for n >= 0) to be applied to n M values; in addition, if the function returns an M value itself, you can combine that result with the arguments in a sensible way.
Here, what does "sensible" mean?
Sensible. As in, the definition of `join' in your monad can't be senseless, or irrelevant to the monad's intended use.
What do we override?
join
Also, would it be right to say that Arrow is a container for functions that overrides function chaining?
No. jcc