operational-0.2.0.0: docs/web/examples/State.hs.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ -->
<title>examples/State.hs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
<pre><span class='hs-comment'>{------------------------------------------------------------------------------
Control.Monad.Operational
Example:
State monad and monad transformer
------------------------------------------------------------------------------}</span>
<span class='hs-comment'>{-# LANGUAGE GADTs, Rank2Types, FlexibleInstances #-}</span>
<span class='hs-keyword'>module</span> <span class='hs-conid'>State</span> <span class='hs-keyword'>where</span>
<span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Monad</span>
<span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Monad</span><span class='hs-varop'>.</span><span class='hs-conid'>Operational</span>
<span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Monad</span><span class='hs-varop'>.</span><span class='hs-conid'>Trans</span>
<span class='hs-comment'>{------------------------------------------------------------------------------
State Monad
------------------------------------------------------------------------------}</span>
<span class='hs-keyword'>data</span> <span class='hs-conid'>StateI</span> <span class='hs-varid'>s</span> <span class='hs-varid'>a</span> <span class='hs-keyword'>where</span>
<span class='hs-conid'>Get</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>StateI</span> <span class='hs-varid'>s</span> <span class='hs-varid'>s</span>
<span class='hs-conid'>Put</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>StateI</span> <span class='hs-varid'>s</span> <span class='hs-conid'>()</span>
<span class='hs-keyword'>type</span> <span class='hs-conid'>State</span> <span class='hs-varid'>s</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Program</span> <span class='hs-layout'>(</span><span class='hs-conid'>StateI</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span>
<span class='hs-definition'>evalState</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>State</span> <span class='hs-varid'>s</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span>
<span class='hs-definition'>evalState</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>eval</span> <span class='hs-varop'>.</span> <span class='hs-varid'>view</span>
<span class='hs-keyword'>where</span>
<span class='hs-varid'>eval</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ProgramView</span> <span class='hs-layout'>(</span><span class='hs-conid'>StateI</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<span class='hs-varid'>eval</span> <span class='hs-layout'>(</span><span class='hs-conid'>Return</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>const</span> <span class='hs-varid'>x</span>
<span class='hs-varid'>eval</span> <span class='hs-layout'>(</span><span class='hs-conid'>Get</span> <span class='hs-conop'>:>>=</span> <span class='hs-varid'>k</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>evalState</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-varid'>s</span> <span class='hs-layout'>)</span> <span class='hs-varid'>s</span>
<span class='hs-varid'>eval</span> <span class='hs-layout'>(</span><span class='hs-conid'>Put</span> <span class='hs-varid'>s</span> <span class='hs-conop'>:>>=</span> <span class='hs-varid'>k</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>evalState</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span> <span class='hs-varid'>s</span>
<span class='hs-definition'>put</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>StateT</span> <span class='hs-varid'>s</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span>
<span class='hs-definition'>put</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>singleton</span> <span class='hs-varop'>.</span> <span class='hs-conid'>Put</span>
<span class='hs-definition'>get</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>StateT</span> <span class='hs-varid'>s</span> <span class='hs-varid'>m</span> <span class='hs-varid'>s</span>
<span class='hs-definition'>get</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>singleton</span> <span class='hs-conid'>Get</span>
<span class='hs-definition'>testState</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Int</span>
<span class='hs-definition'>testState</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>evalState</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<span class='hs-varid'>x</span> <span class='hs-keyglyph'><-</span> <span class='hs-varid'>get</span>
<span class='hs-varid'>put</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-varop'>+</span><span class='hs-num'>2</span><span class='hs-layout'>)</span>
<span class='hs-varid'>get</span>
<span class='hs-comment'>{------------------------------------------------------------------------------
State Monad Transformer
------------------------------------------------------------------------------}</span>
<span class='hs-keyword'>type</span> <span class='hs-conid'>StateT</span> <span class='hs-varid'>s</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ProgramT</span> <span class='hs-layout'>(</span><span class='hs-conid'>StateI</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span>
<span class='hs-definition'>evalStateT</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>StateT</span> <span class='hs-varid'>s</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span>
<span class='hs-definition'>evalStateT</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>viewT</span> <span class='hs-varid'>m</span> <span class='hs-varop'>>>=</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>p</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>eval</span> <span class='hs-varid'>p</span> <span class='hs-varid'>s</span>
<span class='hs-keyword'>where</span>
<span class='hs-varid'>eval</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>ProgramViewT</span> <span class='hs-layout'>(</span><span class='hs-conid'>StateI</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<span class='hs-varid'>eval</span> <span class='hs-layout'>(</span><span class='hs-conid'>Return</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>return</span> <span class='hs-varid'>x</span>
<span class='hs-varid'>eval</span> <span class='hs-layout'>(</span><span class='hs-conid'>Get</span> <span class='hs-conop'>:>>=</span> <span class='hs-varid'>k</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>evalStateT</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-varid'>s</span> <span class='hs-layout'>)</span> <span class='hs-varid'>s</span>
<span class='hs-varid'>eval</span> <span class='hs-layout'>(</span><span class='hs-conid'>Put</span> <span class='hs-varid'>s</span> <span class='hs-conop'>:>>=</span> <span class='hs-varid'>k</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>evalStateT</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span> <span class='hs-varid'>s</span>
<span class='hs-definition'>testStateT</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>evalStateT</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<span class='hs-varid'>x</span> <span class='hs-keyglyph'><-</span> <span class='hs-varid'>get</span>
<span class='hs-varid'>lift</span> <span class='hs-varop'>$</span> <span class='hs-varid'>putStrLn</span> <span class='hs-str'>"Hello StateT"</span>
<span class='hs-varid'>put</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-varop'>+</span><span class='hs-num'>1</span><span class='hs-layout'>)</span>
</pre></body>
</html>