1494 lines
70 KiB
HTML
1494 lines
70 KiB
HTML
<?xml version="1.0" encoding="iso-8859-1" ?>
|
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
<!--http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd-->
|
|
<html xmlns="http://www.w3.org/1999/xhtml"
|
|
>
|
|
<head><title>13 Control.Monad</title>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
|
<meta name="generator" content="TeX4ht (http://www.cse.ohio-state.edu/~gurari/TeX4ht/)" />
|
|
<meta name="originator" content="TeX4ht (http://www.cse.ohio-state.edu/~gurari/TeX4ht/)" />
|
|
<!-- 2,html,xhtml -->
|
|
<meta name="src" content="haskell.tex" />
|
|
<meta name="date" content="2010-07-20 13:11:00" />
|
|
<link rel="stylesheet" type="text/css" href="haskell.css" />
|
|
</head><body
|
|
>
|
|
<!--l. 1--><div class="crosslinks"><p class="noindent">[<a
|
|
href="haskellch14.html" >next</a>] [<a
|
|
href="#tailhaskellch13.html">tail</a>] [<a
|
|
href="haskellpa2.html#haskellch13.html" >up</a>] </p></div>
|
|
<h2 class="chapterHead"><span class="titlemark">Chapter 13</span><br /><a
|
|
id="x21-19300013"></a><span
|
|
class="pcrr7t-">Control.Monad</span></h2>
|
|
<div class="quote">
|
|
|
|
|
|
|
|
<div class="verbatim" id="verbatim-363">
|
|
module Control.Monad (
|
|
 <br />    Functor(fmap),  Monad((>>=), (>>), return, fail),  MonadPlus(mzero, mplus),
|
|
 <br />    mapM,  mapM_,  forM,  forM_,  sequence,  sequence_,  (=<<),  (>=>),  (<=<),
|
|
 <br />    forever,  void,  join,  msum,  filterM,  mapAndUnzipM,  zipWithM,
|
|
 <br />    zipWithM_,  foldM,  foldM_,  replicateM,  replicateM_,  guard,  when,
|
|
 <br />    unless,  liftM,  liftM2,  liftM3,  liftM4,  liftM5,  ap
|
|
 <br />  ) where
|
|
</div>
|
|
<p class="noindent"></div>
|
|
<p class="noindent"> The <span
|
|
class="pcrr7t-">Control.Monad </span>module provides the <span
|
|
class="pcrr7t-">Functor</span><a
|
|
id="dx21-193001"></a>, <span
|
|
class="pcrr7t-">Monad</span><a
|
|
id="dx21-193002"></a> and <span
|
|
class="pcrr7t-">MonadPlus</span><a
|
|
id="dx21-193003"></a> classes, together with some
|
|
useful operations on monads.
|
|
<h3 class="sectionHead"><span class="titlemark">13.1 </span> <a
|
|
id="x21-19400013.1"></a>Functor and monad classes </h3>
|
|
<p class="noindent">
|
|
<dl> <dt class="haddockdesc">
|
|
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-109" class="tabular"
|
|
cellspacing="0" cellpadding="0" rules="groups"
|
|
><colgroup id="TBL-109-1g"><col
|
|
id="TBL-109-1" /></colgroup><tr
|
|
style="vertical-align:baseline;" id="TBL-109-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-109-1-1"
|
|
class="td11"><span
|
|
class="pcrb7t-">class</span><span
|
|
class="pcrb7t-"> Functor</span><span
|
|
class="pcrb7t-"> f</span><span
|
|
class="pcrb7t-"> where </span></td></tr></table> </div> <dd class="haddockdesc">
|
|
The <span
|
|
class="pcrr7t-">Functor</span><a
|
|
id="dx21-194001"></a> class is used for types that can be mapped over. Instances of <span
|
|
class="pcrr7t-">Functor</span><a
|
|
id="dx21-194002"></a> should satisfy
|
|
the following laws:
|
|
<p class="noindent">
|
|
<div class="quote">
|
|
|
|
|
|
|
|
<div class="verbatim" id="verbatim-364">
|
|
 fmap id  ==  id
|
|
 <br /> fmap (f . g)  ==  fmap f . fmap g
|
|
</div>
|
|
<p class="noindent"></div>
|
|
<p class="noindent"> The instances of <span
|
|
class="pcrr7t-">Functor</span><a
|
|
id="dx21-194003"></a> for lists, <span
|
|
class="pcrr7t-">Data.Maybe.Maybe </span>and <span
|
|
class="pcrr7t-">System.IO.IO </span>satisfy these
|
|
laws.
|
|
<p class="noindent"> <span
|
|
class="ptmb7t-">Methods</span>
|
|
<dl> <dt class="haddockdesc">
|
|
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-110" class="tabular"
|
|
cellspacing="0" cellpadding="0" rules="groups"
|
|
><colgroup id="TBL-110-1g"><col
|
|
id="TBL-110-1" /></colgroup><tr
|
|
style="vertical-align:baseline;" id="TBL-110-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-110-1-1"
|
|
class="td11"><span
|
|
class="pcrb7t-">fmap</span><span
|
|
class="pcrb7t-"> ::</span><span
|
|
class="pcrb7t-"> (a</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> b)</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> f</span><span
|
|
class="pcrb7t-"> a</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> f</span><span
|
|
class="pcrb7t-"> b </span></td></tr></table> </div> <dd class="haddockdesc">
|
|
</dl>
|
|
</dl>
|
|
<p class="noindent">
|
|
<dl><dt class="haddockdesc">
|
|
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-111" class="tabular"
|
|
cellspacing="0" cellpadding="0" rules="groups"
|
|
><colgroup id="TBL-111-1g"><col
|
|
id="TBL-111-1" /></colgroup><tr
|
|
style="vertical-align:baseline;" id="TBL-111-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-111-1-1"
|
|
class="td11"><span
|
|
class="pcrb7t-">instance</span><span
|
|
class="pcrb7t-"> Functor</span><span
|
|
class="pcrb7t-"> [] </span></td>
|
|
</tr><tr
|
|
style="vertical-align:baseline;" id="TBL-111-2-"><td style="white-space:nowrap; text-align:left;" id="TBL-111-2-1"
|
|
class="td11"><span
|
|
class="pcrb7t-">instance</span><span
|
|
class="pcrb7t-"> Functor</span><span
|
|
class="pcrb7t-"> IO </span></td>
|
|
</tr><tr
|
|
style="vertical-align:baseline;" id="TBL-111-3-"><td style="white-space:nowrap; text-align:left;" id="TBL-111-3-1"
|
|
class="td11"><span
|
|
class="pcrb7t-">instance</span><span
|
|
class="pcrb7t-"> Functor</span><span
|
|
class="pcrb7t-"> Maybe </span></td>
|
|
</tr><tr
|
|
style="vertical-align:baseline;" id="TBL-111-4-"><td style="white-space:nowrap; text-align:left;" id="TBL-111-4-1"
|
|
class="td11"><span
|
|
class="pcrb7t-">instance</span><span
|
|
class="pcrb7t-"> Ix</span><span
|
|
class="pcrb7t-"> i</span><span
|
|
class="pcrb7t-"> =></span><span
|
|
class="pcrb7t-"> Functor</span><span
|
|
class="pcrb7t-"> (Array</span><span
|
|
class="pcrb7t-"> i) </span></td>
|
|
</tr></table> </div> <dd class="haddockdesc">
|
|
</dl>
|
|
<p class="noindent">
|
|
<dl><dt class="haddockdesc">
|
|
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-112" class="tabular"
|
|
cellspacing="0" cellpadding="0" rules="groups"
|
|
><colgroup id="TBL-112-1g"><col
|
|
id="TBL-112-1" /></colgroup><tr
|
|
style="vertical-align:baseline;" id="TBL-112-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-112-1-1"
|
|
class="td11"><span
|
|
class="pcrb7t-">class</span><span
|
|
class="pcrb7t-"> Monad</span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> where </span></td></tr></table> </div> <dd class="haddockdesc">
|
|
The <span
|
|
class="pcrr7t-">Monad</span><a
|
|
id="dx21-194004"></a> class defines the basic operations over a <span
|
|
class="ptmri7t-">monad</span>, a concept from a branch of mathematics
|
|
known as <span
|
|
class="ptmri7t-">category theory</span>. From the perspective of a Haskell programmer, however, it is best to think
|
|
of a monad as an <span
|
|
class="ptmri7t-">abstract datatype </span>of actions. Haskell’s <span
|
|
class="pcrr7t-">do </span>expressions provide a convenient syntax
|
|
for writing monadic expressions.
|
|
<p class="noindent"> Minimal complete definition: <span
|
|
class="pcrr7t-">>>=</span><a
|
|
id="dx21-194005"></a> and <span
|
|
class="pcrr7t-">return</span><a
|
|
id="dx21-194006"></a>.
|
|
<p class="noindent"> Instances of <span
|
|
class="pcrr7t-">Monad</span><a
|
|
id="dx21-194007"></a> should satisfy the following laws:
|
|
<p class="noindent">
|
|
<div class="quote">
|
|
|
|
|
|
|
|
<div class="verbatim" id="verbatim-365">
|
|
 return a >>= k  ==  k a
