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