Sophie

Sophie

distrib > Mageia > 5 > i586 > media > core-release > by-pkgid > 6e204a966e8c42d976f99a1700ce5f20 > files > 2213

ghc-7.4.2-4.mga5.i586.rpm

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>Control.Arrow</title><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean" /><script src="haddock-util.js" type="text/javascript"></script><script type="text/javascript">//<![CDATA[
window.onload = function () {pageLoad();setSynopsis("mini_Control-Arrow.html");};
//]]>
</script></head><body><div id="package-header"><ul class="links" id="page-menu"><li><a href="index.html">Contents</a></li><li><a href="doc-index.html">Index</a></li></ul><p class="caption">base-4.5.1.0: Basic libraries</p></div><div id="content"><div id="module-header"><table class="info"><tr><th>Portability</th><td>portable</td></tr><tr><th>Stability</th><td>provisional</td></tr><tr><th>Maintainer</th><td>libraries@haskell.org</td></tr><tr><th>Safe Haskell</th><td>Trustworthy</td></tr></table><p class="caption">Control.Arrow</p></div><div id="table-of-contents"><p class="caption">Contents</p><ul><li><a href="#g:1">Arrows
</a><ul><li><a href="#g:2">Derived combinators
</a></li><li><a href="#g:3">Right-to-left variants
</a></li></ul></li><li><a href="#g:4">Monoid operations
</a></li><li><a href="#g:5">Conditionals
</a></li><li><a href="#g:6">Arrow application
</a></li><li><a href="#g:7">Feedback
</a></li></ul></div><div id="description"><p class="caption">Description</p><div class="doc"><p>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 (<code><a href="Control-Arrow.html#v:returnA">returnA</a></code> and <code><a href="Control-Arrow.html#v:loop">loop</a></code>) from
  * <em>A New Notation for Arrows</em>, by Ross Paterson, in <em>ICFP 2001</em>,
    Firenze, Italy, pp229-240.
 These papers and more information on arrows can be found at
 <a href="http://www.haskell.org/arrows/">http://www.haskell.org/arrows/</a>.