|
|
 <br /> m >>= return  ==  m
|
|
 <br /> m >>= (\x -> k x >>= h)  ==  (m >>= k) >>= h
|
|
</div>
|
|
<p class="noindent"></div>
|
|
<p class="noindent"> Instances of both <span
|
|
class="pcrr7t-">Monad</span><a
|
|
id="dx21-194008"></a> and <span
|
|
class="pcrr7t-">Functor</span><a
|
|
id="dx21-194009"></a> should additionally satisfy the law:
|
|
<p class="noindent">
|
|
<div class="quote">
|
|
|
|
|
|
|
|
<div class="verbatim" id="verbatim-366">
|
|
 fmap f xs  ==  xs >>= return . f
|
|
</div>
|
|
<p class="noindent"></div>
|
|
<p class="noindent"> The instances of <span
|
|
class="pcrr7t-">Monad</span><a
|
|
id="dx21-194010"></a> for lists, <span
|
|
class="pcrr7t-">Data.Maybe.Maybe </span>and <span
|
|
class="pcrr7t-">System.IO.IO </span>defined in the <span
|
|
class="pcrr7t-">Prelude</span>
|
|
satisfy these laws.
|
|
<p class="noindent"> <span
|
|
class="ptmb7t-">Methods</span>
|
|
<dl> <dt class="haddockdesc">
|
|
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-113" class="tabular"
|
|
cellspacing="0" cellpadding="0" rules="groups"
|
|
><colgroup id="TBL-113-1g"><col
|
|
id="TBL-113-1" /></colgroup><tr
|
|
style="vertical-align:baseline;" id="TBL-113-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-113-1-1"
|
|
class="td11"><span
|
|
class="pcrb7t-">(>>=)</span><span
|
|
class="pcrb7t-"> ::</span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> a</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> (a</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> b)</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> b </span></td></tr></table> </div> <dd class="haddockdesc">
|
|
Sequentially compose two actions, passing any value produced by the first as an argument to the
|
|
second.
|
|
</dl>
|
|
<p class="noindent">
|
|
<dl> <dt class="haddockdesc">
|
|
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-114" class="tabular"
|
|
cellspacing="0" cellpadding="0" rules="groups"
|
|
><colgroup id="TBL-114-1g"><col
|
|
id="TBL-114-1" /></colgroup><tr
|
|
style="vertical-align:baseline;" id="TBL-114-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-114-1-1"
|
|
class="td11"><span
|
|
class="pcrb7t-">(>>)</span><span
|
|
class="pcrb7t-"> ::</span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> a</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> b</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> b </span></td></tr></table> </div> <dd class="haddockdesc">
|
|
Sequentially compose two actions, discarding any value produced by the first, like sequencing
|
|
operators (such as the semicolon) in imperative languages.
|
|
</dl>
|
|
<p class="noindent">
|
|
<dl> <dt class="haddockdesc">
|
|
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-115" class="tabular"
|
|
cellspacing="0" cellpadding="0" rules="groups"
|
|
><colgroup id="TBL-115-1g"><col
|
|
id="TBL-115-1" /></colgroup><tr
|
|
style="vertical-align:baseline;" id="TBL-115-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-115-1-1"
|
|
class="td11"><span
|
|
class="pcrb7t-">return</span><span
|
|
class="pcrb7t-"> ::</span><span
|
|
class="pcrb7t-"> a</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> a </span></td></tr></table> </div> <dd class="haddockdesc">
|
|
Inject a value into the monadic type.
|
|
</dl>
|
|
<p class="noindent">
|
|
<dl> <dt class="haddockdesc">
|
|
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-116" class="tabular"
|
|
cellspacing="0" cellpadding="0" rules="groups"
|
|
><colgroup id="TBL-116-1g"><col
|
|
id="TBL-116-1" /></colgroup><tr
|
|
style="vertical-align:baseline;" id="TBL-116-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-116-1-1"
|
|
class="td11"><span
|
|
class="pcrb7t-">fail</span><span
|
|
class="pcrb7t-"> ::</span><span
|
|
class="pcrb7t-"> String</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> a </span></td></tr></table> </div> <dd class="haddockdesc">
|
|
Fail with a message. This operation is not part of the mathematical definition of a monad, but is
|
|
invoked on pattern-match failure in a <span
|
|
class="pcrr7t-">do </span>expression.
|
|
</dl>
|
|
</dl>
|
|
<p class="noindent">
|
|
<dl> <dt class="haddockdesc">
|
|
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-117" class="tabular"
|
|
cellspacing="0" cellpadding="0" rules="groups"
|
|
><colgroup id="TBL-117-1g"><col
|
|
id="TBL-117-1" /></colgroup><tr
|
|
style="vertical-align:baseline;" id="TBL-117-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-117-1-1"
|
|
class="td11"><span
|
|
class="pcrb7t-">instance</span><span
|
|
class="pcrb7t-"> Monad</span><span
|
|
class="pcrb7t-"> [] </span></td>
|
|
</tr><tr
|
|
style="vertical-align:baseline;" id="TBL-117-2-"><td style="white-space:nowrap; text-align:left;" id="TBL-117-2-1"
|
|
class="td11"><span
|
|
class="pcrb7t-">instance</span><span
|
|
class="pcrb7t-"> Monad</span><span
|
|
class="pcrb7t-"> IO </span></td>
|
|
</tr><tr
|
|
style="vertical-align:baseline;" id="TBL-117-3-"><td style="white-space:nowrap; text-align:left;" id="TBL-117-3-1"
|
|
class="td11"><span
|
|
class="pcrb7t-">instance</span><span
|
|
class="pcrb7t-"> Monad</span><span
|
|
class="pcrb7t-"> Maybe </span></td>
|
|
</tr></table> </div> <dd class="haddockdesc">
|
|
</dl>
|
|
<p class="noindent">
|
|
|
|
|
|
|
|
<dl><dt class="haddockdesc">
|
|
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-118" class="tabular"
|
|
cellspacing="0" cellpadding="0" rules="groups"
|
|
><colgroup id="TBL-118-1g"><col
|
|
id="TBL-118-1" /></colgroup><tr
|
|
style="vertical-align:baseline;" id="TBL-118-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-118-1-1"
|
|
class="td11"><span
|
|
class="pcrb7t-">class</span><span
|
|
class="pcrb7t-"> Monad</span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> =></span><span
|
|
class="pcrb7t-"> MonadPlus</span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> where </span></td></tr></table> </div> <dd class="haddockdesc">
|
|
Monads that also support choice and failure.
|
|
<p class="noindent"> <span
|
|
class="ptmb7t-">Methods</span>
|
|
<dl> <dt class="haddockdesc">
|
|
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-119" class="tabular"
|
|
cellspacing="0" cellpadding="0" rules="groups"
|
|
><colgroup id="TBL-119-1g"><col
|
|
id="TBL-119-1" /></colgroup><tr
|
|
style="vertical-align:baseline;" id="TBL-119-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-119-1-1"
|
|
class="td11"><span
|
|
class="pcrb7t-">mzero</span><span
|
|
class="pcrb7t-"> ::</span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> a </span></td></tr></table> </div> <dd class="haddockdesc">
|
|
the identity of <span
|
|
class="pcrr7t-">mplus</span><a
|
|
id="dx21-194011"></a>. It should also satisfy the equations
|
|
<p class="noindent">
|
|
<div class="quote">
|
|
|
|
|
|
|
|
<div class="verbatim" id="verbatim-367">
|
|
 mzero >>= f  =  mzero
