Stefan O'Rear wrote:
> On Sat, Aug 11, 2007 at 03:00:04PM -0400, Ronald Guida wrote:
>> The question remains: "What is special about Monad or ArrowApply,
>> compared to Arrow?" or "What is more general about Arrow, compared
>> to Monad or ArrowApply?"
>
> If all you have is an Arrow, then you must make up your mind what
> you're going to do ahead of time.
>
> ArrowChoice gives you the ability to make basic "yes or no"
> decisions at run time.
>
> ArrowApply gives you arbitrary computed jumps.

OK, so I thought this through.

To summarize the classes of arrows:

1. Arrow is a device for sequencing side-effects in a fixed order.

> If all you have is an Arrow, then you must make up your mind what
> you're going to do ahead of time.

2. ArrowChoice is a device for sequencing side-effects in a fixed
  order with options.  Some effects can be selected at run-time, but
  (1) the available choices are fixed at compile-time and (2) options
  have to be selected before running the arrow computation.

> ArrowChoice gives you the ability to make basic "yes or no"
> decisions at run time.
BUT, you have to make these decisions before you run the arrow
computation.

3. ArrowApply is a device for sequencing side-effects, such that
  functions can dynamically choose side-effects at run-time based on
  intermediate results of arrow computations.

> ArrowApply gives you arbitrary computed jumps.

---

We know that ArrowApply is equivalent to Monad.

> Imagine trying to write an interpreter for a toy language with I/O,
> and IO is a plain Arrow and not a Monad.  You can read input and
> parse it, but you can't actually do IO because the IO you need to
> do, depends on the input you read - precisely what Arrow forbids!

Here's a toy language, described by a regular expression:
 0(10)*110

I want to read characters, one at a time, and eventually decide to
"Accept" or "Reject" a string.

Let me try to understand my options.

* With a simple Arrow, I can create a fixed sequence of "read"
  operations, and I can't act on the results (i.e. by choosing
  whether or not to keep reading) at run-time.

* With ArrowChoice, I can create a set of alternative paths for
  "read" operations, and I can choose a path at run-time, but I have
  to choose a fixed path /before/ I get to see any results.

* With ArrowApply, I can "read" one character and act on that
  character to choose what actions to perform next.  I can read
  characters until I can render an "Accept" or "Reject" decision.

Clearly, I need ArrowApply (or Monad) to get the job done.

In conclusion:

"What is special about Monad or ArrowApply, compared to Arrow?"
Arrow lets me sequence side-effects in a fixed order.  Monad lets me
dynamically choose side effects at run-time based on intermediate
results of previous side-effects.

-- Ron

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to