</p></div></div><div id="synopsis"><p id="control.syn" class="caption expander" onclick="toggleSection('syn')">Synopsis</p><ul id="section.syn" class="hide" onclick="toggleSection('syn')"><li class="src short"><span class="keyword">class</span> <a href="Control-Category.html#t:Category">Category</a> a =&gt; <a href="#t:Arrow">Arrow</a> a  <span class="keyword">where</span><ul class="subs"><li><a href="#v:arr">arr</a> ::  (b -&gt; c) -&gt; a b c</li><li><a href="#v:first">first</a> ::  a b c -&gt; a (b, d) (c, d)</li><li><a href="#v:second">second</a> ::  a b c -&gt; a (d, b) (d, c)</li><li><a href="#v:-42--42--42-">(***)</a> ::  a b c -&gt; a b' c' -&gt; a (b, b') (c, c')</li><li><a href="#v:-38--38--38-">(&amp;&amp;&amp;)</a> ::  a b c -&gt; a b c' -&gt; a b (c, c')</li></ul></li><li class="src short"><span class="keyword">newtype</span>  <a href="#t:Kleisli">Kleisli</a> m a b = <a href="#v:Kleisli">Kleisli</a> {<ul class="subs"><li><a href="#v:runKleisli">runKleisli</a> :: a -&gt; m b</li></ul>}</li><li class="src short"><a href="#v:returnA">returnA</a> :: <a href="Control-Arrow.html#t:Arrow">Arrow</a> a =&gt; a b b</li><li class="src short"><a href="#v:-94--62--62-">(^&gt;&gt;)</a> :: <a href="Control-Arrow.html#t:Arrow">Arrow</a> a =&gt; (b -&gt; c) -&gt; a c d -&gt; a b d</li><li class="src short"><a href="#v:-62--62--94-">(&gt;&gt;^)</a> :: <a href="Control-Arrow.html#t:Arrow">Arrow</a> a =&gt; a b c -&gt; (c -&gt; d) -&gt; a b d</li><li class="src short"><a href="#v:-62--62--62-">(&gt;&gt;&gt;)</a> :: <a href="Control-Category.html#t:Category">Category</a> cat =&gt; cat a b -&gt; cat b c -&gt; cat a c</li><li class="src short"><a href="#v:-60--60--60-">(&lt;&lt;&lt;)</a> :: <a href="Control-Category.html#t:Category">Category</a> cat =&gt; cat b c -&gt; cat a b -&gt; cat a c</li><li class="src short"><a href="#v:-60--60--94-">(&lt;&lt;^)</a> :: <a href="Control-Arrow.html#t:Arrow">Arrow</a> a =&gt; a c d -&gt; (b -&gt; c) -&gt; a b d</li><li class="src short"><a href="#v:-94--60--60-">(^&lt;&lt;)</a> :: <a href="Control-Arrow.html#t:Arrow">Arrow</a> a =&gt; (c -&gt; d) -&gt; a b c -&gt; a b d</li><li class="src short"><span class="keyword">class</span> <a href="Control-Arrow.html#t:Arrow">Arrow</a> a =&gt; <a href="#t:ArrowZero">ArrowZero</a> a  <span class="keyword">where</span><ul class="subs"><li><a href="#v:zeroArrow">zeroArrow</a> ::  a b c</li></ul></li><li class="src short"><span class="keyword">class</span> <a href="Control-Arrow.html#t:ArrowZero">ArrowZero</a> a =&gt; <a href="#t:ArrowPlus">ArrowPlus</a> a  <span class="keyword">where</span><ul class="subs"><li><a href="#v:-60--43--62-">(&lt;+&gt;)</a> ::  a b c -&gt; a b c -&gt; a b c</li></ul></li><li class="src short"><span class="keyword">class</span> <a href="Control-Arrow.html#t:Arrow">Arrow</a> a =&gt; <a href="#t:ArrowChoice">ArrowChoice</a> a  <span class="keyword">where</span><ul class="subs"><li><a href="#v:left">left</a> ::  a b c -&gt; a (<a href="Data-Either.html#t:Either">Either</a> b d) (<a href="Data-Either.html#t:Either">Either</a> c d)</li><li><a href="#v:right">right</a> ::  a b c -&gt; a (<a href="Data-Either.html#t:Either">Either</a> d b) (<a href="Data-Either.html#t:Either">Either</a> d c)</li><li><a href="#v:-43--43--43-">(+++)</a> ::  a b c -&gt; a b' c' -&gt; a (<a href="Data-Either.html#t:Either">Either</a> b b') (<a href="Data-Either.html#t:Either">Either</a> c c')</li><li><a href="#v:-124--124--124-">(|||)</a> ::  a b d -&gt; a c d -&gt; a (<a href="Data-Either.html#t:Either">Either</a> b c) d</li></ul></li><li class="src short"><span class="keyword">class</span> <a href="Control-Arrow.html#t:Arrow">Arrow</a> a =&gt; <a href="#t:ArrowApply">ArrowApply</a> a  <span class="keyword">where</span><ul class="subs"><li><a href="#v:app">app</a> ::  a (a b c, b) c</li></ul></li><li class="src short"><span class="keyword">newtype</span>  <a href="#t:ArrowMonad">ArrowMonad</a> a b = <a href="#v:ArrowMonad">ArrowMonad</a> (a <a href="../ghc-prim-0.2.0.0/GHC-Tuple.html#t:-40--41-">()</a> b)</li><li class="src short"><a href="#v:leftApp">leftApp</a> :: <a href="Control-Arrow.html#t:ArrowApply">ArrowApply</a> a =&gt; a b c -&gt; a (<a href="Data-Either.html#t:Either">Either</a> b d) (<a href="Data-Either.html#t:Either">Either</a> c d)</li><li class="src short"><span class="keyword">class</span> <a href="Control-Arrow.html#t:Arrow">Arrow</a> a =&gt; <a href="#t:ArrowLoop">ArrowLoop</a> a  <span class="keyword">where</span><ul class="subs"><li><a href="#v:loop">loop</a> ::  a (b, d) (c, d) -&gt; a b c</li></ul></li></ul></div><div id="interface"><h1 id="g:1">Arrows
</h1><div class="top"><p class="src"><span class="keyword">class</span> <a href="Control-Category.html#t:Category">Category</a> a =&gt; <a name="t:Arrow" class="def">Arrow</a> a  <span class="keyword">where</span></p><div class="doc"><p>The basic arrow class.
</p><p>Minimal complete definition: <code><a href="Control-Arrow.html#v:arr">arr</a></code> and <code><a href="Control-Arrow.html#v:first">first</a></code>, satisfying the laws
</p><ul><li><pre><code><a href="Control-Arrow.html#v:arr">arr</a></code> id = <code><a href="Control-Category.html#v:id">id</a></code></pre></li><li><pre><code><a href="Control-Arrow.html#v:arr">arr</a></code> (f &gt;&gt;&gt; g) = <code><a href="Control-Arrow.html#v:arr">arr</a></code> f &gt;&gt;&gt; <code><a href="Control-Arrow.html#v:arr">arr</a></code> g</pre></li><li><pre><code><a href="Control-Arrow.html#v:first">first</a></code> (<code><a href="Control-Arrow.html#v:arr">arr</a></code> f) = <code><a href="Control-Arrow.html#v:arr">arr</a></code> (<code><a href="Control-Arrow.html#v:first">first</a></code> f)</pre></li><li><pre><code><a href="Control-Arrow.html#v:first">first</a></code> (f &gt;&gt;&gt; g) = <code><a href="Control-Arrow.html#v:first">first</a></code> f &gt;&gt;&gt; <code><a href="Control-Arrow.html#v:first">first</a></code> g</pre></li><li><pre><code><a href="Control-Arrow.html#v:first">first</a></code> f &gt;&gt;&gt; <code><a href="Control-Arrow.html#v:arr">arr</a></code> <code><a href="Data-Tuple.html#v:fst">fst</a></code> = <code><a href="Control-Arrow.html#v:arr">arr</a></code> <code><a href="Data-Tuple.html#v:fst">fst</a></code> &gt;&gt;&gt; f</pre></li><li><pre><code><a href="Control-Arrow.html#v:first">first</a></code> f &gt;&gt;&gt; <code><a href="Control-Arrow.html#v:arr">arr</a></code> (<code><a href="Control-Category.html#v:id">id</a></code> *** g) = <code><a href="Control-Arrow.html#v:arr">arr</a></code> (<code><a href="Control-Category.html#v:id">id</a></code> *** g) &gt;&gt;&gt; <code><a href="Control-Arrow.html#v:first">first</a></code> f</pre></li><li><pre><code><a href="Control-Arrow.html#v:first">first</a></code> (<code><a href="Control-Arrow.html#v:first">first</a></code> f) &gt;&gt;&gt; <code><a href="Control-Arrow.html#v:arr">arr</a></code> <code>assoc</code> = <code><a href="Control-Arrow.html#v:arr">arr</a></code> <code>assoc</code> &gt;&gt;&gt; <code><a href="Control-Arrow.html#v:first">first</a></code> f</pre></li></ul><p>where
</p><pre> assoc ((a,b),c) = (a,(b,c))
</pre><p>The other combinators have sensible default definitions,
 which may be overridden for efficiency.