|
|
 <br /> v >> mzero   =  mzero</div>
|
|
<p class="noindent"></div>
|
|
</dl>
|
|
<p class="noindent">
|
|
<dl><dt class="haddockdesc">
|
|
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-120" class="tabular"
|
|
cellspacing="0" cellpadding="0" rules="groups"
|
|
><colgroup id="TBL-120-1g"><col
|
|
id="TBL-120-1" /></colgroup><tr
|
|
style="vertical-align:baseline;" id="TBL-120-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-120-1-1"
|
|
class="td11"><span
|
|
class="pcrb7t-">mplus</span><span
|
|
class="pcrb7t-"> ::</span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> a</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> a</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> a </span></td></tr></table> </div> <dd class="haddockdesc">
|
|
an associative operation
|
|
</dl>
|
|
</dl>
|
|
<p class="noindent">
|
|
<dl> <dt class="haddockdesc">
|
|
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-121" class="tabular"
|
|
cellspacing="0" cellpadding="0" rules="groups"
|
|
><colgroup id="TBL-121-1g"><col
|
|
id="TBL-121-1" /></colgroup><tr
|
|
style="vertical-align:baseline;" id="TBL-121-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-121-1-1"
|
|
class="td11"><span
|
|
class="pcrb7t-">instance</span><span
|
|
class="pcrb7t-"> MonadPlus</span><span
|
|
class="pcrb7t-"> [] </span></td>
|
|
</tr><tr
|
|
style="vertical-align:baseline;" id="TBL-121-2-"><td style="white-space:nowrap; text-align:left;" id="TBL-121-2-1"
|
|
class="td11"><span
|
|
class="pcrb7t-">instance</span><span
|
|
class="pcrb7t-"> MonadPlus</span><span
|
|
class="pcrb7t-"> Maybe </span></td>
|
|
</tr></table> </div> <dd class="haddockdesc">
|
|
</dl>
|
|
<p class="noindent">
|
|
<h3 class="sectionHead"><span class="titlemark">13.2 </span> <a
|
|
id="x21-19500013.2"></a>Functions </h3>
|
|
<p class="noindent">
|
|
<h4 class="subsectionHead"><span class="titlemark">13.2.1 </span> <a
|
|
id="x21-19600013.2.1"></a>Naming conventions </h4>
|
|
<p class="noindent"> The functions in this library use the following naming conventions:
|
|
<ul class="itemize1">
|
|
<li class="itemize">A postfix ’<span
|
|
class="pcrr7t-">M</span>’ always stands for a function in the Kleisli category: The monad type constructor <span
|
|
class="pcrr7t-">m </span>is
|
|
added to function results (modulo currying) and nowhere else. So, for example,
|
|
</li></ul>
|
|
<p class="noindent">
|
|
<div class="quote">
|
|
|
|
|
|
|
|
<div class="verbatim" id="verbatim-368">
|
|
  filter  ::              (a ->   Bool) -> [a] ->   [a]
|
|
 <br />  filterM :: (Monad m) => (a -> m Bool) -> [a] -> m [a]
|
|
</div>
|
|
<p class="noindent"></div>
|
|
<ul class="itemize1">
|
|
<li class="itemize">A postfix ’<span
|
|
class="pcrr7t-">_</span>’ changes the result type from <span
|
|
class="pcrr7t-">(m</span><span
|
|
class="pcrr7t-"> a) </span>to <span
|
|
class="pcrr7t-">(m</span><span
|
|
class="pcrr7t-"> ())</span>. Thus, for example:
|
|
</li></ul>
|
|
<p class="noindent">
|
|
<div class="quote">
|
|
|
|
|
|
|
|
<div class="verbatim" id="verbatim-369">
|
|
  sequence  :: Monad m => [m a] -> m [a]
|
|
 <br />  sequence_ :: Monad m => [m a] -> m ()
|
|
</div>
|
|
<p class="noindent"></div>
|
|
<ul class="itemize1">
|
|
<li class="itemize">A prefix ’<span
|
|
class="pcrr7t-">m</span>’ generalizes an existing function to a monadic form. Thus, for example:
|
|
</li></ul>
|
|
<p class="noindent">
|
|
<div class="quote">
|
|
|
|
|
|
|
|
<div class="verbatim" id="verbatim-370">
|
|
  sum  :: Num a       => [a]   -> a
