Update tutorial to use stack

This commit is contained in:
Gabriel Gonzalez 2015-07-22 18:48:55 -07:00
parent 2dbfb45eec
commit 6c9b0ffe7f

View file

@ -24,13 +24,15 @@
If you are already proficient with Haskell, then you can get quickly up to If you are already proficient with Haskell, then you can get quickly up to
speed by reading the Quick Start guide at the top of "Turtle.Prelude". speed by reading the Quick Start guide at the top of "Turtle.Prelude".
To follow along with the examples, install the Haskell Platform: The easiest way to follow along with the examples is to download the
`stack` package management tool by following the instructions here:
<http://www.haskell.org/platform/> <https://github.com/commercialhaskell/stack>
... and then install the @turtle@ library by running: ... and then run:
> $ stack install turtle
> $ cabal install turtle
-} -}
module Turtle.Tutorial ( module Turtle.Tutorial (
@ -97,7 +99,9 @@ import Turtle
-- in both languages: -- in both languages:
-- --
-- @ -- @
-- #!\/usr\/bin\/env runhaskell -- #!\/usr\/bin\/env stack
-- \-\- stack \-\-resolver lts-2.9 \-\-install-ghc runghc \-\-package turtle
-- \
-- -- #!\/bin\/bash -- -- #!\/bin\/bash
-- {-\# LANGUAGE OverloadedStrings \#-} -- -- {-\# LANGUAGE OverloadedStrings \#-} --
-- -- -- --
@ -118,20 +122,20 @@ import Turtle
-- > $ ./example.hs -- > $ ./example.hs
-- > Hello, world! -- > Hello, world!
-- --
-- If you delete the first line of the program, you can also compile the above -- If you delete the first two lines of the program, you can also compile the
-- code to generate a native executable which will have a much faster startup -- above code to generate a native executable which will have a much faster
-- time and improved performance: -- startup time and improved performance:
-- --
-- > $ # `-O2` turns on all optimizations -- > $ # `-O2` turns on all optimizations
-- > $ # `-threaded` helps with piping shell output in and out of Haskell -- > $ # `-threaded` helps with piping shell output in and out of Haskell
-- > $ ghc -O2 -threaded example.hs -- > $ stack ghc -- -O2 -threaded example.hs
-- > $ ./example -- > $ ./example
-- > Hello, world! -- > Hello, world!
-- --
-- You can even run Haskell code interactively using @ghci@, which is an -- You can even run Haskell code interactively using @ghci@, which is an
-- interactive REPL for Haskell. You can either use @ghci@ by itself: -- interactive REPL for Haskell. You can either use @ghci@ by itself:
-- --
-- > $ ghci -- > $ stack ghci
-- > <ghci links in some libraries> -- > <ghci links in some libraries>
-- > Prelude> :set -XOverloadedStrings -- > Prelude> :set -XOverloadedStrings
-- > Prelude> import Turtle -- > Prelude> import Turtle
@ -141,21 +145,9 @@ import Turtle
-- > Prelude Turtle> :quit -- > Prelude Turtle> :quit
-- > $ -- > $
-- --
-- ... or you can load Haskell code into @ghci@, which will bring all top-level
-- values from that program into scope:
--
-- > $ ghci example.hs
-- > <ghci links in some libraries>
-- > [1 of 1] Compiling Main ( example.hs, interpreted )
-- > Ok, modules loaded: Main.
-- > *Main> main
-- > <ghci links in some libraries>
-- > Hello, world!
-- > *Main> :quit
-- > $
--
-- From now on I'll omit @ghci@'s linker output in tutorial examples. You can -- From now on I'll omit @ghci@'s linker output in tutorial examples. You can
-- also silence this linker output by passing the @-v0@ flag to @ghci@. -- also silence this linker output by passing @--ghc-options -v0@ to
-- @stack ghci@.
-- $compare -- $compare
-- You'll already notice a few differences between the Haskell code and Bash -- You'll already notice a few differences between the Haskell code and Bash
@ -172,7 +164,9 @@ import Turtle
-- distinguish strings by quoting them. The following example highlights the -- distinguish strings by quoting them. The following example highlights the
-- difference: -- difference:
-- --
-- > #!/usr/bin/env runhaskell -- > #!/usr/bin/env stack
-- > -- stack --resolver lts-2.9 --install-ghc runghc --package turtle
-- >
-- > -- #!/bin/bash -- > -- #!/bin/bash
-- > {-# LANGUAGE OverloadedStrings #-} -- -- > {-# LANGUAGE OverloadedStrings #-} --
-- > -- -- > --
@ -187,7 +181,8 @@ import Turtle
-- define things out of order. For example, we could have written our original -- define things out of order. For example, we could have written our original
-- program this way instead: -- program this way instead:
-- --
-- > #!/usr/bin/env runhaskell -- > #!/usr/bin/env stack
-- > -- stack --resolver lts-2.9 --install-ghc runghc --package turtle
-- > -- >
-- > {-# LANGUAGE OverloadedStrings #-} -- > {-# LANGUAGE OverloadedStrings #-}
-- > -- >
@ -202,7 +197,8 @@ import Turtle
-- (using the @=@ sign). However, the top level of a Haskell program only -- (using the @=@ sign). However, the top level of a Haskell program only
-- permits definitions. If you were to insert a statement at the top-level: -- permits definitions. If you were to insert a statement at the top-level:
-- --
-- > #!/usr/bin/env runhaskell -- > #!/usr/bin/env stack
-- > -- stack --resolver lts-2.9 --install-ghc runghc --package turtle
-- > -- >
-- > {-# LANGUAGE OverloadedStrings #-} -- > {-# LANGUAGE OverloadedStrings #-}
-- > -- >
@ -218,7 +214,9 @@ import Turtle
-- You can use @do@ notation to create a subroutine that runs more than one -- You can use @do@ notation to create a subroutine that runs more than one
-- command: -- command:
-- --
-- > #!/usr/bin/env runhaskell -- > #!/usr/bin/env stack
-- > -- stack --resolver lts-2.9 --install-ghc runghc --package turtle
-- >
-- > -- #!/bin/bash -- > -- #!/bin/bash
-- > {-# LANGUAGE OverloadedStrings #-} -- -- > {-# LANGUAGE OverloadedStrings #-} --
-- > -- -- > --
@ -242,7 +240,9 @@ import Turtle
-- results: -- results:
-- --
-- @ -- @
-- #!\/usr\/bin\/env runhaskell -- #!\/usr\/bin\/env stack
-- \-\- stack \-\-resolver lts-2.9 \-\-install-ghc runghc \-\-package turtle
-- \
-- -- #!\/bin\/bash -- -- #!\/bin\/bash
-- import Turtle -- -- import Turtle --
-- -- -- --
@ -268,7 +268,9 @@ import Turtle
-- into their own smaller subroutine and then invoke that smaller subroutine -- into their own smaller subroutine and then invoke that smaller subroutine
-- within a larger subroutine: -- within a larger subroutine:
-- --
-- > #!/usr/bin/env runhaskell -- > #!/usr/bin/env stack
-- > -- stack --resolver lts-2.9 --install-ghc runghc --package turtle
-- >
-- > -- #!/bin/bash -- > -- #!/bin/bash
-- > import Turtle -- -- > import Turtle --
-- > -- -- > --
@ -328,7 +330,8 @@ import Turtle
-- Notice how the above Haskell example used `print` instead of `echo`. Run the -- Notice how the above Haskell example used `print` instead of `echo`. Run the
-- following script to find out what happens if we choose `echo` instead: -- following script to find out what happens if we choose `echo` instead:
-- --
-- > #!/usr/bin/env runhaskell -- > #!/usr/bin/env stack
-- > -- stack --resolver lts-2.9 --install-ghc runghc --package turtle
-- > -- >
-- > import Turtle -- > import Turtle
-- > -- >
@ -369,7 +372,7 @@ import Turtle
-- Let's open up the REPL and import this library so that we can study the types -- Let's open up the REPL and import this library so that we can study the types
-- and deduce why our program failed: -- and deduce why our program failed:
-- --
-- > $ ghci -- > $ stack ghci
-- > Prelude> import Turtle -- > Prelude> import Turtle
-- > Prelude Turtle> -- > Prelude Turtle>
-- --
@ -459,7 +462,7 @@ import Turtle
-- @turtle@: -- @turtle@:
-- --
-- @ -- @
-- $ ghci -- $ stack ghci
-- Prelude> :set -XOverloadedStrings -- Prelude> :set -XOverloadedStrings
-- Prelude> import Turtle -- Prelude> import Turtle
-- Prelude Turtle> `cd` \"/tmp\" -- Prelude Turtle> `cd` \"/tmp\"
@ -524,7 +527,8 @@ import Turtle
-- --
-- Let's illustrate this by adding types to our original script: -- Let's illustrate this by adding types to our original script:
-- --
-- > #!/usr/bin/env runhaskell -- > #!/usr/bin/env stack
-- > -- stack --resolver lts-2.9 --install-ghc runghc --package turtle
-- > -- >
-- > import Turtle -- > import Turtle
-- > -- >
@ -561,7 +565,8 @@ import Turtle
-- Not every top-level value has to be a subroutine, though. For example, you -- Not every top-level value has to be a subroutine, though. For example, you
-- can define unadorned `Text` values at the top-level, as we saw previously: -- can define unadorned `Text` values at the top-level, as we saw previously:
-- --
-- > #!/usr/bin/env runhaskell -- > #!/usr/bin/env stack
-- > -- stack --resolver lts-2.9 --install-ghc runghc --package turtle
-- > -- >
-- > {-# LANGUAGE OverloadedStrings #-} -- > {-# LANGUAGE OverloadedStrings #-}
-- > -- >
@ -580,7 +585,8 @@ import Turtle
-- --
-- Let's test this out by providing an incorrect type for @\'str\'@: -- Let's test this out by providing an incorrect type for @\'str\'@:
-- --
-- > #!/usr/bin/env runhaskell -- > #!/usr/bin/env stack
-- > -- stack --resolver lts-2.9 --install-ghc runghc --package turtle
-- > -- >
-- > {-# LANGUAGE OverloadedStrings #-} -- > {-# LANGUAGE OverloadedStrings #-}
-- > -- >
@ -631,7 +637,8 @@ import Turtle
-- Let's also try reversing the type error, providing a number where we expect -- Let's also try reversing the type error, providing a number where we expect
-- a string: -- a string:
-- --
-- > #!/usr/bin/env runhaskell -- > #!/usr/bin/env stack
-- > -- stack --resolver lts-2.9 --install-ghc runghc --package turtle
-- > -- >
-- > {-# LANGUAGE OverloadedStrings #-} -- > {-# LANGUAGE OverloadedStrings #-}
-- > -- >
@ -666,7 +673,9 @@ import Turtle
-- uses a `shell` command to archive the directory: -- uses a `shell` command to archive the directory:
-- --
-- @ -- @
-- #!\/usr\/bin\/env runhaskell -- #!\/usr\/bin\/env stack
-- \-\- stack \-\-resolver lts-2.9 \-\-install-ghc runghc \-\-package turtle
-- \
-- -- #!\/bin\/bash -- -- #!\/bin\/bash
-- {-\# LANGUAGE OverloadedStrings \#-} -- -- {-\# LANGUAGE OverloadedStrings \#-} --
-- -- -- --
@ -709,7 +718,8 @@ import Turtle
-- descriptive error message if an external command fails: -- descriptive error message if an external command fails:
-- --
-- @ -- @
-- #!\/usr\/bin\/env runhaskell -- #!\/usr\/bin\/env stack
-- \-\- stack \-\-resolver lts-2.9 \-\-install-ghc runghc \-\-package turtle
-- --
-- {-\# LANGUAGE OverloadedStrings \#-} -- {-\# LANGUAGE OverloadedStrings \#-}
-- --
@ -758,7 +768,7 @@ import Turtle
-- What's neat is that the compiler will automatically infer the number of -- What's neat is that the compiler will automatically infer the number of
-- arguments and their types from the `Format` string: -- arguments and their types from the `Format` string:
-- --
-- > $ ghci -- > $ stack ghci
-- > Prelude Turtle> :type format (s%" failed with exit code: "%d) -- > Prelude Turtle> :type format (s%" failed with exit code: "%d)
-- > format (s%" failed with exit code: "%d) :: Text -> Int -> Text -- > format (s%" failed with exit code: "%d) :: Text -> Int -> Text
-- --
@ -966,7 +976,9 @@ import Turtle
-- --
-- We can use `select` to implement loops within a `Shell`: -- We can use `select` to implement loops within a `Shell`:
-- --
-- > #!/usr/bin/env runhaskell -- > #!/usr/bin/env stack
-- > -- stack --resolver lts-2.9 --install-ghc runghc --package turtle
-- >
-- > -- #!/bin/bash -- > -- #!/bin/bash
-- > {-# LANGUAGE OverloadedStrings #-} -- -- > {-# LANGUAGE OverloadedStrings #-} --
-- > -- -- > --
@ -1081,7 +1093,9 @@ import Turtle
-- Let's combine `stdin` and `stdout` to forward all input from standard input -- Let's combine `stdin` and `stdout` to forward all input from standard input
-- to standard output: -- to standard output:
-- --
-- > #!/usr/bin/env runhaskell -- > #!/usr/bin/env stack
-- > -- stack --resolver lts-2.9 --install-ghc runghc --package turtle
-- >
-- > -- #!/bin/bash -- > -- #!/bin/bash
-- > {-# LANGUAGE OverloadedStrings #-} -- -- > {-# LANGUAGE OverloadedStrings #-} --
-- > -- -- > --
@ -1320,7 +1334,8 @@ import Turtle
-- ... and here is an example of creating a temporary directory and file within -- ... and here is an example of creating a temporary directory and file within
-- a `Shell`: -- a `Shell`:
-- --
-- > #!/usr/bin/env runhaskell -- > #!/usr/bin/env stack
-- > -- stack --resolver lts-2.9 --install-ghc runghc --package turtle
-- > -- >
-- > {-# LANGUAGE OverloadedStrings #-} -- > {-# LANGUAGE OverloadedStrings #-}
-- > -- >
@ -1345,7 +1360,8 @@ import Turtle
-- As an exercise, try inserting an exception and verifying that the temporary: -- As an exercise, try inserting an exception and verifying that the temporary:
-- file and directory are still cleaned up correctly: -- file and directory are still cleaned up correctly:
-- --
-- > #!/usr/bin/env runhaskell -- > #!/usr/bin/env stack
-- > -- stack --resolver lts-2.9 --install-ghc runghc --package turtle
-- > -- >
-- > {-# LANGUAGE OverloadedStrings #-} -- > {-# LANGUAGE OverloadedStrings #-}
-- > -- >
@ -1409,7 +1425,8 @@ import Turtle
-- For example, if you want to write a @cp@-like script that takes two -- For example, if you want to write a @cp@-like script that takes two
-- positional arguments for the source and destination file, you can write: -- positional arguments for the source and destination file, you can write:
-- --
-- > #!/usr/bin/env runhaskell -- > #!/usr/bin/env stack
-- > -- stack --resolver lts-2.9 --install-ghc runghc --package turtle
-- > -- >
-- > -- cp.hs -- > -- cp.hs
-- > -- >
@ -1473,7 +1490,8 @@ import Turtle
-- optional, defaulting to `stdout` if the user does not provide a destination: -- optional, defaulting to `stdout` if the user does not provide a destination:
-- --
-- --
-- > #!/usr/bin/env runhaskell -- > #!/usr/bin/env stack
-- > -- stack --resolver lts-2.9 --install-ghc runghc --package turtle
-- > -- >
-- > {-# LANGUAGE OverloadedStrings #-} -- > {-# LANGUAGE OverloadedStrings #-}
-- > -- >
@ -1520,7 +1538,8 @@ import Turtle
-- input and output using the @--src@ and @--dest@ flags, using @-s@ and @-d@ -- input and output using the @--src@ and @--dest@ flags, using @-s@ and @-d@
-- as short-hands for the flags: -- as short-hands for the flags:
-- --
-- > #!/usr/bin/env runhaskell -- > #!/usr/bin/env stack
-- > -- stack --resolver lts-2.9 --install-ghc runghc --package turtle
-- > -- >
-- > {-# LANGUAGE OverloadedStrings #-} -- > {-# LANGUAGE OverloadedStrings #-}
-- > -- >