<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <!--Rendered using the Haskell Html Library v0.2--> <HTML ><HEAD ><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8" ><TITLE >Control.Arrow</TITLE ><LINK HREF="haddock.css" REL="stylesheet" TYPE="text/css" ><SCRIPT SRC="haddock-util.js" TYPE="text/javascript" ></SCRIPT ><SCRIPT TYPE="text/javascript" >window.onload = function () {setSynopsis("mini_Control-Arrow.html")};</SCRIPT ></HEAD ><BODY ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="topbar" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD ><IMG SRC="haskell_icon.gif" WIDTH="16" HEIGHT="16" ALT=" " ></TD ><TD CLASS="title" >base-4.1.0.0: Basic libraries</TD ><TD CLASS="topbut" ><A HREF="index.html" >Contents</A ></TD ><TD CLASS="topbut" ><A HREF="doc-index.html" >Index</A ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="modulebar" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD ><FONT SIZE="6" >Control.Arrow</FONT ></TD ><TD ALIGN="right" ><TABLE CLASS="narrow" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="infohead" >Portability</TD ><TD CLASS="infoval" >portable</TD ></TR ><TR ><TD CLASS="infohead" >Stability</TD ><TD CLASS="infoval" >experimental</TD ></TR ><TR ><TD CLASS="infohead" >Maintainer</TD ><TD CLASS="infoval" >libraries@haskell.org</TD ></TR ></TABLE ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="section4" ><B >Contents</B ></TD ></TR ><TR ><TD ><DL ><DT ><A HREF="#1" >Arrows </A ></DT ><DD ><DL ><DT ><A HREF="#2" >Derived combinators </A ></DT ><DT ><A HREF="#3" >Right-to-left variants </A ></DT ></DL ></DD ><DT ><A HREF="#4" >Monoid operations </A ></DT ><DT ><A HREF="#5" >Conditionals </A ></DT ><DT ><A HREF="#6" >Arrow application </A ></DT ><DT ><A HREF="#7" >Feedback </A ></DT ></DL ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="section1" >Description</TD ></TR ><TR ><TD CLASS="doc" >Basic arrow definitions, based on <EM >Generalising Monads to Arrows</EM >, by John Hughes, <EM >Science of Computer Programming</EM > 37, pp67-111, May 2000. plus a couple of definitions (<TT ><A HREF="Control-Arrow.html#v%3AreturnA" >returnA</A ></TT > and <TT ><A HREF="Control-Arrow.html#v%3Aloop" >loop</A ></TT >) from <EM >A New Notation for Arrows</EM >, by Ross Paterson, in <EM >ICFP 2001</EM >, Firenze, Italy, pp229-240. See these papers for the equations these combinators are expected to satisfy. These papers and more information on arrows can be found at <A HREF="http://www.haskell.org/arrows/" >http://www.haskell.org/arrows/</A >. </TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="section1" >Synopsis</TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="body" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="decl" ><SPAN CLASS="keyword" >class</SPAN > <A HREF="Control-Category.html#t%3ACategory" >Category</A > a => <A HREF="#t%3AArrow" >Arrow</A > a <SPAN CLASS="keyword" >where</SPAN ></TD ></TR ><TR ><TD CLASS="body" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="decl" ><A HREF="#v%3Aarr" >arr</A > :: (b -> c) -> a b c</TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3Afirst" >first</A > :: a b c -> a (b, d) (c, d)</TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3Asecond" >second</A > :: a b c -> a (d, b) (d, c)</TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3A%2A%2A%2A" >(***)</A > :: a b c -> a b' c' -> a (b, b') (c, c')</TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3A%26%26%26" >(&&&)</A > :: a b c -> a b c' -> a b (c, c')</TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><SPAN CLASS="keyword" >newtype</SPAN > <A HREF="#t%3AKleisli" >Kleisli</A > m a b = <A HREF="#v%3AKleisli" >Kleisli</A > {<TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="recfield" ><A HREF="#v%3ArunKleisli" >runKleisli</A > :: a -> m b</TD ></TR ></TABLE >}</TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3AreturnA" >returnA</A > :: <A HREF="Control-Arrow.html#t%3AArrow" >Arrow</A > a => a b b</TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3A%5E%3E%3E" >(^>>)</A > :: <A HREF="Control-Arrow.html#t%3AArrow" >Arrow</A > a => (b -> c) -> a c d -> a b d</TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3A%3E%3E%5E" >(>>^)</A > :: <A HREF="Control-Arrow.html#t%3AArrow" >Arrow</A > a => a b c -> (c -> d) -> a b d</TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3A%3C%3C%5E" >(<<^)</A > :: <A HREF="Control-Arrow.html#t%3AArrow" >Arrow</A > a => a c d -> (b -> c) -> a b d</TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3A%5E%3C%3C" >(^<<)</A > :: <A HREF="Control-Arrow.html#t%3AArrow" >Arrow</A > a => (c -> d) -> a b c -> a b d</TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><SPAN CLASS="keyword" >class</SPAN > <A HREF="Control-Arrow.html#t%3AArrow" >Arrow</A > a => <A HREF="#t%3AArrowZero" >ArrowZero</A > a <SPAN CLASS="keyword" >where</SPAN ></TD ></TR ><TR ><TD CLASS="body" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="decl" ><A HREF="#v%3AzeroArrow" >zeroArrow</A > :: a b c</TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><SPAN CLASS="keyword" >class</SPAN > <A HREF="Control-Arrow.html#t%3AArrowZero" >ArrowZero</A > a => <A HREF="#t%3AArrowPlus" >ArrowPlus</A > a <SPAN CLASS="keyword" >where</SPAN ></TD ></TR ><TR ><TD CLASS="body" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="decl" ><A HREF="#v%3A%3C%2B%3E" >(<+>)</A > :: a b c -> a b c -> a b c</TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><SPAN CLASS="keyword" >class</SPAN > <A HREF="Control-Arrow.html#t%3AArrow" >Arrow</A > a => <A HREF="#t%3AArrowChoice" >ArrowChoice</A > a <SPAN CLASS="keyword" >where</SPAN ></TD ></TR ><TR ><TD CLASS="body" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="decl" ><A HREF="#v%3Aleft" >left</A > :: a b c -> a (<A HREF="Data-Either.html#t%3AEither" >Either</A > b d) (<A HREF="Data-Either.html#t%3AEither" >Either</A > c d)</TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3Aright" >right</A > :: a b c -> a (<A HREF="Data-Either.html#t%3AEither" >Either</A > d b) (<A HREF="Data-Either.html#t%3AEither" >Either</A > d c)</TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3A%2B%2B%2B" >(+++)</A > :: a b c -> a b' c' -> a (<A HREF="Data-Either.html#t%3AEither" >Either</A > b b') (<A HREF="Data-Either.html#t%3AEither" >Either</A > c c')</TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3A%7C%7C%7C" >(|||)</A > :: a b d -> a c d -> a (<A HREF="Data-Either.html#t%3AEither" >Either</A > b c) d</TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><SPAN CLASS="keyword" >class</SPAN > <A HREF="Control-Arrow.html#t%3AArrow" >Arrow</A > a => <A HREF="#t%3AArrowApply" >ArrowApply</A > a <SPAN CLASS="keyword" >where</SPAN ></TD ></TR ><TR ><TD CLASS="body" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="decl" ><A HREF="#v%3Aapp" >app</A > :: a (a b c, b) c</TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><SPAN CLASS="keyword" >newtype</SPAN > <A HREF="Control-Arrow.html#t%3AArrowApply" >ArrowApply</A > a => <A HREF="#t%3AArrowMonad" >ArrowMonad</A > a b = <A HREF="#v%3AArrowMonad" >ArrowMonad</A > (a <A HREF="../ghc-prim/GHC-Unit.html#t%3A%28%29" >()</A > b)</TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3AleftApp" >leftApp</A > :: <A HREF="Control-Arrow.html#t%3AArrowApply" >ArrowApply</A > a => a b c -> a (<A HREF="Data-Either.html#t%3AEither" >Either</A > b d) (<A HREF="Data-Either.html#t%3AEither" >Either</A > c d)</TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><SPAN CLASS="keyword" >class</SPAN > <A HREF="Control-Arrow.html#t%3AArrow" >Arrow</A > a => <A HREF="#t%3AArrowLoop" >ArrowLoop</A > a <SPAN CLASS="keyword" >where</SPAN ></TD ></TR ><TR ><TD CLASS="body" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="decl" ><A HREF="#v%3Aloop" >loop</A > :: a (b, d) (c, d) -> a b c</TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3A%3E%3E%3E" >(>>>)</A > :: <A HREF="Control-Category.html#t%3ACategory" >Category</A > cat => cat a b -> cat b c -> cat a c</TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3A%3C%3C%3C" >(<<<)</A > :: <A HREF="Control-Category.html#t%3ACategory" >Category</A > cat => cat b c -> cat a b -> cat a c</TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="section1" ><A NAME="1" ><A NAME="1" >Arrows </A ></A ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="decl" ><SPAN CLASS="keyword" >class</SPAN > <A HREF="Control-Category.html#t%3ACategory" >Category</A > a => <A NAME="t:Arrow" ><A NAME="t%3AArrow" ></A ></A ><B >Arrow</B > a <SPAN CLASS="keyword" >where</SPAN ></TD ></TR ><TR ><TD CLASS="body" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="ndoc" ><P >The basic arrow class. </P ><P >Minimal complete definition: <TT ><A HREF="Control-Arrow.html#v%3Aarr" >arr</A ></TT > and <TT ><A HREF="Control-Arrow.html#v%3Afirst" >first</A ></TT >. </P ><P >The other combinators have sensible default definitions, which may be overridden for efficiency. </P ></TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="section4" >Methods</TD ></TR ><TR ><TD CLASS="body" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="decl" ><A NAME="v:arr" ><A NAME="v%3Aarr" ></A ></A ><B >arr</B > :: (b -> c) -> a b c</TD ></TR ><TR ><TD CLASS="doc" >Lift a function to an arrow. </TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A NAME="v:first" ><A NAME="v%3Afirst" ></A ></A ><B >first</B > :: a b c -> a (b, d) (c, d)</TD ></TR ><TR ><TD CLASS="doc" >Send the first component of the input through the argument arrow, and copy the rest unchanged to the output. </TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A NAME="v:second" ><A NAME="v%3Asecond" ></A ></A ><B >second</B > :: a b c -> a (d, b) (d, c)</TD ></TR ><TR ><TD CLASS="doc" ><P >A mirror image of <TT ><A HREF="Control-Arrow.html#v%3Afirst" >first</A ></TT >. </P ><P >The default definition may be overridden with a more efficient version if desired. </P ></TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A NAME="v:***" ><A NAME="v%3A%2A%2A%2A" ></A ></A ><B >(***)</B > :: a b c -> a b' c' -> a (b, b') (c, c')</TD ></TR ><TR ><TD CLASS="doc" ><P >Split the input between the two argument arrows and combine their output. Note that this is in general not a functor. </P ><P >The default definition may be overridden with a more efficient version if desired. </P ></TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A NAME="v:&&&" ><A NAME="v%3A%26%26%26" ></A ></A ><B >(&&&)</B > :: a b c -> a b c' -> a b (c, c')</TD ></TR ><TR ><TD CLASS="doc" ><P >Fanout: send the input to both argument arrows and combine their output. </P ><P >The default definition may be overridden with a more efficient version if desired. </P ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="section4" ><IMG SRC="minus.gif" CLASS="coll" ONCLICK="toggle(this,'i:Arrow')" ALT="show/hide" > Instances</TD ></TR ><TR ><TD CLASS="body" ><DIV ID="i:Arrow" STYLE="display:block;" ><TABLE CLASS="vanilla" CELLSPACING="1" CELLPADDING="0" ><TR ><TD CLASS="decl" ><A HREF="Control-Arrow.html#t%3AArrow" >Arrow</A > (->)</TD ></TR ><TR ><TD CLASS="decl" ><A HREF="Control-Monad.html#t%3AMonad" >Monad</A > m => <A HREF="Control-Arrow.html#t%3AArrow" >Arrow</A > (<A HREF="Control-Arrow.html#t%3AKleisli" >Kleisli</A > m)</TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="decl" ><SPAN CLASS="keyword" >newtype</SPAN > <A NAME="t:Kleisli" ><A NAME="t%3AKleisli" ></A ></A ><B >Kleisli</B > m a b </TD ></TR ><TR ><TD CLASS="body" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="ndoc" >Kleisli arrows of a monad. </TD ></TR ><TR ><TD CLASS="section4" >Constructors</TD ></TR ><TR ><TD CLASS="body" ><TABLE CLASS="vanilla" CELLSPACING="5" CELLPADDING="0" ><TR ><TD CLASS="arg" ><A NAME="v:Kleisli" ><A NAME="v%3AKleisli" ></A ></A ><B >Kleisli</B ></TD ><TD CLASS="rdoc" ></TD ></TR ><TR ><TD CLASS="body" COLSPAN="2" ><TABLE CLASS="vanilla" CELLSPACING="1" CELLPADDING="0" ><TR ><TD CLASS="arg" ><A NAME="v:runKleisli" ><A NAME="v%3ArunKleisli" ></A ></A ><B >runKleisli</B > :: a -> m b</TD ><TD CLASS="rdoc" ></TD ></TR ></TABLE ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="section4" ><IMG SRC="minus.gif" CLASS="coll" ONCLICK="toggle(this,'i:Kleisli')" ALT="show/hide" > Instances</TD ></TR ><TR ><TD CLASS="body" ><DIV ID="i:Kleisli" STYLE="display:block;" ><TABLE CLASS="vanilla" CELLSPACING="1" CELLPADDING="0" ><TR ><TD CLASS="decl" ><A HREF="Control-Monad.html#t%3AMonad" >Monad</A > m => <A HREF="Control-Category.html#t%3ACategory" >Category</A > (<A HREF="Control-Arrow.html#t%3AKleisli" >Kleisli</A > m)</TD ></TR ><TR ><TD CLASS="decl" ><A HREF="Control-Monad-Fix.html#t%3AMonadFix" >MonadFix</A > m => <A HREF="Control-Arrow.html#t%3AArrowLoop" >ArrowLoop</A > (<A HREF="Control-Arrow.html#t%3AKleisli" >Kleisli</A > m)</TD ></TR ><TR ><TD CLASS="decl" ><A HREF="Control-Monad.html#t%3AMonad" >Monad</A > m => <A HREF="Control-Arrow.html#t%3AArrowApply" >ArrowApply</A > (<A HREF="Control-Arrow.html#t%3AKleisli" >Kleisli</A > m)</TD ></TR ><TR ><TD CLASS="decl" ><A HREF="Control-Monad.html#t%3AMonad" >Monad</A > m => <A HREF="Control-Arrow.html#t%3AArrowChoice" >ArrowChoice</A > (<A HREF="Control-Arrow.html#t%3AKleisli" >Kleisli</A > m)</TD ></TR ><TR ><TD CLASS="decl" ><A HREF="Control-Monad.html#t%3AMonadPlus" >MonadPlus</A > m => <A HREF="Control-Arrow.html#t%3AArrowPlus" >ArrowPlus</A > (<A HREF="Control-Arrow.html#t%3AKleisli" >Kleisli</A > m)</TD ></TR ><TR ><TD CLASS="decl" ><A HREF="Control-Monad.html#t%3AMonadPlus" >MonadPlus</A > m => <A HREF="Control-Arrow.html#t%3AArrowZero" >ArrowZero</A > (<A HREF="Control-Arrow.html#t%3AKleisli" >Kleisli</A > m)</TD ></TR ><TR ><TD CLASS="decl" ><A HREF="Control-Monad.html#t%3AMonad" >Monad</A > m => <A HREF="Control-Arrow.html#t%3AArrow" >Arrow</A > (<A HREF="Control-Arrow.html#t%3AKleisli" >Kleisli</A > m)</TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="section2" ><A NAME="2" ><A NAME="2" >Derived combinators </A ></A ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="decl" ><A NAME="v:returnA" ><A NAME="v%3AreturnA" ></A ></A ><B >returnA</B > :: <A HREF="Control-Arrow.html#t%3AArrow" >Arrow</A > a => a b b</TD ></TR ><TR ><TD CLASS="doc" >The identity arrow, which plays the role of <TT ><A HREF="Control-Monad.html#v%3Areturn" >return</A ></TT > in arrow notation. </TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="decl" ><A NAME="v:^>>" ><A NAME="v%3A%5E%3E%3E" ></A ></A ><B >(^>>)</B > :: <A HREF="Control-Arrow.html#t%3AArrow" >Arrow</A > a => (b -> c) -> a c d -> a b d</TD ></TR ><TR ><TD CLASS="doc" >Precomposition with a pure function. </TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="decl" ><A NAME="v:>>^" ><A NAME="v%3A%3E%3E%5E" ></A ></A ><B >(>>^)</B > :: <A HREF="Control-Arrow.html#t%3AArrow" >Arrow</A > a => a b c -> (c -> d) -> a b d</TD ></TR ><TR ><TD CLASS="doc" >Postcomposition with a pure function. </TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="section2" ><A NAME="3" ><A NAME="3" >Right-to-left variants </A ></A ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="decl" ><A NAME="v:<<^" ><A NAME="v%3A%3C%3C%5E" ></A ></A ><B >(<<^)</B > :: <A HREF="Control-Arrow.html#t%3AArrow" >Arrow</A > a => a c d -> (b -> c) -> a b d</TD ></TR ><TR ><TD CLASS="doc" >Precomposition with a pure function (right-to-left variant). </TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="decl" ><A NAME="v:^<<" ><A NAME="v%3A%5E%3C%3C" ></A ></A ><B >(^<<)</B > :: <A HREF="Control-Arrow.html#t%3AArrow" >Arrow</A > a => (c -> d) -> a b c -> a b d</TD ></TR ><TR ><TD CLASS="doc" >Postcomposition with a pure function (right-to-left variant). </TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="section1" ><A NAME="4" ><A NAME="4" >Monoid operations </A ></A ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="decl" ><SPAN CLASS="keyword" >class</SPAN > <A HREF="Control-Arrow.html#t%3AArrow" >Arrow</A > a => <A NAME="t:ArrowZero" ><A NAME="t%3AArrowZero" ></A ></A ><B >ArrowZero</B > a <SPAN CLASS="keyword" >where</SPAN ></TD ></TR ><TR ><TD CLASS="body" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="section4" >Methods</TD ></TR ><TR ><TD CLASS="body" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="decl" ><A NAME="v:zeroArrow" ><A NAME="v%3AzeroArrow" ></A ></A ><B >zeroArrow</B > :: a b c</TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="section4" ><IMG SRC="minus.gif" CLASS="coll" ONCLICK="toggle(this,'i:ArrowZero')" ALT="show/hide" > Instances</TD ></TR ><TR ><TD CLASS="body" ><DIV ID="i:ArrowZero" STYLE="display:block;" ><TABLE CLASS="vanilla" CELLSPACING="1" CELLPADDING="0" ><TR ><TD CLASS="decl" ><A HREF="Control-Monad.html#t%3AMonadPlus" >MonadPlus</A > m => <A HREF="Control-Arrow.html#t%3AArrowZero" >ArrowZero</A > (<A HREF="Control-Arrow.html#t%3AKleisli" >Kleisli</A > m)</TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="decl" ><SPAN CLASS="keyword" >class</SPAN > <A HREF="Control-Arrow.html#t%3AArrowZero" >ArrowZero</A > a => <A NAME="t:ArrowPlus" ><A NAME="t%3AArrowPlus" ></A ></A ><B >ArrowPlus</B > a <SPAN CLASS="keyword" >where</SPAN ></TD ></TR ><TR ><TD CLASS="body" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="section4" >Methods</TD ></TR ><TR ><TD CLASS="body" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="decl" ><A NAME="v:<+>" ><A NAME="v%3A%3C%2B%3E" ></A ></A ><B >(<+>)</B > :: a b c -> a b c -> a b c</TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="section4" ><IMG SRC="minus.gif" CLASS="coll" ONCLICK="toggle(this,'i:ArrowPlus')" ALT="show/hide" > Instances</TD ></TR ><TR ><TD CLASS="body" ><DIV ID="i:ArrowPlus" STYLE="display:block;" ><TABLE CLASS="vanilla" CELLSPACING="1" CELLPADDING="0" ><TR ><TD CLASS="decl" ><A HREF="Control-Monad.html#t%3AMonadPlus" >MonadPlus</A > m => <A HREF="Control-Arrow.html#t%3AArrowPlus" >ArrowPlus</A > (<A HREF="Control-Arrow.html#t%3AKleisli" >Kleisli</A > m)</TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="section1" ><A NAME="5" ><A NAME="5" >Conditionals </A ></A ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="decl" ><SPAN CLASS="keyword" >class</SPAN > <A HREF="Control-Arrow.html#t%3AArrow" >Arrow</A > a => <A NAME="t:ArrowChoice" ><A NAME="t%3AArrowChoice" ></A ></A ><B >ArrowChoice</B > a <SPAN CLASS="keyword" >where</SPAN ></TD ></TR ><TR ><TD CLASS="body" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="ndoc" >Choice, for arrows that support it. This class underlies the <TT >if</TT > and <TT >case</TT > constructs in arrow notation. Any instance must define <TT ><A HREF="Control-Arrow.html#v%3Aleft" >left</A ></TT >. The other combinators have sensible default definitions, which may be overridden for efficiency. </TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="section4" >Methods</TD ></TR ><TR ><TD CLASS="body" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="decl" ><A NAME="v:left" ><A NAME="v%3Aleft" ></A ></A ><B >left</B > :: a b c -> a (<A HREF="Data-Either.html#t%3AEither" >Either</A > b d) (<A HREF="Data-Either.html#t%3AEither" >Either</A > c d)</TD ></TR ><TR ><TD CLASS="doc" >Feed marked inputs through the argument arrow, passing the rest through unchanged to the output. </TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A NAME="v:right" ><A NAME="v%3Aright" ></A ></A ><B >right</B > :: a b c -> a (<A HREF="Data-Either.html#t%3AEither" >Either</A > d b) (<A HREF="Data-Either.html#t%3AEither" >Either</A > d c)</TD ></TR ><TR ><TD CLASS="doc" ><P >A mirror image of <TT ><A HREF="Control-Arrow.html#v%3Aleft" >left</A ></TT >. </P ><P >The default definition may be overridden with a more efficient version if desired. </P ></TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A NAME="v:+++" ><A NAME="v%3A%2B%2B%2B" ></A ></A ><B >(+++)</B > :: a b c -> a b' c' -> a (<A HREF="Data-Either.html#t%3AEither" >Either</A > b b') (<A HREF="Data-Either.html#t%3AEither" >Either</A > c c')</TD ></TR ><TR ><TD CLASS="doc" ><P >Split the input between the two argument arrows, retagging and merging their outputs. Note that this is in general not a functor. </P ><P >The default definition may be overridden with a more efficient version if desired. </P ></TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A NAME="v:|||" ><A NAME="v%3A%7C%7C%7C" ></A ></A ><B >(|||)</B > :: a b d -> a c d -> a (<A HREF="Data-Either.html#t%3AEither" >Either</A > b c) d</TD ></TR ><TR ><TD CLASS="doc" ><P >Fanin: Split the input between the two argument arrows and merge their outputs. </P ><P >The default definition may be overridden with a more efficient version if desired. </P ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="section4" ><IMG SRC="minus.gif" CLASS="coll" ONCLICK="toggle(this,'i:ArrowChoice')" ALT="show/hide" > Instances</TD ></TR ><TR ><TD CLASS="body" ><DIV ID="i:ArrowChoice" STYLE="display:block;" ><TABLE CLASS="vanilla" CELLSPACING="1" CELLPADDING="0" ><TR ><TD CLASS="decl" ><A HREF="Control-Arrow.html#t%3AArrowChoice" >ArrowChoice</A > (->)</TD ></TR ><TR ><TD CLASS="decl" ><A HREF="Control-Monad.html#t%3AMonad" >Monad</A > m => <A HREF="Control-Arrow.html#t%3AArrowChoice" >ArrowChoice</A > (<A HREF="Control-Arrow.html#t%3AKleisli" >Kleisli</A > m)</TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="section1" ><A NAME="6" ><A NAME="6" >Arrow application </A ></A ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="decl" ><SPAN CLASS="keyword" >class</SPAN > <A HREF="Control-Arrow.html#t%3AArrow" >Arrow</A > a => <A NAME="t:ArrowApply" ><A NAME="t%3AArrowApply" ></A ></A ><B >ArrowApply</B > a <SPAN CLASS="keyword" >where</SPAN ></TD ></TR ><TR ><TD CLASS="body" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="ndoc" >Some arrows allow application of arrow inputs to other inputs. </TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="section4" >Methods</TD ></TR ><TR ><TD CLASS="body" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="decl" ><A NAME="v:app" ><A NAME="v%3Aapp" ></A ></A ><B >app</B > :: a (a b c, b) c</TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="section4" ><IMG SRC="minus.gif" CLASS="coll" ONCLICK="toggle(this,'i:ArrowApply')" ALT="show/hide" > Instances</TD ></TR ><TR ><TD CLASS="body" ><DIV ID="i:ArrowApply" STYLE="display:block;" ><TABLE CLASS="vanilla" CELLSPACING="1" CELLPADDING="0" ><TR ><TD CLASS="decl" ><A HREF="Control-Arrow.html#t%3AArrowApply" >ArrowApply</A > (->)</TD ></TR ><TR ><TD CLASS="decl" ><A HREF="Control-Monad.html#t%3AMonad" >Monad</A > m => <A HREF="Control-Arrow.html#t%3AArrowApply" >ArrowApply</A > (<A HREF="Control-Arrow.html#t%3AKleisli" >Kleisli</A > m)</TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="decl" ><SPAN CLASS="keyword" >newtype</SPAN > <A HREF="Control-Arrow.html#t%3AArrowApply" >ArrowApply</A > a => <A NAME="t:ArrowMonad" ><A NAME="t%3AArrowMonad" ></A ></A ><B >ArrowMonad</B > a b </TD ></TR ><TR ><TD CLASS="body" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="ndoc" >The <TT ><A HREF="Control-Arrow.html#t%3AArrowApply" >ArrowApply</A ></TT > class is equivalent to <TT ><A HREF="Control-Monad.html#t%3AMonad" >Monad</A ></TT >: any monad gives rise to a <TT ><A HREF="Control-Arrow.html#t%3AKleisli" >Kleisli</A ></TT > arrow, and any instance of <TT ><A HREF="Control-Arrow.html#t%3AArrowApply" >ArrowApply</A ></TT > defines a monad. </TD ></TR ><TR ><TD CLASS="section4" >Constructors</TD ></TR ><TR ><TD CLASS="body" ><TABLE CLASS="vanilla" CELLSPACING="1" CELLPADDING="0" ><TR ><TD CLASS="arg" ><A NAME="v:ArrowMonad" ><A NAME="v%3AArrowMonad" ></A ></A ><B >ArrowMonad</B > (a <A HREF="../ghc-prim/GHC-Unit.html#t%3A%28%29" >()</A > b)</TD ><TD CLASS="rdoc" ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="section4" ><IMG SRC="minus.gif" CLASS="coll" ONCLICK="toggle(this,'i:ArrowMonad')" ALT="show/hide" > Instances</TD ></TR ><TR ><TD CLASS="body" ><DIV ID="i:ArrowMonad" STYLE="display:block;" ><TABLE CLASS="vanilla" CELLSPACING="1" CELLPADDING="0" ><TR ><TD CLASS="decl" ><A HREF="Control-Arrow.html#t%3AArrowApply" >ArrowApply</A > a => <A HREF="Control-Monad.html#t%3AMonad" >Monad</A > (<A HREF="Control-Arrow.html#t%3AArrowMonad" >ArrowMonad</A > a)</TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="decl" ><A NAME="v:leftApp" ><A NAME="v%3AleftApp" ></A ></A ><B >leftApp</B > :: <A HREF="Control-Arrow.html#t%3AArrowApply" >ArrowApply</A > a => a b c -> a (<A HREF="Data-Either.html#t%3AEither" >Either</A > b d) (<A HREF="Data-Either.html#t%3AEither" >Either</A > c d)</TD ></TR ><TR ><TD CLASS="doc" >Any instance of <TT ><A HREF="Control-Arrow.html#t%3AArrowApply" >ArrowApply</A ></TT > can be made into an instance of <TT ><A HREF="Control-Arrow.html#t%3AArrowChoice" >ArrowChoice</A ></TT > by defining <TT ><A HREF="Control-Arrow.html#v%3Aleft" >left</A ></TT > = <TT ><A HREF="Control-Arrow.html#v%3AleftApp" >leftApp</A ></TT >. </TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="section1" ><A NAME="7" ><A NAME="7" >Feedback </A ></A ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="decl" ><SPAN CLASS="keyword" >class</SPAN > <A HREF="Control-Arrow.html#t%3AArrow" >Arrow</A > a => <A NAME="t:ArrowLoop" ><A NAME="t%3AArrowLoop" ></A ></A ><B >ArrowLoop</B > a <SPAN CLASS="keyword" >where</SPAN ></TD ></TR ><TR ><TD CLASS="body" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="ndoc" >The <TT ><A HREF="Control-Arrow.html#v%3Aloop" >loop</A ></TT > operator expresses computations in which an output value is fed back as input, even though the computation occurs only once. It underlies the <TT >rec</TT > value recursion construct in arrow notation. </TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="section4" >Methods</TD ></TR ><TR ><TD CLASS="body" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="decl" ><A NAME="v:loop" ><A NAME="v%3Aloop" ></A ></A ><B >loop</B > :: a (b, d) (c, d) -> a b c</TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="section4" ><IMG SRC="minus.gif" CLASS="coll" ONCLICK="toggle(this,'i:ArrowLoop')" ALT="show/hide" > Instances</TD ></TR ><TR ><TD CLASS="body" ><DIV ID="i:ArrowLoop" STYLE="display:block;" ><TABLE CLASS="vanilla" CELLSPACING="1" CELLPADDING="0" ><TR ><TD CLASS="decl" ><A HREF="Control-Arrow.html#t%3AArrowLoop" >ArrowLoop</A > (->)</TD ></TR ><TR ><TD CLASS="decl" ><A HREF="Control-Monad-Fix.html#t%3AMonadFix" >MonadFix</A > m => <A HREF="Control-Arrow.html#t%3AArrowLoop" >ArrowLoop</A > (<A HREF="Control-Arrow.html#t%3AKleisli" >Kleisli</A > m)</TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="decl" ><A NAME="v:>>>" ><A NAME="v%3A%3E%3E%3E" ></A ></A ><B >(>>>)</B > :: <A HREF="Control-Category.html#t%3ACategory" >Category</A > cat => cat a b -> cat b c -> cat a c</TD ></TR ><TR ><TD CLASS="doc" >Left-to-right composition </TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="decl" ><A NAME="v:<<<" ><A NAME="v%3A%3C%3C%3C" ></A ></A ><B >(<<<)</B > :: <A HREF="Control-Category.html#t%3ACategory" >Category</A > cat => cat b c -> cat a b -> cat a c</TD ></TR ><TR ><TD CLASS="doc" >Right-to-left composition </TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="botbar" >Produced by <A HREF="http://www.haskell.org/haddock/" >Haddock</A > version 2.4.2</TD ></TR ></TABLE ></BODY ></HTML >