|
|
 <br />  msum :: MonadPlus m => [m a] -> m a
|
|
</div>
|
|
<p class="noindent"></div>
|
|
<p class="noindent">
|
|
<h4 class="subsectionHead"><span class="titlemark">13.2.2 </span> <a
|
|
id="x21-19700013.2.2"></a>Basic <span
|
|
class="pcrr7t-">Monad </span>functions </h4>
|
|
<p class="noindent">
|
|
<dl> <dt class="haddockdesc">
|
|
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-122" class="tabular"
|
|
cellspacing="0" cellpadding="0" rules="groups"
|
|
><colgroup id="TBL-122-1g"><col
|
|
id="TBL-122-1" /></colgroup><tr
|
|
style="vertical-align:baseline;" id="TBL-122-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-122-1-1"
|
|
class="td11"><span
|
|
class="pcrb7t-">mapM</span><span
|
|
class="pcrb7t-"> ::</span><span
|
|
class="pcrb7t-"> Monad</span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> =></span><span
|
|
class="pcrb7t-"> (a</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> b)</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> [a]</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> [b] </span></td>
|
|
</tr></table> </div> <dd class="haddockdesc">
|
|
<span
|
|
class="pcrr7t-">mapM</span><span
|
|
class="pcrr7t-"> f </span>is equivalent to <span
|
|
class="pcrr7t-">sequence</span><span
|
|
class="pcrr7t-"> .</span><span
|
|
class="pcrr7t-"> map</span><span
|
|
class="pcrr7t-"> f</span>.
|
|
</dl>
|
|
<p class="noindent">
|
|
<dl> <dt class="haddockdesc">
|
|
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-123" class="tabular"
|
|
cellspacing="0" cellpadding="0" rules="groups"
|
|
><colgroup id="TBL-123-1g"><col
|
|
id="TBL-123-1" /></colgroup><tr
|
|
style="vertical-align:baseline;" id="TBL-123-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-123-1-1"
|
|
class="td11"><span
|
|
class="pcrb7t-">mapM_</span><span
|
|
class="pcrb7t-"> ::</span><span
|
|
class="pcrb7t-"> Monad</span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> =></span><span
|
|
class="pcrb7t-"> (a</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> b)</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> [a]</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> () </span></td>
|
|
</tr></table> </div> <dd class="haddockdesc">
|
|
<span
|
|
class="pcrr7t-">mapM_</span><span
|
|
class="pcrr7t-"> f </span>is equivalent to <span
|
|
class="pcrr7t-">sequence_</span><span
|
|
class="pcrr7t-"> .</span><span
|
|
class="pcrr7t-"> map</span><span
|
|
class="pcrr7t-"> f</span>.
|
|
</dl>
|
|
<p class="noindent">
|
|
<dl> <dt class="haddockdesc">
|
|
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-124" class="tabular"
|
|
cellspacing="0" cellpadding="0" rules="groups"
|
|
><colgroup id="TBL-124-1g"><col
|
|
id="TBL-124-1" /></colgroup><tr
|
|
style="vertical-align:baseline;" id="TBL-124-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-124-1-1"
|
|
class="td11"><span
|
|
class="pcrb7t-">forM</span><span
|
|
class="pcrb7t-"> ::</span><span
|
|
class="pcrb7t-"> Monad</span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> =></span><span
|
|
class="pcrb7t-"> [a]</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> (a</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> b)</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> [b] </span></td>
|
|
</tr></table> </div> <dd class="haddockdesc">
|
|
<span
|
|
class="pcrr7t-">forM</span><a
|
|
id="dx21-197001"></a> is <span
|
|
class="pcrr7t-">mapM</span><a
|
|
id="dx21-197002"></a> with its arguments flipped
|
|
</dl>
|
|
<p class="noindent">
|
|
<dl> <dt class="haddockdesc">
|
|
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-125" class="tabular"
|
|
cellspacing="0" cellpadding="0" rules="groups"
|
|
><colgroup id="TBL-125-1g"><col
|
|
id="TBL-125-1" /></colgroup><tr
|
|
style="vertical-align:baseline;" id="TBL-125-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-125-1-1"
|
|
class="td11"><span
|
|
class="pcrb7t-">forM_</span><span
|
|
class="pcrb7t-"> ::</span><span
|
|
class="pcrb7t-"> Monad</span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> =></span><span
|
|
class="pcrb7t-"> [a]</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> (a</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> b)</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> () </span></td>
|
|
</tr></table> </div> <dd class="haddockdesc">
|
|
<span
|
|
class="pcrr7t-">forM_</span><a
|
|
id="dx21-197003"></a> is <span
|
|
class="pcrr7t-">mapM_</span><a
|
|
id="dx21-197004"></a> with its arguments flipped
|
|
</dl>
|
|
<p class="noindent">
|
|
|
|
|
|
|
|
<dl> <dt class="haddockdesc">
|
|
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-126" class="tabular"
|
|
cellspacing="0" cellpadding="0" rules="groups"
|
|
><colgroup id="TBL-126-1g"><col
|
|
id="TBL-126-1" /></colgroup><tr
|
|
style="vertical-align:baseline;" id="TBL-126-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-126-1-1"
|
|
class="td11"><span
|
|
class="pcrb7t-">sequence</span><span
|
|
class="pcrb7t-"> ::</span><span
|
|
class="pcrb7t-"> Monad</span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> =></span><span
|
|
class="pcrb7t-"> [m</span><span
|
|
class="pcrb7t-"> a]</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> [a] </span></td>
|
|
</tr></table> </div> <dd class="haddockdesc">
|
|
Evaluate each action in the sequence from left to right, and collect the results.
|
|
</dl>
|
|
<p class="noindent">
|
|
<dl> <dt class="haddockdesc">
|
|
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-127" class="tabular"
|
|
cellspacing="0" cellpadding="0" rules="groups"
|
|
><colgroup id="TBL-127-1g"><col
|
|
id="TBL-127-1" /></colgroup><tr
|
|
style="vertical-align:baseline;" id="TBL-127-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-127-1-1"
|
|
class="td11"><span
|
|
class="pcrb7t-">sequence_</span><span
|
|
class="pcrb7t-"> ::</span><span
|
|
class="pcrb7t-"> Monad</span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> =></span><span
|
|
class="pcrb7t-"> [m</span><span
|
|
class="pcrb7t-"> a]</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> () </span></td>
|
|
</tr></table> </div> <dd class="haddockdesc">
|
|
Evaluate each action in the sequence from left to right, and ignore the results.
|
|
</dl>
|
|
<p class="noindent">
|
|
<dl> <dt class="haddockdesc">
|
|
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-128" class="tabular"
|
|
cellspacing="0" cellpadding="0" rules="groups"
|
|
><colgroup id="TBL-128-1g"><col
|
|
id="TBL-128-1" /></colgroup><tr
|
|
style="vertical-align:baseline;" id="TBL-128-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-128-1-1"
|
|
class="td11"><span
|
|
class="pcrb7t-">(=<<)</span><span
|
|
class="pcrb7t-"> ::</span><span
|
|
class="pcrb7t-"> Monad</span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> =></span><span
|
|
class="pcrb7t-"> (a</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> b)</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> a</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> b </span></td>
|
|
</tr></table> </div> <dd class="haddockdesc">
|
|
Same as <span
|
|
class="pcrr7t-">>>=</span><a
|
|
id="dx21-197005"></a>, but with the arguments interchanged.
|
|
</dl>
|
|
<p class="noindent">
|
|
<dl> <dt class="haddockdesc">
|
|
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-129" class="tabular"
|
|
cellspacing="0" cellpadding="0" rules="groups"
|
|
><colgroup id="TBL-129-1g"><col
|
|
id="TBL-129-1" /></colgroup><tr
|
|
style="vertical-align:baseline;" id="TBL-129-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-129-1-1"
|
|
class="td11"><span
|
|
class="pcrb7t-">(>=>)</span><span
|
|
class="pcrb7t-"> ::</span><span
|
|
class="pcrb7t-"> Monad</span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> =></span><span
|
|
class="pcrb7t-"> (a</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> b)</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> (b</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> c)</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> a</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> c </span></td>
|
|
</tr></table> </div> <dd class="haddockdesc">
|
|
Left-to-right Kleisli composition of monads.
|
|
</dl>
|
|
<p class="noindent">
|
|
<dl> <dt class="haddockdesc">
|
|
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-130" class="tabular"
|
|
cellspacing="0" cellpadding="0" rules="groups"
|
|
><colgroup id="TBL-130-1g"><col
|
|
id="TBL-130-1" /></colgroup><tr
|
|
style="vertical-align:baseline;" id="TBL-130-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-130-1-1"
|
|
class="td11"><span
|
|
class="pcrb7t-">(<=<)</span><span
|
|
class="pcrb7t-"> ::</span><span
|
|
class="pcrb7t-"> Monad</span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> =></span><span
|
|
class="pcrb7t-"> (b</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> c)</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> (a</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> b)</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> a</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> c </span></td>
|
|
</tr></table> </div> <dd class="haddockdesc">
|
|
Right-to-left Kleisli composition of monads. <span
|
|
class="pcrr7t-">(>=>)</span>, with the arguments flipped
|
|
</dl>
|
|
<p class="noindent">
|
|
<dl> <dt class="haddockdesc">
|
|
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-131" class="tabular"
|
|
cellspacing="0" cellpadding="0" rules="groups"
|
|
><colgroup id="TBL-131-1g"><col
|
|
id="TBL-131-1" /></colgroup><tr
|
|
style="vertical-align:baseline;" id="TBL-131-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-131-1-1"
|
|
class="td11"><span
|
|
class="pcrb7t-">forever</span><span
|
|
class="pcrb7t-"> ::</span><span
|
|
class="pcrb7t-"> Monad</span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> =></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> a</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> b </span></td></tr></table> </div> <dd class="haddockdesc">
|
|
<span
|
|
class="pcrr7t-">forever</span><span
|
|
class="pcrr7t-"> act </span>repeats the action infinitely.
|
|
</dl>
|
|
<p class="noindent">
|
|
<dl> <dt class="haddockdesc">
|
|
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-132" class="tabular"
|
|
cellspacing="0" cellpadding="0" rules="groups"
|
|
><colgroup id="TBL-132-1g"><col
|
|
id="TBL-132-1" /></colgroup><tr
|
|
style="vertical-align:baseline;" id="TBL-132-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-132-1-1"
|
|
class="td11"><span
|
|
class="pcrb7t-">void</span><span
|
|
class="pcrb7t-"> ::</span><span
|
|
class="pcrb7t-"> Functor</span><span
|
|
class="pcrb7t-"> f</span><span
|
|
class="pcrb7t-"> =></span><span
|
|
class="pcrb7t-"> f</span><span
|
|
class="pcrb7t-"> a</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> f</span><span
|
|
class="pcrb7t-"> () </span></td>
|
|
</tr></table> </div> <dd class="haddockdesc">
|
|
<span
|
|
class="pcrr7t-">void</span><span
|
|
class="pcrr7t-"> value </span>discards or ignores the result of evaluation, such as the return value of an <span
|
|
class="pcrr7t-">IO</span><a
|
|
id="dx21-197006"></a> action.
|
|
</dl>
|
|
|
|
|
|
|
|
<p class="noindent">
|
|
<h4 class="subsectionHead"><span class="titlemark">13.2.3 </span> <a
|
|
id="x21-19800013.2.3"></a>Generalisations of list functions </h4>
|
|
<p class="noindent">
|
|
<dl> <dt class="haddockdesc">
|
|
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-133" class="tabular"
|
|
cellspacing="0" cellpadding="0" rules="groups"
|
|
><colgroup id="TBL-133-1g"><col
|
|
id="TBL-133-1" /></colgroup><tr
|
|
style="vertical-align:baseline;" id="TBL-133-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-133-1-1"
|
|
class="td11"><span
|
|
class="pcrb7t-">join</span><span
|
|
class="pcrb7t-"> ::</span><span
|
|
class="pcrb7t-"> Monad</span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> =></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> (m</span><span
|
|
class="pcrb7t-"> a)</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> a </span></td>
|
|
</tr></table> </div> <dd class="haddockdesc">
|
|
The <span
|
|
class="pcrr7t-">join</span><a
|
|
id="dx21-198001"></a> function is the conventional monad join operator. It is used to remove one level of monadic
|
|
structure, projecting its bound argument into the outer level.
|
|
</dl>
|
|
<p class="noindent">
|
|
<dl> <dt class="haddockdesc">
|
|
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-134" class="tabular"
|
|
cellspacing="0" cellpadding="0" rules="groups"
|
|
><colgroup id="TBL-134-1g"><col
|
|
id="TBL-134-1" /></colgroup><tr
|
|
style="vertical-align:baseline;" id="TBL-134-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-134-1-1"
|
|
class="td11"><span
|
|
class="pcrb7t-">msum</span><span
|
|
class="pcrb7t-"> ::</span><span
|
|
class="pcrb7t-"> MonadPlus</span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> =></span><span
|
|
class="pcrb7t-"> [m</span><span
|
|
class="pcrb7t-"> a]</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> a </span></td>
|
|
</tr></table> </div> <dd class="haddockdesc">
|
|
This generalizes the list-based <span
|
|
class="pcrr7t-">concat</span><a
|
|
id="dx21-198002"></a> function.
|
|
</dl>
|
|
<p class="noindent">
|
|
<dl> <dt class="haddockdesc">
|
|
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-135" class="tabular"
|
|
cellspacing="0" cellpadding="0" rules="groups"
|
|
><colgroup id="TBL-135-1g"><col
|
|
id="TBL-135-1" /></colgroup><tr
|
|
style="vertical-align:baseline;" id="TBL-135-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-135-1-1"
|
|
class="td11"><span
|
|
class="pcrb7t-">filterM</span><span
|
|
class="pcrb7t-"> ::</span><span
|
|
class="pcrb7t-"> Monad</span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> =></span><span
|
|
class="pcrb7t-"> (a</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> Bool)</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> [a]</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> [a] </span></td>
|
|
</tr></table> </div> <dd class="haddockdesc">
|
|
This generalizes the list-based <span
|
|
class="pcrr7t-">filter</span><a
|
|
id="dx21-198003"></a> function.
|
|
</dl>
|
|
<p class="noindent">
|
|
<dl> <dt class="haddockdesc">
|
|
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-136" class="tabular"
|
|
cellspacing="0" cellpadding="0" rules="groups"
|
|
><colgroup id="TBL-136-1g"><col
|
|
id="TBL-136-1" /></colgroup><tr
|
|
style="vertical-align:baseline;" id="TBL-136-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-136-1-1"
|
|
class="td11"><span
|
|
class="pcrb7t-">mapAndUnzipM</span><span
|
|
class="pcrb7t-"> ::</span><span
|
|
class="pcrb7t-"> Monad</span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> =></span><span
|
|
class="pcrb7t-"> (a</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> (b,</span><span
|
|
class="pcrb7t-"> c))</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> [a]</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> ([b],</span><span
|
|
class="pcrb7t-"> [c]) </span></td>
|
|
</tr></table> </div> <dd class="haddockdesc">
|
|
The <span
|
|
class="pcrr7t-">mapAndUnzipM</span><a
|
|
id="dx21-198004"></a> function maps its first argument over a list, returning the result as a pair of lists.
|
|
This function is mainly used with complicated data structures or a state-transforming monad.
|
|
</dl>
|
|
<p class="noindent">
|
|
<dl> <dt class="haddockdesc">
|
|
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-137" class="tabular"
|
|
cellspacing="0" cellpadding="0" rules="groups"
|
|
><colgroup id="TBL-137-1g"><col
|
|
id="TBL-137-1" /></colgroup><tr
|
|
style="vertical-align:baseline;" id="TBL-137-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-137-1-1"
|
|
class="td11"><span
|
|
class="pcrb7t-">zipWithM</span><span
|
|
class="pcrb7t-"> ::</span><span
|
|
class="pcrb7t-"> Monad</span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> =></span><span
|
|
class="pcrb7t-"> (a</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> b</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> c)</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> [a]</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> [b]</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> [c] </span></td>
|
|
</tr></table> </div> <dd class="haddockdesc">
|
|
The <span
|
|
class="pcrr7t-">zipWithM</span><a
|
|
id="dx21-198005"></a> function generalizes <span
|
|
class="pcrr7t-">zipWith</span><a
|
|
id="dx21-198006"></a> to arbitrary monads.
|
|
</dl>
|
|
<p class="noindent">
|
|
<dl> <dt class="haddockdesc">
|
|
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-138" class="tabular"
|
|
cellspacing="0" cellpadding="0" rules="groups"
|
|
><colgroup id="TBL-138-1g"><col
|
|
id="TBL-138-1" /></colgroup><tr
|
|
style="vertical-align:baseline;" id="TBL-138-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-138-1-1"
|
|
class="td11"><span
|
|
class="pcrb7t-">zipWithM_</span><span
|
|
class="pcrb7t-"> ::</span><span
|
|
class="pcrb7t-"> Monad</span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> =></span><span
|
|
class="pcrb7t-"> (a</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> b</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> c)</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> [a]</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> [b]</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> () </span></td>
|
|
</tr></table> </div> <dd class="haddockdesc">
|
|
<span
|
|
class="pcrr7t-">zipWithM_</span><a
|
|
id="dx21-198007"></a> is the extension of <span
|
|
class="pcrr7t-">zipWithM</span><a
|
|
id="dx21-198008"></a> which ignores the final result.
|
|
</dl>
|
|
|
|
|
|
|
|
<p class="noindent">
|
|
<dl> <dt class="haddockdesc">
|
|
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-139" class="tabular"
|
|
cellspacing="0" cellpadding="0" rules="groups"
|
|
><colgroup id="TBL-139-1g"><col
|
|
id="TBL-139-1" /></colgroup><tr
|
|
style="vertical-align:baseline;" id="TBL-139-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-139-1-1"
|
|
class="td11"><span
|
|
class="pcrb7t-">foldM</span><span
|
|
class="pcrb7t-"> ::</span><span
|
|
class="pcrb7t-"> Monad</span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> =></span><span
|
|
class="pcrb7t-"> (a</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> b</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> a)</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> a</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> [b]</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> a </span></td>
|
|
</tr></table> </div> <dd class="haddockdesc">
|
|
The <span
|
|
class="pcrr7t-">foldM</span><a
|
|
id="dx21-198009"></a> function is analogous to <span
|
|
class="pcrr7t-">foldl</span><a
|
|
id="dx21-198010"></a>, except that its result is encapsulated in a monad. Note
|
|
that <span
|
|
class="pcrr7t-">foldM</span><a
|
|
id="dx21-198011"></a> works from left-to-right over the list arguments. This could be an issue where <span
|
|
class="pcrr7t-">(>>) </span>and
|
|
the ‘folded function’ are not commutative.
|
|
<p class="noindent">
|
|
<div class="quote">
|
|
|
|
|
|
|
|
<div class="verbatim" id="verbatim-371">
|
|
       foldM f a1 [x1, x2, ..., xm]