</p></div><div class="subs methods"><p class="caption">Methods</p><p class="src"><a name="v:arr" class="def">arr</a> ::  (b -&gt; c) -&gt; a b c</p><div class="doc"><p>Lift a function to an arrow.
</p></div><p class="src"><a name="v:first" class="def">first</a> ::  a b c -&gt; a (b, d) (c, d)</p><div class="doc"><p>Send the first component of the input through the argument
   arrow, and copy the rest unchanged to the output.
</p></div><p class="src"><a name="v:second" class="def">second</a> ::  a b c -&gt; a (d, b) (d, c)</p><div class="doc"><p>A mirror image of <code><a href="Control-Arrow.html#v:first">first</a></code>.
</p><p>The default definition may be overridden with a more efficient
   version if desired.
</p></div><p class="src"><a name="v:-42--42--42-" class="def">(***)</a> ::  a b c -&gt; a b' c' -&gt; a (b, b') (c, c')</p><div 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></div><p class="src"><a name="v:-38--38--38-" class="def">(&amp;&amp;&amp;)</a> ::  a b c -&gt; a b c' -&gt; a b (c, c')</p><div 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></div></div><div class="subs instances"><p id="control.i:Arrow" class="caption collapser" onclick="toggleSection('i:Arrow')">Instances</p><div id="section.i:Arrow" class="show"><table><tr><td class="src"><a href="Control-Arrow.html#t:Arrow">Arrow</a> (-&gt;)</td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a href="Control-Monad.html#t:Monad">Monad</a> m =&gt; <a href="Control-Arrow.html#t:Arrow">Arrow</a> (<a href="Control-Arrow.html#t:Kleisli">Kleisli</a> m)</td><td class="doc empty">&nbsp;</td></tr></table></div></div></div><div class="top"><p class="src"><span class="keyword">newtype</span>  <a name="t:Kleisli" class="def">Kleisli</a> m a b </p><div class="doc"><p>Kleisli arrows of a monad.
</p></div><div class="subs constructors"><p class="caption">Constructors</p><table><tr><td class="src"><a name="v:Kleisli" class="def">Kleisli</a></td><td class="doc empty">&nbsp;</td></tr><tr><td colspan="2"><div class="subs fields"><p class="caption">Fields</p><dl><dt class="src"><a name="v:runKleisli" class="def">runKleisli</a> :: a -&gt; m b</dt><dd class="doc empty">&nbsp;</dd></dl><div class="clear"></div></div></td></tr></table></div><div class="subs instances"><p id="control.i:Kleisli" class="caption collapser" onclick="toggleSection('i:Kleisli')">Instances</p><div id="section.i:Kleisli" class="show"><table><tr><td class="src"><a href="Control-Monad.html#t:Monad">Monad</a> m =&gt; <a href="Control-Category.html#t:Category">Category</a> (<a href="Control-Arrow.html#t:Kleisli">Kleisli</a> m)</td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a href="Control-Monad-Fix.html#t:MonadFix">MonadFix</a> m =&gt; <a href="Control-Arrow.html#t:ArrowLoop">ArrowLoop</a> (<a href="Control-Arrow.html#t:Kleisli">Kleisli</a> m)</td><td class="doc"><p>Beware that for many monads (those for which the <code><a href="Control-Monad.html#v:-62--62--61-">&gt;&gt;=</a></code> operation
 is strict) this instance will <em>not</em> satisfy the right-tightening law
 required by the <code><a href="Control-Arrow.html#t:ArrowLoop">ArrowLoop</a></code> class.
