-
Notifications
You must be signed in to change notification settings - Fork 18
Expand file tree
/
Copy pathLessons-Lesson12.html
More file actions
11 lines (11 loc) · 9.9 KB
/
Lessons-Lesson12.html
File metadata and controls
11 lines (11 loc) · 9.9 KB
1
2
3
4
5
6
7
8
9
10
11
<!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" /><meta name="viewport" content="width=device-width, initial-scale=1" /><title>Lessons.Lesson12</title><link href="linuwial.css" rel="stylesheet" type="text/css" title="Linuwial" /><link rel="stylesheet" type="text/css" href="quick-jump.css" /><link rel="stylesheet" type="text/css" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400i,700" /><script src="haddock-bundle.min.js" async="async" type="text/javascript"></script><script type="text/x-mathjax-config">MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"></script></head><body><div id="package-header"><span class="caption empty"> </span><ul class="links" id="page-menu"><li><a href="src/Lessons.Lesson12.html">Source</a></li><li><a href="index.html">Contents</a></li><li><a href="doc-index.html">Index</a></li></ul></div><div id="content"><div id="module-header"><table class="info"><tr><th>Safe Haskell</th><td>Safe-Inferred</td></tr></table><p class="caption">Lessons.Lesson12</p></div><div id="description"><p class="caption">Description</p><div class="doc"><p>Notes taken by Deimantė Davidavičiūtė</p></div></div><div id="synopsis"><details id="syn"><summary>Synopsis</summary><ul class="details-toggle" data-details-id="syn"><li class="src short"><span class="keyword">type</span> <a href="#t:MyDomain">MyDomain</a> a = Free <a href="Lessons-Lesson12.html#t:MyDomainAlgebra" title="Lessons.Lesson12">MyDomainAlgebra</a> a</li><li class="src short"><span class="keyword">data</span> <a href="#t:MyDomainAlgebra">MyDomainAlgebra</a> next<ul class="subs"><li>= <a href="#v:Calculate">Calculate</a> <a href="Lessons-Lesson11.html#t:Expr" title="Lessons.Lesson11">Expr</a> (Integer -> next)</li><li>| <a href="#v:Store">Store</a> Integer (() -> next)</li><li>| <a href="#v:Restore">Restore</a> (Integer -> next)</li></ul></li><li class="src short"><a href="#v:calculte">calculte</a> :: <a href="Lessons-Lesson11.html#t:Expr" title="Lessons.Lesson11">Expr</a> -> <a href="Lessons-Lesson12.html#t:MyDomain" title="Lessons.Lesson12">MyDomain</a> Integer</li><li class="src short"><a href="#v:store">store</a> :: Integer -> <a href="Lessons-Lesson12.html#t:MyDomain" title="Lessons.Lesson12">MyDomain</a> ()</li><li class="src short"><a href="#v:restore">restore</a> :: <a href="Lessons-Lesson12.html#t:MyDomain" title="Lessons.Lesson12">MyDomain</a> Integer</li><li class="src short"><a href="#v:myProgram">myProgram</a> :: <a href="Lessons-Lesson12.html#t:MyDomain" title="Lessons.Lesson12">MyDomain</a> Integer</li><li class="src short"><a href="#v:runInIO">runInIO</a> :: <a href="Lessons-Lesson12.html#t:MyDomain" title="Lessons.Lesson12">MyDomain</a> a -> IO a</li><li class="src short"><a href="#v:runInState">runInState</a> :: <a href="Lessons-Lesson12.html#t:MyDomain" title="Lessons.Lesson12">MyDomain</a> a -> State Integer a</li><li class="src short"><a href="#v:runState">runState</a> :: State s a -> s -> (a, s)</li></ul></details></div><div id="interface"><h1>Documentation</h1><div class="top"><p class="src"><span class="keyword">type</span> <a id="t:MyDomain" class="def">MyDomain</a> a = Free <a href="Lessons-Lesson12.html#t:MyDomainAlgebra" title="Lessons.Lesson12">MyDomainAlgebra</a> a <a href="src/Lessons.Lesson12.html#MyDomain" class="link">Source</a> <a href="#t:MyDomain" class="selflink">#</a></p><div class="doc"><p>The Free monad over <code><a href="Lessons-Lesson12.html#t:MyDomainAlgebra" title="Lessons.Lesson12">MyDomainAlgebra</a></code>.</p></div></div><div class="top"><p class="src"><span class="keyword">data</span> <a id="t:MyDomainAlgebra" class="def">MyDomainAlgebra</a> next <a href="src/Lessons.Lesson12.html#MyDomainAlgebra" class="link">Source</a> <a href="#t:MyDomainAlgebra" class="selflink">#</a></p><div class="doc"><p>The algebra of our domain:</p><p>'Calculate Expr (Integer -> next)': evaluate an arithmetic expression, then pass the resulting Integer to the continuation.</p><p>'Store Integer (() -> next)': store a number and continue.</p><p>'Restore (Integer -> next)': fetch the last stored number and continue.</p></div><div class="subs constructors"><p class="caption">Constructors</p><table><tr><td class="src"><a id="v:Calculate" class="def">Calculate</a> <a href="Lessons-Lesson11.html#t:Expr" title="Lessons.Lesson11">Expr</a> (Integer -> next)</td><td class="doc empty"> </td></tr><tr><td class="src"><a id="v:Store" class="def">Store</a> Integer (() -> next)</td><td class="doc empty"> </td></tr><tr><td class="src"><a id="v:Restore" class="def">Restore</a> (Integer -> next)</td><td class="doc empty"> </td></tr></table></div><div class="subs instances"><h4 class="instances details-toggle-control details-toggle" data-details-id="i:MyDomainAlgebra">Instances</h4><details id="i:MyDomainAlgebra" open="open"><summary class="hide-when-js-enabled">Instances details</summary><table><tr><td class="src clearfix"><span class="inst-left"><span class="instance details-toggle-control details-toggle" data-details-id="i:id:MyDomainAlgebra:Functor:1"></span> Functor <a href="Lessons-Lesson12.html#t:MyDomainAlgebra" title="Lessons.Lesson12">MyDomainAlgebra</a></span> <a href="src/Lessons.Lesson12.html#line-32" class="link">Source</a> <a href="#t:MyDomainAlgebra" class="selflink">#</a></td><td class="doc"><p>Our algebra must be a Functor to build a Free monad.
Demonstration of functorial mapping (not tied to our type):</p><pre class="screen"><code class="prompt">>>> </code><strong class="userinput"><code>fmap (+5) (Just 5)
</code></strong>Just 10
</pre></td></tr><tr><td colspan="2"><details id="i:id:MyDomainAlgebra:Functor:1"><summary class="hide-when-js-enabled">Instance details</summary><p>Defined in <a href="Lessons-Lesson12.html">Lessons.Lesson12</a></p> <div class="subs methods"><p class="caption">Methods</p><p class="src"><a href="#v:fmap">fmap</a> :: (a -> b) -> <a href="Lessons-Lesson12.html#t:MyDomainAlgebra" title="Lessons.Lesson12">MyDomainAlgebra</a> a -> <a href="Lessons-Lesson12.html#t:MyDomainAlgebra" title="Lessons.Lesson12">MyDomainAlgebra</a> b</p><p class="src"><a href="#v:-60--36-">(<$)</a> :: a -> <a href="Lessons-Lesson12.html#t:MyDomainAlgebra" title="Lessons.Lesson12">MyDomainAlgebra</a> b -> <a href="Lessons-Lesson12.html#t:MyDomainAlgebra" title="Lessons.Lesson12">MyDomainAlgebra</a> a</p></div></details></td></tr></table></details></div></div><div class="top"><p class="src"><a id="v:calculte" class="def">calculte</a> :: <a href="Lessons-Lesson11.html#t:Expr" title="Lessons.Lesson11">Expr</a> -> <a href="Lessons-Lesson12.html#t:MyDomain" title="Lessons.Lesson12">MyDomain</a> Integer <a href="src/Lessons.Lesson12.html#calculte" class="link">Source</a> <a href="#v:calculte" class="selflink">#</a></p><div class="doc"><p>Lift a <code><a href="Lessons-Lesson12.html#v:Calculate" title="Lessons.Lesson12">Calculate</a></code> instruction into the Free program.</p></div></div><div class="top"><p class="src"><a id="v:store" class="def">store</a> :: Integer -> <a href="Lessons-Lesson12.html#t:MyDomain" title="Lessons.Lesson12">MyDomain</a> () <a href="src/Lessons.Lesson12.html#store" class="link">Source</a> <a href="#v:store" class="selflink">#</a></p><div class="doc"><p>Lift a <code><a href="Lessons-Lesson12.html#v:Store" title="Lessons.Lesson12">Store</a></code> instruction.</p></div></div><div class="top"><p class="src"><a id="v:restore" class="def">restore</a> :: <a href="Lessons-Lesson12.html#t:MyDomain" title="Lessons.Lesson12">MyDomain</a> Integer <a href="src/Lessons.Lesson12.html#restore" class="link">Source</a> <a href="#v:restore" class="selflink">#</a></p><div class="doc"><p>Lift a <code><a href="Lessons-Lesson12.html#v:Restore" title="Lessons.Lesson12">Restore</a></code> instruction.</p></div></div><div class="top"><p class="src"><a id="v:myProgram" class="def">myProgram</a> :: <a href="Lessons-Lesson12.html#t:MyDomain" title="Lessons.Lesson12">MyDomain</a> Integer <a href="src/Lessons.Lesson12.html#myProgram" class="link">Source</a> <a href="#v:myProgram" class="selflink">#</a></p><div class="doc"><p>A sample program composed of our domain actions.</p><p>Calculates an expression and binds it to <code>r</code>
Restores previously stored value <code>v0</code>.
Stores <code>r</code> and then stores 42.
Restores <code>v1</code> and returns the sum.</p></div></div><div class="top"><p class="src"><a id="v:runInIO" class="def">runInIO</a> :: <a href="Lessons-Lesson12.html#t:MyDomain" title="Lessons.Lesson12">MyDomain</a> a -> IO a <a href="src/Lessons.Lesson12.html#runInIO" class="link">Source</a> <a href="#v:runInIO" class="selflink">#</a></p><div class="doc"><p>An interpreter that runs the program in IO.
Effects are implemented as printing/prompts and pure evaluation.</p></div></div><div class="top"><p class="src"><a id="v:runInState" class="def">runInState</a> :: <a href="Lessons-Lesson12.html#t:MyDomain" title="Lessons.Lesson12">MyDomain</a> a -> State Integer a <a href="src/Lessons.Lesson12.html#runInState" class="link">Source</a> <a href="#v:runInState" class="selflink">#</a></p><div class="doc"><p>Interpreter that runs the program in pure 'State Integer'.
The state holds the latest stored number.</p><pre class="screen"><code class="prompt">>>> </code><strong class="userinput"><code>runState (runInState myProgram) 0
</code></strong>(27,42)
</pre></div></div><div class="top"><p class="src"><a id="v:runState" class="def">runState</a> :: State s a -> s -> (a, s) <a href="#v:runState" class="selflink">#</a></p></div></div></div><div id="footer"><p>Produced by <a href="http://www.haskell.org/haddock/">Haddock</a> version 2.29.2</p></div></body></html>