|
|
</div>
|
|
<p class="noindent"></div>
|
|
<p class="noindent"> ==
|
|
<p class="noindent">
|
|
<div class="quote">
|
|
|
|
|
|
|
|
<div class="verbatim" id="verbatim-372">
|
|
       do
|
|
 <br />         a2 <- f a1 x1
|
|
 <br />         a3 <- f a2 x2
|
|
 <br />         ...
|
|
 <br />         f am xm
|
|
</div>
|
|
<p class="noindent"></div>
|
|
<p class="noindent"> If right-to-left evaluation is required, the input list should be reversed.
|
|
</dl>
|
|
<p class="noindent">
|
|
<dl> <dt class="haddockdesc">
|
|
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-140" class="tabular"
|
|
cellspacing="0" cellpadding="0" rules="groups"
|
|
><colgroup id="TBL-140-1g"><col
|
|
id="TBL-140-1" /></colgroup><tr
|
|
style="vertical-align:baseline;" id="TBL-140-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-140-1-1"
|
|
class="td11"><span
|
|
class="pcrb7t-">foldM_</span><span
|
|
class="pcrb7t-"> ::</span><span
|
|
class="pcrb7t-"> Monad</span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> =></span><span
|
|
class="pcrb7t-"> (a</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> b</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> a)</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> a</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> [b]</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> () </span></td>
|
|
</tr></table> </div> <dd class="haddockdesc">
|
|
Like <span
|
|
class="pcrr7t-">foldM</span><a
|
|
id="dx21-198012"></a>, but discards the result.
|
|
</dl>
|
|
<p class="noindent">
|
|
<dl> <dt class="haddockdesc">
|
|
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-141" class="tabular"
|
|
cellspacing="0" cellpadding="0" rules="groups"
|
|
><colgroup id="TBL-141-1g"><col
|
|
id="TBL-141-1" /></colgroup><tr
|
|
style="vertical-align:baseline;" id="TBL-141-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-141-1-1"
|
|
class="td11"><span
|
|
class="pcrb7t-">replicateM</span><span
|
|
class="pcrb7t-"> ::</span><span
|
|
class="pcrb7t-"> Monad</span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> =></span><span
|
|
class="pcrb7t-"> Int</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> a</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> [a] </span></td>
|
|
</tr></table> </div> <dd class="haddockdesc">
|
|
<span
|
|
class="pcrr7t-">replicateM</span><span
|
|
class="pcrr7t-"> n</span><span
|
|
class="pcrr7t-"> act </span>performs the action <span
|
|
class="pcrr7t-">n </span>times, gathering the results.
|
|
</dl>
|
|
<p class="noindent">
|
|
<dl> <dt class="haddockdesc">
|
|
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-142" class="tabular"
|
|
cellspacing="0" cellpadding="0" rules="groups"
|
|
><colgroup id="TBL-142-1g"><col
|
|
id="TBL-142-1" /></colgroup><tr
|
|
style="vertical-align:baseline;" id="TBL-142-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-142-1-1"
|
|
class="td11"><span
|
|
class="pcrb7t-">replicateM_</span><span
|
|
class="pcrb7t-"> ::</span><span
|
|
class="pcrb7t-"> Monad</span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> =></span><span
|
|
class="pcrb7t-"> Int</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> a</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> () </span></td>
|
|
</tr></table> </div> <dd class="haddockdesc">
|
|
Like <span
|
|
class="pcrr7t-">replicateM</span><a
|
|
id="dx21-198013"></a>, but discards the result.
|
|
</dl>
|
|
<p class="noindent">
|
|
<h4 class="subsectionHead"><span class="titlemark">13.2.4 </span> <a
|
|
id="x21-19900013.2.4"></a>Conditional execution of monadic expressions </h4>
|
|
<p class="noindent">
|
|
<dl> <dt class="haddockdesc">
|
|
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-143" class="tabular"
|
|
cellspacing="0" cellpadding="0" rules="groups"
|
|
><colgroup id="TBL-143-1g"><col
|
|
id="TBL-143-1" /></colgroup><tr
|
|
style="vertical-align:baseline;" id="TBL-143-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-143-1-1"
|
|
class="td11"><span
|
|
class="pcrb7t-">guard</span><span
|
|
class="pcrb7t-"> ::</span><span
|
|
class="pcrb7t-"> MonadPlus</span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> =></span><span
|
|
class="pcrb7t-"> Bool</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> () </span></td>
|
|
</tr></table> </div> <dd class="haddockdesc">
|
|
<span
|
|
class="pcrr7t-">guard</span><span
|
|
class="pcrr7t-"> b </span>is <span
|
|
class="pcrr7t-">return</span><span
|
|
class="pcrr7t-"> () </span>if <span
|
|
class="pcrr7t-">b </span>is <span
|
|
class="pcrr7t-">True</span><a
|
|
id="dx21-199001"></a>, and <span
|
|
class="pcrr7t-">mzero</span><a
|
|
id="dx21-199002"></a> if <span
|
|
class="pcrr7t-">b </span>is <span
|
|
class="pcrr7t-">False</span><a
|
|
id="dx21-199003"></a>.
|
|
</dl>
|
|
|
|
|
|
|
|
<p class="noindent">
|
|
<dl> <dt class="haddockdesc">
|
|
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-144" class="tabular"
|
|
cellspacing="0" cellpadding="0" rules="groups"
|
|
><colgroup id="TBL-144-1g"><col
|
|
id="TBL-144-1" /></colgroup><tr
|
|
style="vertical-align:baseline;" id="TBL-144-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-144-1-1"
|
|
class="td11"><span
|
|
class="pcrb7t-">when</span><span
|
|
class="pcrb7t-"> ::</span><span
|
|
class="pcrb7t-"> Monad</span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> =></span><span
|
|
class="pcrb7t-"> Bool</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> ()</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> () </span></td>
|
|
</tr></table> </div> <dd class="haddockdesc">
|
|
Conditional execution of monadic expressions. For example,
|
|
<p class="noindent">
|
|
<div class="quote">
|
|
|
|
|
|
|
|
<div class="verbatim" id="verbatim-373">
|
|
       when debug (putStr "Debugging\n")