</p></td></tr><tr><td class="src"><a href="Control-Monad.html#t:Monad">Monad</a> m =&gt; <a href="Control-Arrow.html#t:ArrowApply">ArrowApply</a> (<a href="Control-Arrow.html#t:Kleisli">Kleisli</a> m)</td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a href="Control-Monad.html#t:Monad">Monad</a> m =&gt; <a href="Control-Arrow.html#t:ArrowChoice">ArrowChoice</a> (<a href="Control-Arrow.html#t:Kleisli">Kleisli</a> m)</td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a href="Control-Monad.html#t:MonadPlus">MonadPlus</a> m =&gt; <a href="Control-Arrow.html#t:ArrowPlus">ArrowPlus</a> (<a href="Control-Arrow.html#t:Kleisli">Kleisli</a> m)</td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a href="Control-Monad.html#t:MonadPlus">MonadPlus</a> m =&gt; <a href="Control-Arrow.html#t:ArrowZero">ArrowZero</a> (<a href="Control-Arrow.html#t:Kleisli">Kleisli</a> m)</td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a href="Control-Monad.html#t:Monad">Monad</a> m =&gt; <a href="Control-Arrow.html#t:Arrow">Arrow</a> (<a href="Control-Arrow.html#t:Kleisli">Kleisli</a> m)</td><td class="doc empty">&nbsp;</td></tr></table></div></div></div><h2 id="g:2">Derived combinators
</h2><div class="top"><p class="src"><a name="v:returnA" class="def">returnA</a> :: <a href="Control-Arrow.html#t:Arrow">Arrow</a> a =&gt; a b b</p><div class="doc"><p>The identity arrow, which plays the role of <code><a href="Control-Monad.html#v:return">return</a></code> in arrow notation.
</p></div></div><div class="top"><p class="src"><a name="v:-94--62--62-" class="def">(^&gt;&gt;)</a> :: <a href="Control-Arrow.html#t:Arrow">Arrow</a> a =&gt; (b -&gt; c) -&gt; a c d -&gt; a b d</p><div class="doc"><p>Precomposition with a pure function.
</p></div></div><div class="top"><p class="src"><a name="v:-62--62--94-" class="def">(&gt;&gt;^)</a> :: <a href="Control-Arrow.html#t:Arrow">Arrow</a> a =&gt; a b c -&gt; (c -&gt; d) -&gt; a b d</p><div class="doc"><p>Postcomposition with a pure function.
</p></div></div><div class="top"><p class="src"><a name="v:-62--62--62-" class="def">(&gt;&gt;&gt;)</a> :: <a href="Control-Category.html#t:Category">Category</a> cat =&gt; cat a b -&gt; cat b c -&gt; cat a c</p><div class="doc"><p>Left-to-right composition
</p></div></div><div class="top"><p class="src"><a name="v:-60--60--60-" class="def">(&lt;&lt;&lt;)</a> :: <a href="Control-Category.html#t:Category">Category</a> cat =&gt; cat b c -&gt; cat a b -&gt; cat a c</p><div class="doc"><p>Right-to-left composition
</p></div></div><h2 id="g:3">Right-to-left variants
</h2><div class="top"><p class="src"><a name="v:-60--60--94-" class="def">(&lt;&lt;^)</a> :: <a href="Control-Arrow.html#t:Arrow">Arrow</a> a =&gt; a c d -&gt; (b -&gt; c) -&gt; a b d</p><div class="doc"><p>Precomposition with a pure function (right-to-left variant).
</p></div></div><div class="top"><p class="src"><a name="v:-94--60--60-" class="def">(^&lt;&lt;)</a> :: <a href="Control-Arrow.html#t:Arrow">Arrow</a> a =&gt; (c -&gt; d) -&gt; a b c -&gt; a b d</p><div class="doc"><p>Postcomposition with a pure function (right-to-left variant).
</p></div></div><h1 id="g:4">Monoid operations
</h1><div class="top"><p class="src"><span class="keyword">class</span> <a href="Control-Arrow.html#t:Arrow">Arrow</a> a =&gt; <a name="t:ArrowZero" class="def">ArrowZero</a> a  <span class="keyword">where</span></p><div class="subs methods"><p class="caption">Methods</p><p class="src"><a name="v:zeroArrow" class="def">zeroArrow</a> ::  a b c</p></div><div class="subs instances"><p id="control.i:ArrowZero" class="caption collapser" onclick="toggleSection('i:ArrowZero')">Instances</p><div id="section.i:ArrowZero" class="show"><table><tr><td class="src"><a href="Control-Monad.html#t:MonadPlus">MonadPlus</a> m =&gt; <a href="Control-Arrow.html#t:ArrowZero">ArrowZero</a> (<a href="Control-Arrow.html#t:Kleisli">Kleisli</a> m)</td><td class="doc empty">&nbsp;</td></tr></table></div></div></div><div class="top"><p class="src"><span class="keyword">class</span> <a href="Control-Arrow.html#t:ArrowZero">ArrowZero</a> a =&gt; <a name="t:ArrowPlus" class="def">ArrowPlus</a> a  <span class="keyword">where</span></p><div class="doc"><p>A monoid on arrows.
</p></div><div class="subs methods"><p class="caption">Methods</p><p class="src"><a name="v:-60--43--62-" class="def">(&lt;+&gt;)</a> ::  a b c -&gt; a b c -&gt; a b c</p><div class="doc"><p>An associative operation with identity <code><a href="Control-Arrow.html#v:zeroArrow">zeroArrow</a></code>.
</p></div></div><div class="subs instances"><p id="control.i:ArrowPlus" class="caption collapser" onclick="toggleSection('i:ArrowPlus')">Instances</p><div id="section.i:ArrowPlus" class="show"><table><tr><td class="src"><a href="Control-Monad.html#t:MonadPlus">MonadPlus</a> m =&gt; <a href="Control-Arrow.html#t:ArrowPlus">ArrowPlus</a> (<a href="Control-Arrow.html#t:Kleisli">Kleisli</a> m)</td><td class="doc empty">&nbsp;</td></tr></table></div></div></div><h1 id="g:5">Conditionals
</h1><div class="top"><p class="src"><span class="keyword">class</span> <a href="Control-Arrow.html#t:Arrow">Arrow</a> a =&gt; <a name="t:ArrowChoice" class="def">ArrowChoice</a> a  <span class="keyword">where</span></p><div class="doc"><p>Choice, for arrows that support it.  This class underlies the
 <code>if</code> and <code>case</code> constructs in arrow notation.
 Minimal complete definition: <code><a href="Control-Arrow.html#v:left">left</a></code>, satisfying the laws
