arrows-0.4: Arrow classes and transformersSource codeContentsIndex
Control.Arrow.Operations
Portabilitynon-portable (multi-parameter type classes)
Stabilityexperimental
Maintainerross@soi.city.ac.uk
Contents
Conventions
State transformers
State readers
Monoid writers
Errors
Synchronous circuits
Description

Subclasses of Arrow providing additional operations.

The signatures are designed to be compatible with the proposed notation for arrows, cf. http://www.haskell.org/arrows/.

Synopsis
class Arrow a => ArrowState s a | a -> s where
fetch :: a e s
store :: a s ()
class Arrow a => ArrowReader r a | a -> r where
readState :: a b r
newReader :: a e b -> a (e, r) b
class (Monoid w, Arrow a) => ArrowWriter w a | a -> w where
write :: a w ()
newWriter :: a e b -> a e (b, w)
class Arrow a => ArrowError ex a | a -> ex where
raise :: a ex b
handle :: a e b -> a (e, ex) b -> a e b
tryInUnless :: a e b -> a (e, b) c -> a (e, ex) c -> a e c
newError :: a e b -> a e (Either ex b)
tryInUnlessDefault :: (ArrowError ex a, ArrowChoice a) => a e b -> a (e, b) c -> a (e, ex) c -> a e c
class ArrowLoop a => ArrowCircuit a where
delay :: b -> a b b
Conventions

The arrow classes defined in this module have names like ArrowFoo, and contain operations specific to such arrows. Some of these include a method newFoo, which maps computations to computations of the same arrow type, but exposing some of the internals of the arrow.

Arrow transformers have names like BarArrow, and are instances of appropriate arrow classes. For each arrow transformer, there is typically an encapsulation operator runBar that removes that transformer from the outside of an arrow type. The Control.Arrow.Transformer.lift method of the Control.Arrow.Transformer.ArrowTransformer class adds an arrow transformer to the outside of an arrow type.

Typically a composite arrow type is built by applying a series of arrow transformers to a base arrow (usually either a function arrow or a Kleisli arrow. The Control.Arrow.Transformer.lift method and the runBar function operate only on the arrow transformer at the top of this stack. For more sophisticated manipulation of this stack of arrow transformers, many arrow transformers provide an ArrowAddBar class, with methods methods liftBar and elimBar to add and remove the transformer anywhere in the stack.

State transformers
class Arrow a => ArrowState s a | a -> s whereSource
An arrow type that provides a modifiable state, based of section 9 of Generalising Monads to Arrows, by John Hughes, Science of Computer Programming 37:67-111, May 2000.
Methods
fetch :: a e sSource
Obtain the current value of the state.
store :: a s ()Source
Assign a new value to the state.
show/hide Instances
State readers
class Arrow a => ArrowReader r a | a -> r whereSource
An arrow type that provides a read-only state (an environment). If you also need to modify the state, use ArrowState.
Methods
readState :: a b rSource
Obtain the current value of the state.
newReader :: a e b -> a (e, r) bSource

Run a subcomputation in the same arrow, but with a different environment. The environment of the outer computation is unaffected.

Typical usage in arrow notation:

	proc p -> ...
		(|newReader cmd|) env
show/hide Instances
Monoid writers
class (Monoid w, Arrow a) => ArrowWriter w a | a -> w whereSource
An arrow type that collects additional output (of some Monoid type).
Methods
write :: a w ()Source
Add a piece of additional output.
newWriter :: a e b -> a e (b, w)Source

Run a subcomputation in the same arrow, making its additional output accessible.

Typical usage in arrow notation:

	proc p -> do
		...
		(value, output) <- (|newWriter cmd|)
show/hide Instances
Errors
class Arrow a => ArrowError ex a | a -> ex whereSource

An arrow type that includes errors (or exceptions).

Minimal definition: raise and tryInUnless.

TODO: the operations here are inconsistent with other arrow transformers.

Methods
raise :: a ex bSource
Raise an error.
handleSource
::
=> a e bcomputation that may raise errors
-> a (e, ex) bcomputation to handle errors
-> a e b

Traditional exception construct.

Typical usage in arrow notation:

	proc p -> ...
		body `handle` \ex -> handler
tryInUnlessSource
::
=> a e bcomputation that may raise errors
-> a (e, b) ccomputation to receive successful results
-> a (e, ex) ccomputation to handle errors
-> a e c

Exception construct in the style of Exceptional Syntax, by Nick Benton and Andrew Kennedy, JFP 11(4):395-410, July 2001.

Typical usage in arrow notation:

	proc p -> ...
		(|tryInUnless
			body
			(\res -> success)
			(\ex -> handler)
		|)
newError :: a e b -> a e (Either ex b)Source
Handler that returns the error as a value.
show/hide Instances
tryInUnlessDefaultSource
:: (ArrowError ex a, ArrowChoice a)
=> a e bcomputation that may raise errors
-> a (e, b) ccomputation to receive successful results
-> a (e, ex) ccomputation to handle errors
-> a e c
A suitable value for tryInUnless when the arrow type belongs to ArrowChoice. To use it, you must define either handle or newError.
Synchronous circuits
class ArrowLoop a => ArrowCircuit a whereSource
An arrow type that can be used to interpret synchronous circuits.
Methods
delaySource
::
=> bthe value to return initially.
-> a b ban arrow that propagates its input with a one-tick delay.
A delay component.
show/hide Instances
Produced by Haddock version 2.3.0