|
|
</div>
|
|
<p class="noindent"></div>
|
|
<p class="noindent"> will output the string <span
|
|
class="pcrr7t-">Debugging\n </span>if the Boolean value <span
|
|
class="pcrr7t-">debug </span>is <span
|
|
class="pcrr7t-">True</span><a
|
|
id="dx21-199004"></a>, and otherwise do
|
|
nothing.
|
|
</dl>
|
|
<p class="noindent">
|
|
<dl> <dt class="haddockdesc">
|
|
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-145" class="tabular"
|
|
cellspacing="0" cellpadding="0" rules="groups"
|
|
><colgroup id="TBL-145-1g"><col
|
|
id="TBL-145-1" /></colgroup><tr
|
|
style="vertical-align:baseline;" id="TBL-145-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-145-1-1"
|
|
class="td11"><span
|
|
class="pcrb7t-">unless</span><span
|
|
class="pcrb7t-"> ::</span><span
|
|
class="pcrb7t-"> Monad</span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> =></span><span
|
|
class="pcrb7t-"> Bool</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> ()</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> () </span></td>
|
|
</tr></table> </div> <dd class="haddockdesc">
|
|
The reverse of <span
|
|
class="pcrr7t-">when</span><a
|
|
id="dx21-199005"></a>.
|
|
</dl>
|
|
<p class="noindent">
|
|
<h4 class="subsectionHead"><span class="titlemark">13.2.5 </span> <a
|
|
id="x21-20000013.2.5"></a>Monadic lifting operators </h4>
|
|
<p class="noindent">
|
|
<dl> <dt class="haddockdesc">
|
|
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-146" class="tabular"
|
|
cellspacing="0" cellpadding="0" rules="groups"
|
|
><colgroup id="TBL-146-1g"><col
|
|
id="TBL-146-1" /></colgroup><tr
|
|
style="vertical-align:baseline;" id="TBL-146-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-146-1-1"
|
|
class="td11"><span
|
|
class="pcrb7t-">liftM</span><span
|
|
class="pcrb7t-"> ::</span><span
|
|
class="pcrb7t-"> Monad</span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> =></span><span
|
|
class="pcrb7t-"> (a1</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> r)</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> a1</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> r </span></td>
|
|
</tr></table> </div> <dd class="haddockdesc">
|
|
Promote a function to a monad.
|
|
</dl>
|
|
<p class="noindent">
|
|
<dl> <dt class="haddockdesc">
|
|
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-147" class="tabular"
|
|
cellspacing="0" cellpadding="0" rules="groups"
|
|
><colgroup id="TBL-147-1g"><col
|
|
id="TBL-147-1" /></colgroup><tr
|
|
style="vertical-align:baseline;" id="TBL-147-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-147-1-1"
|
|
class="td11"><span
|
|
class="pcrb7t-">liftM2</span><span
|
|
class="pcrb7t-"> ::</span><span
|
|
class="pcrb7t-"> Monad</span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> =></span><span
|
|
class="pcrb7t-"> (a1</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> a2</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> r)</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> a1</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> a2</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> r </span></td>
|
|
</tr></table> </div> <dd class="haddockdesc">
|
|
Promote a function to a monad, scanning the monadic arguments from left to right. For example,
|
|
<p class="noindent">
|
|
<div class="quote">
|
|
|
|
|
|
|
|
<div class="verbatim" id="verbatim-374">
|
|
    liftM2 (+) [0,1] [0,2] = [0,2,1,3]