</p><ul><li><pre><code><a href="Control-Arrow.html#v:left">left</a></code> (<code><a href="Control-Arrow.html#v:arr">arr</a></code> f) = <code><a href="Control-Arrow.html#v:arr">arr</a></code> (<code><a href="Control-Arrow.html#v:left">left</a></code> f)</pre></li><li><pre><code><a href="Control-Arrow.html#v:left">left</a></code> (f &gt;&gt;&gt; g) = <code><a href="Control-Arrow.html#v:left">left</a></code> f &gt;&gt;&gt; <code><a href="Control-Arrow.html#v:left">left</a></code> g</pre></li><li><pre><code><a href="Control-Arrow.html#v:left">left</a></code> f &gt;&gt;&gt; <code><a href="Control-Arrow.html#v:arr">arr</a></code> <code><a href="Data-Either.html#v:Left">Left</a></code> = <code><a href="Control-Arrow.html#v:arr">arr</a></code> <code><a href="Data-Either.html#v:Left">Left</a></code> &gt;&gt;&gt; f</pre></li><li><pre><code><a href="Control-Arrow.html#v:left">left</a></code> f &gt;&gt;&gt; <code><a href="Control-Arrow.html#v:arr">arr</a></code> (<code><a href="Control-Category.html#v:id">id</a></code> +++ g) = <code><a href="Control-Arrow.html#v:arr">arr</a></code> (<code><a href="Control-Category.html#v:id">id</a></code> +++ g) &gt;&gt;&gt; <code><a href="Control-Arrow.html#v:left">left</a></code> f</pre></li><li><pre><code><a href="Control-Arrow.html#v:left">left</a></code> (<code><a href="Control-Arrow.html#v:left">left</a></code> f) &gt;&gt;&gt; <code><a href="Control-Arrow.html#v:arr">arr</a></code> <code>assocsum</code> = <code><a href="Control-Arrow.html#v:arr">arr</a></code> <code>assocsum</code> &gt;&gt;&gt; <code><a href="Control-Arrow.html#v:left">left</a></code> f</pre></li></ul><p>where
</p><pre> assocsum (Left (Left x)) = Left x
 assocsum (Left (Right y)) = Right (Left y)
 assocsum (Right z) = Right (Right z)
