pages tagged haskell http://meng6net.localhost/tag/haskell/ <p><small>Copyright © 2005-2020 by <code>Meng Lu &lt;lumeng3@gmail.com&gt;</code></small></p> Meng Lu's home page ikiwiki Sat, 13 Oct 2018 03:56:52 +0000 Haskell http://meng6net.localhost/journal/Haskell/ http://meng6net.localhost/journal/Haskell/ Haskell computing journal note programming Sat, 13 Oct 2018 03:56:52 +0000 2018-10-13T03:56:52Z <h2>Journal</h2> <h3>Entering multi-line code in GHCi</h3> <p>Use <code>:{</code> and <code>:}</code> to sandwich a block of code consisting of multiple lines:</p> <pre><code>Prelude&gt; :{ Prelude| incrementInteger :: Int -&gt; Int Prelude| incrementInteger x = x + 1 Prelude| :} Prelude&gt; incrementInteger 1 2 </code></pre> <h3>Using the latest released version of GHC with stack</h3> <p>Specify the version of LTS (i.e. Long Term Support) Haskell to use by default in `$HOME/.stack/global-project/stack.yaml:</p> <pre><code>resolver: lts-8.15 </code></pre> <p>As of May, 2017, the newest released version of LTS Haskell is 8.15. This version number can be found on https://www.haskell.org/downloads.</p> <h3><code>data</code>, <code>type</code>, and <code>newtype</code></h3> <ul> <li> <p>https://stackoverflow.com/a/33316715</p> </li> <li> <p>In GHCi, print the type of a symbol</p> <pre><code> Prelude&gt; :type Nothing Nothing :: Maybe a Prelude&gt; :type (+) (+) :: Num a =&gt; a -&gt; a -&gt; a Prelude&gt; :type print "Hello World" print "Hello World" :: IO () </code></pre></li> </ul> <h3><code>Nothing</code> and <a href= "https://wiki.haskell.org/Maybe"><code>Maybe</code></a></h3> <h3><a href="https://wiki.haskell.org/Partial_application">Partial application</a></h3> <p>Functions are not partial, but rather a function can be applied partially.</p> <h3>Function type decalaration</h3> <pre><code>myFunc :: type1 -&gt; type2 -&gt; type3 -&gt; type4 </code></pre> <h3><a href="https://wiki.haskell.org/Pure">Pure as in 'pure functional programming languages'</a></h3> <h3>Get information about a Haskell word in GHCi</h3> <pre><code>Prelude&gt; :info pure class Functor f =&gt; Applicative (f :: * -&gt; *) where pure :: a -&gt; f a ... -- Defined in ‘GHC.Base’ </code></pre> <h3><a href="https://stackoverflow.com/a/9221026">Concatenating multiple strings into one using <code>intercalate</code>, <code>intersperse</code> and <code>concat</code>, and <code>unword</code></a>.</h3> <h3>Function application takes precedence over any binary operator.</h3> <p>For example,</p> <pre> <code>ourPicture = colored green (solidCircle 1) &amp; solidCircle 2 </code></pre> <p>is equivalent to</p> <pre> <code>ourPicture = (colored green (solidCircle 1)) &amp; (solidCircle 2) </code></pre> <h3><a href= "http://learnyouahaskell.com/syntax-in-functions">guard</a></h3> <h3>Changing a prefixing function to an infix binary operator</h3> <pre><code>Prelude&gt; mod 3 2 1 Prelude&gt; 3 `mod` 2 1 </code></pre> <h3>Largest integer</h3> <pre><code>Prelude&gt; :{ Prelude| myInt :: Int Prelude| myInt = 2^63 - 1 Prelude| :} Prelude&gt; myInt 9223372036854775807 Prelude&gt; myInt + 1 -9223372036854775808 Prelude&gt; :{ Prelude| minInt :: Int Prelude| minInt = - 2^63 Prelude| :} Prelude&gt; minInt -9223372036854775808 Prelude&gt; minInt - 1 9223372036854775807 </code></pre> <h2>Arithmetic expression with different types of numbers</h2> <pre><code>Prelude&gt; :{ Prelude| d :: Double Prelude| i :: Int Prelude| d = 1.2 Prelude| i = 1 Prelude| :} Prelude&gt; d+i &lt;interactive&gt;:48:3: error: • Couldn't match expected type ‘Double’ with actual type ‘Int’ • In the second argument of ‘(+)’, namely ‘i’ In the expression: d + i In an equation for ‘it’: it = d + i Prelude&gt; d + fromIntegral i 2.2 Prelude&gt; </code></pre> <h2>References</h2> <ul> <li>https://www.stackage.org <ul> <li>Lookup basic information about a word, e.g. <code>pure</code>: https://www.stackage.org/lts-8.15/hoogle?q=pure</li> </ul> </li> </ul> Haskell http://meng6net.localhost/computing/programming/Haskell/ http://meng6net.localhost/computing/programming/Haskell/ Haskell computing note programming Sat, 13 Oct 2018 03:56:52 +0000 2018-10-13T03:56:52Z <h2>Misc</h2> <ul> <li>http://tryhaskell.org</li> </ul> <h2>Softwares</h2> <h3>IDE's</h3> <ul> <li>http://code.world/haskell, an online IDE to write and run Haskell code, e.g. https://code.world/haskell#Ptxn0dmOwm9z1xqIGrwPfzQ.</li> </ul> Haskell and Wolfram Language syntax comparison http://meng6net.localhost/computing/programming/Haskell_and_Wolfram_Language_syntax_comparison/ http://meng6net.localhost/computing/programming/Haskell_and_Wolfram_Language_syntax_comparison/ Haskell Mathematica Wolfram computing note programming Fri, 19 May 2017 02:50:12 +0000 2017-05-22T20:24:50Z <table class="datatable"> <thead> <tr> <th>description</th> <th>Haskell</th> <th>Wolfram</th> <th colspan="2">comment</th> </tr> </thead> <tbody> <tr> <td>defining a named function with explicitly named arguments</td> <td> <pre> <code>incrementInteger :: Int -&gt; Int<br />incrementInteger n = n + 1</code></pre></td> <td> <pre><code>incrementInteger[n_Integer] := n + 1;</code></pre></td> <td colspan="2"></td> </tr> <tr> <td>defining a named function with lambda expression</td> <td> <pre> <code>incrementInteger :: Int -&gt; Int<br />incrementInteger = \n -&gt; n + 1</code></pre></td> <td> <pre> <code>incrementInteger = Function[{n}, n + 1];</code></pre></td> <td colspan="2"></td> </tr> <tr> <td>defining a function with a function name as one of the arguments</td> <td> <pre> <code>Prelude&gt; increment = \x -&gt; x+1<br />Prelude&gt; double = \x -&gt; 2*x<br />Prelude&gt; thenDouble someFunc = double . someFunc<br />Prelude&gt; thenDouble increment 3<br />8</code></pre></td> <td> <pre> <code>In[1]:= double = Function[x, 2<em>x];<br />increment = Function[x, x + 1];<br />thenDouble[someFunc_] := Composition[double, someFunc];<br /><br />In[4]:= thenDouble[increment]<br /><br />Out[4]= Function[x, 2 x]@</em>Function[x, x + 1]<br /><br />In[5]:= (thenDouble[increment])[3]<br /><br />Out[5]= 8<br /></code></pre></td> <td colspan="2"></td> </tr> <tr> <td>defining a function with locally definded intermediate functions</td> <td> <pre> <code>Prelude&gt; :{<br />Prelude&gt; myFunc1 x =<br />Prelude&gt; let y = sin x<br />Prelude&gt; in cos y<br />Prelude&gt; :}<br />Prelude&gt; myFunc1 pi<br />1.0<br /><br />Prelude&gt; :{<br />Prelude&gt; myFunc2 x =<br />Prelude&gt; cos y<br />Prelude&gt; where<br />Prelude&gt; y = sin x<br />Prelude&gt; :}<br />Prelude&gt; myFunc2 pi<br />1.0</code></pre></td> <td> <pre> <code>In[1]:= myFunc[x_]:=With[{f=Sin[x]},Cos[f]]<br />myFunc[Pi]<br />Out[2]= 1</code></pre></td> <td colspan="2">Alternatively, instead of using <code>With</code> (for symbolic replacement), <a href= "https://reference.wolfram.com/language/tutorial/BlocksComparedWithModules.html"> use <code>Module</code> (for lexical scoping) or <code>Block</code> (for dynamic scoping)</a>.</td> </tr> </tbody> </table> 《Learn You a Haskell for Great Good!》 study note http://meng6net.localhost/computing/programming/Learn_You_a_Haskell_for_Great_Good_reading_note/ http://meng6net.localhost/computing/programming/Learn_You_a_Haskell_for_Great_Good_reading_note/ Haskell book computing note programming to-do Thu, 18 May 2017 23:35:08 +0000 2017-05-18T23:35:08Z <h2>Introduction</h2> <ul> <li> <p>Haskell is a purely functional programming language.</p> </li> <li> <p>"In purely functional programming you don't tell the computer what to do as such but rather you tell it what stuff is. … You express that in the form of functions. … "</p> </li> <li> <p>A Haskell function cannot have side effects other than mapping its input to an output as a mathematical function.</p> </li> <li> <p>Haskell is lazy in that it does not compute anything until it have to in order to return a value.</p> </li> <li> <p>Haskell is statically typed.</p> <ul> <li>Type inference allows deducing the appropriate type automatically by inference on compatibility between the inputs and outputs.</li> </ul> </li> </ul> <h2>Starting out</h2> <h3>Ready, set, go!</h3> <ul> <li> <p><code>ghci</code>: The Glorious Glasgow Haskell Compilation System. Environment to interactively compile and run Haskell programs. Exit GHCi using <code>:quit</code>. <a href= "http://www.haskell.org/ghc/docs/5.04/html/users_guide/ghci.html">GHCi documentation</a>.</p> </li> <li> <p>Not-equal operator: <code>/=</code>.</p> </li> <li> <p>Compile-time error on incompatible types: <code>123 + "foobar"</code></p> </li> <li> <p>Compile a program: <code>ghci&gt; l:myprogram.hs</code>.</p> </li> <li> <p><code>'</code> is allowed in function name, e.g. <code>foo'Bar</code> is a valid function name.</p> </li> <li> <p>Function names cannot begin with a lower-case letter.</p> </li> </ul> <h3>An intro to lists</h3> <ul> <li> <p>In Haskell, a strings is a lists of characters.</p> </li> <li> <p>List and tuple syntax difference: <code>[1, 2]</code>, <code>(1, "foobar")</code>. A tuple can contain elements of different types, while a list cannot. This bears some similarity with Python's lists and tuples. A difference is that in Python, lists are mutable but tuples are not.</p> </li> <li> <p>Concatenate operation: <code>[1, 2] ++ [3, 4]</code>, <code>"foo" ++ "bar"</code>, <code>['a', 'b'] ++ ['c', 'd']</code>.</p> </li> <li> <p>[https://en.wikipedia.org/wiki/Cons cons] operation <code>:</code>:</p> <pre><code> Prelude&gt; 'f' : "bar" "fbar" Prelude&gt; 1: [3, 4] [1,3,4] Prelude&gt; </code></pre></li> <li> <p>If <code>"XXX...XXX"</code> is a very long string, <code>"XXX...XXX" ++ "foobar"</code> will be slow.</p> </li> <li> <p><code>[1, 2, 3]</code> equals <code>1 : 2 : 3 : []</code>.</p> </li> <li> <p>Take parts of a list: <code>[1, 3, 5, 7] !! 2</code> returns <code>5</code>. Haskell lists uses <a href= "https://en.wikipedia.org/wiki/Zero-based_numbering">zero-based numbering</a>. <code>take 2 [1, 3, 5, 7]</code> gives the third element <code>5</code>. <code>drop 2 [1, 3, 5, 7]</code> gives <code>[1, 3, 7]</code>. Compare this to Mathematica <code>{1,3,5,7}&lt;span class="createlink"&gt;3&lt;/span&gt;</code>, <code>Take[{1,3,5,7}, {3}]</code>, <code>Drop[{1,3,5,7}, {3}]</code>.</p> </li> <li> <p>Test element membership in a list: <code>elem 3 [2, 4, 6]</code> and <code>2 \</code>elem` [1, 3, 5, 7]`.</p> </li> <li> <p><code>[[1, 2], ["foo", "bar"]]</code> is invalid as the types of the elements of the two sub-lists are not same.</p> </li> <li> <p>Lists compare in <a href= "https://en.wikipedia.org/wiki/Lexicographical_order">lexicographical order</a>. E.g. <code>[1, 3, 4] &lt; [1, 4, 2]</code>.</p> </li> <li> <p><code>head [1, 2, 3]</code>, <code>tail [1, 2, 3]</code>, <code>init [1, 2, 3]</code>, <code>last [1, 2, 3]</code>. Compare with Mathematica / Wolfram Langauge namings: <code>First[{1,2,3}]</code>, <code>Rest[{1,2,3}]</code>, <code>Most[{1,2,3}]</code>, <code>Last[{1,2,3}]</code></p> </li> <li> <p><code>null [1, 2, 3]</code>, <code>null []</code></p> </li> </ul> <h2>Other side notes</h2> <ul> <li> <p>One of the key features and advantanges of Haskell is its purity: all side-effects are encapsulated in a monad.</p> </li> <li> <p>[https://en.wikipedia.org/wiki/Algebraic_data type Algebraic data type]:</p> <p>data List a = Nil | Cons a (List a)</p> <p>data Tree = Empty | Leaf Int | Node Tree Tree</p> </li> </ul> <p><code>Tree</code> is a <a href= "https://en.wikipedia.org/wiki/Tagged_union">sum data type</a> a.k.a. tagged union.</p> <p><code>Tree</code> is a <a href= "https://en.wikipedia.org/wiki/Recursive_data_type">recursive data type</a>.</p> <ul> <li> <p>Pattern matching in Haskell:</p> <pre><code> depth :: Tree -&gt; Int depth Empty = 0 depth (Leaf n) = 1 depth (Node l r) = 1 + max (depth l) (depth r) </code></pre></li> </ul> <h2>References</h2> <ul> <li> <p>https://ghcformacosx.github.io/</p> </li> <li> <p>Search a Haskell function by desired type signature, e.g. https://www.haskell.org/hoogle/?hoogle=String+-%3E+Int (And the desired function for turning an object to a <code>String</code> is possibly <code>read :: Read a =&gt; String -&gt; a</code>).</p> </li> </ul> Installing and configuring Haskell http://meng6net.localhost/computing/installing_and_configuring/installing_and_configuring_Haskell/ http://meng6net.localhost/computing/installing_and_configuring/installing_and_configuring_Haskell/ Haskell computing configuration documentation installation note software Tue, 16 May 2017 23:59:39 +0000 2017-05-20T22:12:25Z <h2><code>cabal</code> VS. <code>stack</code></h2> <p><code>cabal</code> and <code>stack</code> are two tools one can use to install Glasgow Haskell Compiler (GHC), i.e. the binaries <code>ghc</code> and <code>ghci</code>, and Haskell software packages. <code>stack</code> installs Haskell programs in <code>~/.stack</code> and <code>cabal</code> installs in <code>~/.cabal</code>. Using both <code>cabal</code> and <code>stack</code>, or either one of them is possible, but it seems the current general wisdom is that <code>stack</code> is more user friendly especially for beginners. So I chose to uninstall <code>cabal</code> and delete <code>~/.cabal</code>, and use <code>stack</code> only.</p> <h2>Install Haskell compiler and softwares using <code>stack</code></h2> <p><code>stack</code> is built on top of <code>cabal</code> (which in turn relies on <code>ghc-pkg</code>), the package management system for Haskell softwares, but is more user friendly in some ways.</p> <ul> <li> <p>Uninstall the ghc installed using the system's package management system</p> <ul> <li> <p>macOS:</p> <pre><code> brew uninstall --force cabal-install brew uninstall --force ghc </code></pre></li> <li> <p>Linux:</p> <pre><code> sudo apt-get remove ghc sudo apt-get remove cabal-install </code></pre></li> </ul> </li> <li> <p>Install <code>stack</code></p> <ul> <li> <p>macOS:</p> <pre><code> brew install haskell-stack </code></pre></li> <li> <p>Linux: Follow the instruction about installation in the official <a href= "http://docs.haskellstack.org/en/stable/install_and_upgrade/#ubuntu"> documentation</a>. Don't just do <code>sudo apt-get install haskell-stack</code>.</p> </li> </ul> </li> <li> <p>Install <code>ghc</code></p> <pre><code> stack setup </code></pre></li> <li> <p>If you want to use binaries installed via <code>stack</code> regularly, put them on path. Run <code>stack path</code> and append the paths of form <code>~/.stack/.../bin</code> in the output to <code>$PATH</code> in <code>~/.bashrc</code>.</p> </li> <li> <p>Install packages using <code>stack</code>:</p> <pre><code> stack install ghc-mod stack install cabal-install stack install hlint stack install pandoc stack install purescript stack install wreq stack install lens stack install ihaskell stack install projectile stack install use-package stack install which-key stack install apply-refact stack install codex stack install hasktags </code></pre> <ul> <li><code>ihaskell</code>: <a href= "https://github.com/gibiansky/IHaskell">IHaskell</a>, Haskell kernel for Jupyter notebooks.</li> </ul> </li> </ul> <h2>Install Haskell compiler and softwares using <code>cabal</code></h2> <ul> <li> <p>Install <code>ghc</code> and <code>cabal</code></p> <pre><code> brew install cabal-install ghc </code></pre></li> <li> <p>Install packages via <code>cabal</code></p> <pre><code> cabal update cabal install happy # 2016-3-5: prerequisite for ghc-mod cabal install ghc-mod hlint haskell-docs </code></pre></li> </ul> <h2>Verifying the stack and Haskell installation</h2> <pre><code>cd $HOME # Assume 'stack setup' has been run. stack init stack build --dependencies-only --test </code></pre> <h2>Configure Emacs for Haskell development</h2> <p>Install the following Emacs packages, ideally using the <a href= "https://elpa.gnu.org/">GNU Emacs Lisp Package Archive</a> (see also <a href="https://www.emacswiki.org/emacs/ELPA">EmacsWiki: ELPA</a>):</p> <ul> <li>Emacs packages specifically relevant for Haskell: <ul> <li>haskell-mode</li> <li>haskell-snippets</li> <li>flycheck-hlint</li> <li>intero</li> </ul> </li> <li><a href= "http://meng6net.localhost/computing/installing_and_configuring/installing_and_configuring_emacs"> Other Emacs packages</a> generally helpful.</li> </ul> <h2>Configure a Haskell project using <code>stack</code></h2> <h3>Create a project</h3> <pre><code>cd path/to/workspace/ stack new haskell-stack-test-project cd haskell-stack-test-project stack setup stack build --dependencies-only --test </code></pre> <p>This creates a new project using template <code>~/.stack/templates/new-template.hsfiles</code>. The project directory structure:</p> <pre><code>$ tree . ├── LICENSE ├── Setup.hs ├── app │ └── Main.hs ├── haskell-stack-test-project.cabal ├── src │ └── Lib.hs ├── stack.yaml └── test └── Spec.hs </code></pre> <p>Remarks:</p> <ul> <li><code>app/</code> contains the source file(s) for more application-specific logic, including a <code>app/Main.hs</code>.</li> <li><code>src/</code> contains the source file(s) for more shareable and general-purpose code.</li> </ul> <h3>Build</h3> <pre><code>$ cd path/to/haskell-stack-test-project $ stack build haskell-stack-test-project-0.1.0.0: configure Configuring haskell-stack-test-project-0.1.0.0... haskell-stack-test-project-0.1.0.0: build Preprocessing library haskell-stack-test-project-0.1.0.0... [1 of 1] Compiling Lib ( src/Lib.hs, .stack-work/dist/x86_64-osx/Cabal-1.22.5.0/build/Lib.o ) In-place registering haskell-stack-test-project-0.1.0.0... Preprocessing executable 'haskell-stack-test-project-exe' for haskell-stack-test-project-0.1.0.0... [1 of 1] Compiling Main ( app/Main.hs, .stack-work/dist/x86_64-osx/Cabal-1.22.5.0/build/haskell-stack-test-project-exe/haskell-stack-test-project-exe-tmp/Main.o ) Linking .stack-work/dist/x86_64-osx/Cabal-1.22.5.0/build/haskell-stack-test-project-exe/haskell-stack-test-project-exe ... haskell-stack-test-project-0.1.0.0: copy/register Installing library in /Users/meng/Dropbox/WorkSpace-Dropbox/Computing/repo-meng-lib/Haskell/haskell-stack-test-project/.stack-work/install/x86_64-osx/lts-5.5/7.10.3/lib/x86_64-osx-ghc-7.10.3/haskell-stack-test-project-0.1.0.0-BCjrGi4SAkj4MdkT4tD42y Installing executable(s) in /Users/meng/Dropbox/WorkSpace-Dropbox/Computing/repo-meng-lib/Haskell/haskell-stack-test-project/.stack-work/install/x86_64-osx/lts-5.5/7.10.3/bin Registering haskell-stack-test-project-0.1.0.0... </code></pre> <p>The path to the built executable is contained in the line starting with <code>Linking</code>: <code>Linking .stack-work/dist/x86_64-osx/Cabal-1.22.5.0/build/haskell-stack-test-project-exe/haskell-stack-test-project-exe ...</code>.</p> <pre> <code>$ .stack-work/dist/x86_64-osx/Cabal-1.22.5.0/build/haskell-stack-test-project-exe/haskell-stack-test-project-exe someFunc </code></pre> <h2>Configure a Haskell project using IntelliJ IDEA</h2> <ul> <li> <p>Install JetBrains' Haskell plug-in.</p> </li> <li> <p>Configure Languages &amp; Frameworks | Haskell:</p> </li> </ul> <p><a href= "http://meng6net.localhost/images/computing/installing_and_configuring/installing_and_configuring_Haskell/configure_Haskell_stack.png"> <img src= "http://meng6net.localhost/computing/installing_and_configuring/installing_and_configuring_Haskell/957x-configure_Haskell_stack.png" width="957" height="203" class="img" /></a></p> <p>If using binaries installed via <code>cabal</code>:</p> <p><a href= "http://meng6net.localhost/images/computing/installing_and_configuring/installing_and_configuring_Haskell/configure_Haskell_cabal.png"> <img src= "http://meng6net.localhost/computing/installing_and_configuring/installing_and_configuring_Haskell/763x-configure_Haskell_cabal.png" width="763" height="199" class="img" /></a></p> <ul> <li>Create a Haskell project and its first component.</li> </ul> <p>Use menu File | New | Project and select 'Haskell', click 'next', and choose name for the project and the name for the first module and its sub-directory:</p> <p><a href= "http://meng6net.localhost/images/computing/installing_and_configuring/installing_and_configuring_Haskell/create_Haskell_project_in_IntelliJ_IDEA.png"> <img src= "http://meng6net.localhost/computing/installing_and_configuring/installing_and_configuring_Haskell/945x-create_Haskell_project_in_IntelliJ_IDEA.png" width="945" height="640" class="img" /></a></p> <ul> <li>Set GHC (<code>ghc</code>) as the platform SDK: use menu File | Project Structure, and select '+' and navigate to the installation path of the desired version of <code>ghc</code>, e.g. <code>/Users/meng/.stack/programs/x86_64-osx/ghc-7.10.3</code> which is installed via <code>stack</code> or <code>/usr/local/Cellar/ghc/7.10.3</code>, which is installed via <code>brew</code>.</li> </ul> <p><a href= "http://meng6net.localhost/images/computing/installing_and_configuring/installing_and_configuring_Haskell/set_GHC_as_platform_SDK.png"> <img src= "http://meng6net.localhost/computing/installing_and_configuring/installing_and_configuring_Haskell/786x-set_GHC_as_platform_SDK.png" width="786" height="283" class="img" /></a></p> <ul> <li>Optionally, create additional modules in the project: use menu File | New | Module, select 'Haskell', and choose name for the module and directory.</li> </ul> <p><a href= "http://meng6net.localhost/images/computing/installing_and_configuring/installing_and_configuring_Haskell/Haskell_project_with_two_modules_in_IntelliJ_IDEA.png"> <img src= "http://meng6net.localhost/computing/installing_and_configuring/installing_and_configuring_Haskell/621x-Haskell_project_with_two_modules_in_IntelliJ_IDEA.png" width="621" height="415" class="img" /></a></p> <h2>References</h2> <ul> <li> <p>A 2-hour long video tutorial on setting up Haskell environment using <code>stack</code> by Christopher Allen and Julie Moronuki: <a href= "https://www.youtube.com/watch?v=sRonIB8ZStw">https://www.youtube.com/watch?v=sRonIB8ZStw</a>.</p> </li> <li> <p><a href= "https://www.stackage.org/">https://www.stackage.org/</a></p> </li> <li> <p>The Haskell Tool Stack documentation, <a href= "http://docs.haskellstack.org/en/stable/README/">http://docs.haskellstack.org/en/stable/README/</a></p> <ul> <li>guide: <a href= "http://docs.haskellstack.org/en/stable/GUIDE/">http://docs.haskellstack.org/en/stable/GUIDE/</a></li> </ul> </li> </ul>