|
|
 <br />    liftM2 (+) (Just 1) Nothing = Nothing
|
|
</div>
|
|
<p class="noindent"></div>
|
|
</dl>
|
|
<p class="noindent">
|
|
<dl><dt class="haddockdesc">
|
|
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-148" class="tabular"
|
|
cellspacing="0" cellpadding="0" rules="groups"
|
|
><colgroup id="TBL-148-1g"><col
|
|
id="TBL-148-1" /></colgroup><tr
|
|
style="vertical-align:baseline;" id="TBL-148-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-148-1-1"
|
|
class="td11"><span
|
|
class="pcrb7t-">liftM3</span><span
|
|
class="pcrb7t-"> ::</span><span
|
|
class="pcrb7t-"> Monad</span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> =></span><span
|
|
class="pcrb7t-"> (a1</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> a2</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> a3</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> r) </span></td></tr><tr
|
|
style="vertical-align:baseline;" id="TBL-148-2-"><td style="white-space:nowrap; text-align:left;" id="TBL-148-2-1"
|
|
class="td11"><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> a1</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> a2</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> a3</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> r</span></td>
|
|
</tr></table> </div> <dd class="haddockdesc">
|
|
Promote a function to a monad, scanning the monadic arguments from left to right (cf. <span
|
|
class="pcrr7t-">liftM2</span><a
|
|
id="dx21-200001"></a>).
|
|
</dl>
|
|
<p class="noindent">
|
|
<dl> <dt class="haddockdesc">
|
|
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-149" class="tabular"
|
|
cellspacing="0" cellpadding="0" rules="groups"
|
|
><colgroup id="TBL-149-1g"><col
|
|
id="TBL-149-1" /></colgroup><tr
|
|
style="vertical-align:baseline;" id="TBL-149-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-149-1-1"
|
|
class="td11"><span
|
|
class="pcrb7t-">liftM4</span><span
|
|
class="pcrb7t-"> ::</span><span
|
|
class="pcrb7t-"> Monad</span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> =></span><span
|
|
class="pcrb7t-"> (a1</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> a2</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> a3</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> a4</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> r) </span></td></tr><tr
|
|
style="vertical-align:baseline;" id="TBL-149-2-"><td style="white-space:nowrap; text-align:left;" id="TBL-149-2-1"
|
|
class="td11"><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> a1</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> a2</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> a3</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> a4</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> r</span></td>
|
|
</tr></table> </div> <dd class="haddockdesc">
|
|
Promote a function to a monad, scanning the monadic arguments from left to right (cf. <span
|
|
class="pcrr7t-">liftM2</span><a
|
|
id="dx21-200002"></a>).
|
|
</dl>
|
|
<p class="noindent">
|
|
<dl> <dt class="haddockdesc">
|
|
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-150" class="tabular"
|
|
cellspacing="0" cellpadding="0" rules="groups"
|
|
><colgroup id="TBL-150-1g"><col
|
|
id="TBL-150-1" /></colgroup><tr
|
|
style="vertical-align:baseline;" id="TBL-150-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-150-1-1"
|
|
class="td11"><span
|
|
class="pcrb7t-">liftM5</span><span
|
|
class="pcrb7t-"> ::</span><span
|
|
class="pcrb7t-"> Monad</span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> =></span><span
|
|
class="pcrb7t-"> (a1</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> a2</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> a3</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> a4</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> a5</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> r) </span></td></tr><tr
|
|
style="vertical-align:baseline;" id="TBL-150-2-"><td style="white-space:nowrap; text-align:left;" id="TBL-150-2-1"
|
|
class="td11"><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> </span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> a1</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> a2</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> a3</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> a4</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> a5</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> r</span></td>
|
|
</tr></table> </div> <dd class="haddockdesc">
|
|
Promote a function to a monad, scanning the monadic arguments from left to right (cf. <span
|
|
class="pcrr7t-">liftM2</span><a
|
|
id="dx21-200003"></a>).
|
|
</dl>
|
|
<p class="noindent">
|
|
<dl> <dt class="haddockdesc">
|
|
<!--tex4ht:inline--><div class="tabular"> <table id="TBL-151" class="tabular"
|
|
cellspacing="0" cellpadding="0" rules="groups"
|
|
><colgroup id="TBL-151-1g"><col
|
|
id="TBL-151-1" /></colgroup><tr
|
|
style="vertical-align:baseline;" id="TBL-151-1-"><td style="white-space:nowrap; text-align:left;" id="TBL-151-1-1"
|
|
class="td11"><span
|
|
class="pcrb7t-">ap</span><span
|
|
class="pcrb7t-"> ::</span><span
|
|
class="pcrb7t-"> Monad</span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> =></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> (a</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> b)</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> a</span><span
|
|
class="pcrb7t-"> -></span><span
|
|
class="pcrb7t-"> m</span><span
|
|
class="pcrb7t-"> b </span></td>
|
|
</tr></table> </div> <dd class="haddockdesc">
|
|
In many situations, the <span
|
|
class="pcrr7t-">liftM</span><a
|
|
id="dx21-200004"></a> operations can be replaced by uses of <span
|
|
class="pcrr7t-">ap</span><a
|
|
id="dx21-200005"></a>, which promotes function
|
|
application.
|
|
<p class="noindent">
|
|
<div class="quote">
|
|
|
|
|
|
|
|
<div class="verbatim" id="verbatim-375">
|
|
       return f ‘ap‘ x1 ‘ap‘ ... ‘ap‘ xn
|
|
</div>
|
|
<p class="noindent"></div>
|
|
<p class="noindent"> is equivalent to
|
|
<p class="noindent">
|
|
<div class="quote">
|
|
|
|
|
|
|
|
<div class="verbatim" id="verbatim-376">
|
|
       liftMn f x1 x2 ... xn
|
|
</div>
|
|
<p class="noindent"></div>
|
|
</dl>
|
|
<!--l. 1--><div class="crosslinks"><p class="noindent">[<a
|
|
href="haskellch14.html" >next</a>] [<a
|
|
href="haskellch13.html" >front</a>] [<a
|
|
href="haskellpa2.html#haskellch13.html" >up</a>] </p></div>
|
|
<p class="noindent"> <a
|
|
id="tailhaskellch13.html"></a>
|
|
</body></html>
|