</pre><p>The other combinators have sensible default definitions, which may
 be overridden for efficiency.
</p></div><div class="subs methods"><p class="caption">Methods</p><p class="src"><a name="v:left" class="def">left</a> ::  a b c -&gt; a (<a href="Data-Either.html#t:Either">Either</a> b d) (<a href="Data-Either.html#t:Either">Either</a> c d)</p><div class="doc"><p>Feed marked inputs through the argument arrow, passing the
   rest through unchanged to the output.
</p></div><p class="src"><a name="v:right" class="def">right</a> ::  a b c -&gt; a (<a href="Data-Either.html#t:Either">Either</a> d b) (<a href="Data-Either.html#t:Either">Either</a> d c)</p><div class="doc"><p>A mirror image of <code><a href="Control-Arrow.html#v:left">left</a></code>.
</p><p>The default definition may be overridden with a more efficient
   version if desired.
</p></div><p class="src"><a name="v:-43--43--43-" class="def">(+++)</a> ::  a b c -&gt; a b' c' -&gt; a (<a href="Data-Either.html#t:Either">Either</a> b b') (<a href="Data-Either.html#t:Either">Either</a> c c')</p><div 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></div><p class="src"><a name="v:-124--124--124-" class="def">(|||)</a> ::  a b d -&gt; a c d -&gt; a (<a href="Data-Either.html#t:Either">Either</a> b c) d</p><div 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></div></div><div class="subs instances"><p id="control.i:ArrowChoice" class="caption collapser" onclick="toggleSection('i:ArrowChoice')">Instances</p><div id="section.i:ArrowChoice" class="show"><table><tr><td class="src"><a href="Control-Arrow.html#t:ArrowChoice">ArrowChoice</a> (-&gt;)</td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a href="Control-Monad.html#t:Monad">Monad</a> m =&gt; <a href="Control-Arrow.html#t:ArrowChoice">ArrowChoice</a> (<a href="Control-Arrow.html#t:Kleisli">Kleisli</a> m)</td><td class="doc empty">&nbsp;</td></tr></table></div></div></div><h1 id="g:6">Arrow application
</h1><div class="top"><p class="src"><span class="keyword">class</span> <a href="Control-Arrow.html#t:Arrow">Arrow</a> a =&gt; <a name="t:ArrowApply" class="def">ArrowApply</a> a  <span class="keyword">where</span></p><div class="doc"><p>Some arrows allow application of arrow inputs to other inputs.
 Instances should satisfy the following laws:
</p><ul><li><pre><code><a href="Control-Arrow.html#v:first">first</a></code> (<code><a href="Control-Arrow.html#v:arr">arr</a></code> (\x -&gt; <code><a href="Control-Arrow.html#v:arr">arr</a></code> (\y -&gt; (x,y)))) &gt;&gt;&gt; <code><a href="Control-Arrow.html#v:app">app</a></code> = <code><a href="Control-Category.html#v:id">id</a></code></pre></li><li><pre><code><a href="Control-Arrow.html#v:first">first</a></code> (<code><a href="Control-Arrow.html#v:arr">arr</a></code> (g &gt;&gt;&gt;)) &gt;&gt;&gt; <code><a href="Control-Arrow.html#v:app">app</a></code> = <code><a href="Control-Arrow.html#v:second">second</a></code> g &gt;&gt;&gt; <code><a href="Control-Arrow.html#v:app">app</a></code></pre></li><li><pre><code><a href="Control-Arrow.html#v:first">first</a></code> (<code><a href="Control-Arrow.html#v:arr">arr</a></code> (&gt;&gt;&gt; h)) &gt;&gt;&gt; <code><a href="Control-Arrow.html#v:app">app</a></code> = <code><a href="Control-Arrow.html#v:app">app</a></code> &gt;&gt;&gt; h</pre></li></ul><p>Such arrows are equivalent to monads (see <code><a href="Control-Arrow.html#t:ArrowMonad">ArrowMonad</a></code>).
</p></div><div class="subs methods"><p class="caption">Methods</p><p class="src"><a name="v:app" class="def">app</a> ::  a (a b c, b) c</p></div><div class="subs instances"><p id="control.i:ArrowApply" class="caption collapser" onclick="toggleSection('i:ArrowApply')">Instances</p><div id="section.i:ArrowApply" class="show"><table><tr><td class="src"><a href="Control-Arrow.html#t:ArrowApply">ArrowApply</a> (-&gt;)</td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a href="Control-Monad.html#t:Monad">Monad</a> m =&gt; <a href="Control-Arrow.html#t:ArrowApply">ArrowApply</a> (<a href="Control-Arrow.html#t:Kleisli">Kleisli</a> m)</td><td class="doc empty">&nbsp;</td></tr></table></div></div></div><div class="top"><p class="src"><span class="keyword">newtype</span>  <a name="t:ArrowMonad" class="def">ArrowMonad</a> a b </p><div class="doc"><p>The <code><a href="Control-Arrow.html#t:ArrowApply">ArrowApply</a></code> class is equivalent to <code><a href="Control-Monad.html#t:Monad">Monad</a></code>: any monad gives rise
   to a <code><a href="Control-Arrow.html#t:Kleisli">Kleisli</a></code> arrow, and any instance of <code><a href="Control-Arrow.html#t:ArrowApply">ArrowApply</a></code> defines a monad.
</p></div><div class="subs constructors"><p class="caption">Constructors</p><table><tr><td class="src"><a name="v:ArrowMonad" class="def">ArrowMonad</a> (a <a href="../ghc-prim-0.2.0.0/GHC-Tuple.html#t:-40--41-">()</a> b)</td><td class="doc empty">&nbsp;</td></tr></table></div><div class="subs instances"><p id="control.i:ArrowMonad" class="caption collapser" onclick="toggleSection('i:ArrowMonad')">Instances</p><div id="section.i:ArrowMonad" class="show"><table><tr><td class="src"><a href="Control-Arrow.html#t:ArrowApply">ArrowApply</a> a =&gt; <a href="Control-Monad.html#t:Monad">Monad</a> (<a href="Control-Arrow.html#t:ArrowMonad">ArrowMonad</a> a)</td><td class="doc empty">&nbsp;</td></tr></table></div></div></div><div class="top"><p class="src"><a name="v:leftApp" class="def">leftApp</a> :: <a href="Control-Arrow.html#t:ArrowApply">ArrowApply</a> a =&gt; a b c -&gt; a (<a href="Data-Either.html#t:Either">Either</a> b d) (<a href="Data-Either.html#t:Either">Either</a> c d)</p><div class="doc"><p>Any instance of <code><a href="Control-Arrow.html#t:ArrowApply">ArrowApply</a></code> can be made into an instance of
   <code><a href="Control-Arrow.html#t:ArrowChoice">ArrowChoice</a></code> by defining <code><a href="Control-Arrow.html#v:left">left</a></code> = <code><a href="Control-Arrow.html#v:leftApp">leftApp</a></code>.
</p></div></div><h1 id="g:7">Feedback
</h1><div class="top"><p class="src"><span class="keyword">class</span> <a href="Control-Arrow.html#t:Arrow">Arrow</a> a =&gt; <a name="t:ArrowLoop" class="def">ArrowLoop</a> a  <span class="keyword">where</span></p><div class="doc"><p>The <code><a href="Control-Arrow.html#v:loop">loop</a></code> operator expresses computations in which an output value
 is fed back as input, although the computation occurs only once.
 It underlies the <code>rec</code> value recursion construct in arrow notation.
 <code><a href="Control-Arrow.html#v:loop">loop</a></code> should satisfy the following laws:
</p><dl><dt><em>extension</em></dt><dd>
      <code><code><a href="Control-Arrow.html#v:loop">loop</a></code> (<code><a href="Control-Arrow.html#v:arr">arr</a></code> f) = <code><a href="Control-Arrow.html#v:arr">arr</a></code> (\ b -&gt; <code><a href="Data-Tuple.html#v:fst">fst</a></code> (<code><a href="Data-Function.html#v:fix">fix</a></code> (\ (c,d) -&gt; f (b,d))))</code>
</dd><dt><em>left tightening</em></dt><dd>
      <code><code><a href="Control-Arrow.html#v:loop">loop</a></code> (<code><a href="Control-Arrow.html#v:first">first</a></code> h &gt;&gt;&gt; f) = h &gt;&gt;&gt; <code><a href="Control-Arrow.html#v:loop">loop</a></code> f</code>
</dd><dt><em>right tightening</em></dt><dd>
      <code><code><a href="Control-Arrow.html#v:loop">loop</a></code> (f &gt;&gt;&gt; <code><a href="Control-Arrow.html#v:first">first</a></code> h) = <code><a href="Control-Arrow.html#v:loop">loop</a></code> f &gt;&gt;&gt; h</code>
</dd><dt><em>sliding</em></dt><dd>
      <code><code><a href="Control-Arrow.html#v:loop">loop</a></code> (f &gt;&gt;&gt; <code><a href="Control-Arrow.html#v:arr">arr</a></code> (<code><a href="Control-Category.html#v:id">id</a></code> *** k)) = <code><a href="Control-Arrow.html#v:loop">loop</a></code> (<code><a href="Control-Arrow.html#v:arr">arr</a></code> (<code><a href="Control-Category.html#v:id">id</a></code> *** k) &gt;&gt;&gt; f)</code>
</dd><dt><em>vanishing</em></dt><dd>
      <code><code><a href="Control-Arrow.html#v:loop">loop</a></code> (<code><a href="Control-Arrow.html#v:loop">loop</a></code> f) = <code><a href="Control-Arrow.html#v:loop">loop</a></code> (<code><a href="Control-Arrow.html#v:arr">arr</a></code> unassoc &gt;&gt;&gt; f &gt;&gt;&gt; <code><a href="Control-Arrow.html#v:arr">arr</a></code> assoc)</code>
</dd><dt><em>superposing</em></dt><dd>
      <code><code><a href="Control-Arrow.html#v:second">second</a></code> (<code><a href="Control-Arrow.html#v:loop">loop</a></code> f) = <code><a href="Control-Arrow.html#v:loop">loop</a></code> (<code><a href="Control-Arrow.html#v:arr">arr</a></code> assoc &gt;&gt;&gt; <code><a href="Control-Arrow.html#v:second">second</a></code> f &gt;&gt;&gt; <code><a href="Control-Arrow.html#v:arr">arr</a></code> unassoc)</code>
</dd></dl><p>where
</p><pre> assoc ((a,b),c) = (a,(b,c))
 unassoc (a,(b,c)) = ((a,b),c)
</pre></div><div class="subs methods"><p class="caption">Methods</p><p class="src"><a name="v:loop" class="def">loop</a> ::  a (b, d) (c, d) -&gt; a b c</p></div><div class="subs instances"><p id="control.i:ArrowLoop" class="caption collapser" onclick="toggleSection('i:ArrowLoop')">Instances</p><div id="section.i:ArrowLoop" class="show"><table><tr><td class="src"><a href="Control-Arrow.html#t:ArrowLoop">ArrowLoop</a> (-&gt;)</td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a href="Control-Monad-Fix.html#t:MonadFix">MonadFix</a> m =&gt; <a href="Control-Arrow.html#t:ArrowLoop">ArrowLoop</a> (<a href="Control-Arrow.html#t:Kleisli">Kleisli</a> m)</td><td class="doc"><p>Beware that for many monads (those for which the <code><a href="Control-Monad.html#v:-62--62--61-">&gt;&gt;=</a></code> operation
 is strict) this instance will <em>not</em> satisfy the right-tightening law
 required by the <code><a href="Control-Arrow.html#t:ArrowLoop">ArrowLoop</a></code> class.
</p></td></tr></table></div></div></div></div></div><div id="footer"><p>Produced by <a href="http://www.haskell.org/haddock/">Haddock</a> version 2.11.0</p></div></body></html>