Add First steps guide initially by soupi
https://github.com/haskell-infra/www.haskell.org/pull/88
This commit is contained in:
parent
433c73b23c
commit
d19ab05a11
@ -34,13 +34,11 @@ GHCup has two main channels for every tool: **recommended** and **latest**. By d
|
||||
|
||||
Also see [tags and shortcuts](../guide/#tags-and-shortcuts) for more information.
|
||||
|
||||
## First steps
|
||||
## Next steps
|
||||
|
||||
1. To get started with creating a Haskell project, follow the [Getting Started with Haskell and Cabal](https://cabal.readthedocs.io/en/stable/getting-started.html) guide
|
||||
1. Follow the [First steps guide](../steps) on how to build a "Hello world" program, use `ghc`, run an interactive REPL and create a Haskell project
|
||||
2. To understand the difference and overlap of `stack` and `cabal`, read on [here](https://gist.github.com/merijn/8152d561fb8b011f9313c48d876ceb07)
|
||||
3. To learn Haskell, try any of those:
|
||||
- A beginner friendly [4-lectures course](https://github.com/haskell-beginners-2022/course-plan) with exercises (by [Kowainik](https://kowainik.github.io/))
|
||||
- An in-depth university [CIS 194 Haskell course](https://www.cis.upenn.edu/~cis194/spring13/) including exercises (by [Brent Yorgey](https://byorgey.wordpress.com/))
|
||||
3. To learn Haskell proper check out the links at [How to learn Haskell proper](../steps#how-to-learn-haskell-proper)
|
||||
4. To learn more about Haskell Toolchain management, check out the [ghcup user guide](./guide.md)
|
||||
|
||||
## Uninstallation
|
||||
|
337
docs/steps.md
Normal file
337
docs/steps.md
Normal file
@ -0,0 +1,337 @@
|
||||
# First steps
|
||||
|
||||
In this guide we'll take a look at a few core tools that are installed
|
||||
with the Haskell toolchain, namely, `ghc`, `runghc` and `ghci`.
|
||||
These tools can be used to compile, interpret or explore Haskell programs.
|
||||
|
||||
|
||||
First, let's start by opening your system's command line interface
|
||||
and running `ghc --version` to make sure we have successfully
|
||||
installed a Haskell toolchain:
|
||||
|
||||
```
|
||||
➜ ghc --version
|
||||
The Glorious Glasgow Haskell Compilation System, version 8.10.7
|
||||
```
|
||||
|
||||
If this fails, consult [the Getting started page](../install) for information on
|
||||
how to install Haskell on your computer.
|
||||
|
||||
## Compiling programs with ghc
|
||||
|
||||
Running `ghc` invokes the Glasgow Haskell Compiler (GHC), and can be used to
|
||||
compile Haskell modules and programs into native executables and libraries.
|
||||
|
||||
Create a new Haskell source file named `hello.hs`,
|
||||
and write the following code in it:
|
||||
|
||||
```hs
|
||||
main = putStrLn "Hello, Haskell!"
|
||||
```
|
||||
|
||||
Now, we can compile the program by invoking `ghc` with the file name:
|
||||
|
||||
```sh
|
||||
➜ ghc hello.hs
|
||||
[1 of 1] Compiling Main ( hello.hs, hello.o )
|
||||
Linking hello ...
|
||||
```
|
||||
|
||||
For more in-depth information about the files `ghc` produces,
|
||||
follow the [GHC user guide](https://downloads.haskell.org/ghc/latest/docs/html/users_guide/using.html#getting-started-compiling-programs) guide.
|
||||
|
||||
Now we run our program:
|
||||
|
||||
```sh
|
||||
➜ ./hello
|
||||
Hello, Haskell!
|
||||
```
|
||||
|
||||
Alternatively, we can skip the compilation phase by using the command `runghc`:
|
||||
|
||||
```sh
|
||||
➜ runghc hello.hs
|
||||
Hello, Haskell!
|
||||
```
|
||||
|
||||
`runghc` interprets the source file instead of compiling it and does not
|
||||
create build artifacts. This makes it very useful when developing programs
|
||||
and can help accelerate the feedback loop. More information about `runghc`
|
||||
can be found in the
|
||||
[GHC user guide](https://downloads.haskell.org/ghc/latest/docs/html/users_guide/runghc.html).
|
||||
|
||||
### Turning on warnings
|
||||
|
||||
The `-Wall` flag will enable GHC to emit warnings about our code.
|
||||
|
||||
```sh
|
||||
➜ ghc -Wall hello.hs -fforce-recomp
|
||||
[1 of 1] Compiling Main ( hello.hs, hello.o )
|
||||
|
||||
hello.hs:1:1: warning: [-Wmissing-signatures]
|
||||
Top-level binding with no type signature: main :: IO ()
|
||||
|
|
||||
1 | main = putStrLn "Hello, Haskell!"
|
||||
| ^^^^
|
||||
Linking hello ...
|
||||
```
|
||||
|
||||
While Haskell can infer
|
||||
the types of most expressions, it is recommended that top-level definitions
|
||||
are annotated with their types.
|
||||
|
||||
Now our `hello.hs` source file should looks like this:
|
||||
|
||||
```hs
|
||||
main :: IO ()
|
||||
main = putStrLn "Hello, world!"
|
||||
```
|
||||
|
||||
And now GHC will compile `hello.hs` without warnings.
|
||||
|
||||
## An interactive environment
|
||||
|
||||
GHC provides an interactive environment in a form of a
|
||||
Read-Evaluate-Print Loop (REPL) called GHCi.
|
||||
To enter the environment run the program `ghci`.
|
||||
|
||||
```sh
|
||||
➜ ghci
|
||||
GHCi, version 9.0.2: https://www.haskell.org/ghc/ :? for help
|
||||
ghci>
|
||||
```
|
||||
|
||||
It provides an interactive prompt where Haskell expressions can be written and
|
||||
evaluated.
|
||||
|
||||
For example:
|
||||
|
||||
```sh
|
||||
ghci> 1 + 1
|
||||
2
|
||||
ghci> putStrLn "Hello, world!"
|
||||
Hello, world!
|
||||
```
|
||||
|
||||
We can define new names:
|
||||
|
||||
```sh
|
||||
ghci> double x = x + x
|
||||
ghci> double 2
|
||||
4
|
||||
```
|
||||
|
||||
We can write multi-line code by surrounding it with `:{` and `:}`:
|
||||
|
||||
```hs
|
||||
ghci> :{
|
||||
| map f list =
|
||||
| case list of
|
||||
| [] -> []
|
||||
| x : xs -> f x : map f xs
|
||||
| :}
|
||||
ghci> map (+1) [1, 2, 3]
|
||||
[2,3,4]
|
||||
|
||||
```
|
||||
|
||||
We can import Haskell source files using the `:load` command (`:l` for short):
|
||||
|
||||
```sh
|
||||
ghci> :load hello.hs
|
||||
[1 of 1] Compiling Main ( hello.hs, interpreted )
|
||||
Ok, one module loaded.
|
||||
ghci> main
|
||||
Hello, Haskell!
|
||||
```
|
||||
|
||||
As well as import library modules:
|
||||
|
||||
```sh
|
||||
ghci> import Data.Bits
|
||||
ghci> shiftL 32 1
|
||||
64
|
||||
ghci> clearBit 33 0
|
||||
32
|
||||
```
|
||||
|
||||
We can even ask what the type of an expression is using the `:type` command
|
||||
(`:t` for short):
|
||||
|
||||
```sh
|
||||
λ> :type putStrLn
|
||||
putStrLn :: String -> IO ()
|
||||
```
|
||||
|
||||
To exit `ghci`, use the `:quit` command (or `:q` for short)
|
||||
|
||||
```sh
|
||||
ghci> :quit
|
||||
Leaving GHCi.
|
||||
```
|
||||
|
||||
A more thorough introduction to GHCi can be found in the
|
||||
[GHC user guide](https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/ghci.html).
|
||||
|
||||
### Using external packages in ghci
|
||||
|
||||
By default, GHCi can only load and use packages that are
|
||||
[included with the GHC installation](https://downloads.haskell.org/ghc/latest/docs/html/users_guide/9.2.2-notes.html#included-libraries).
|
||||
|
||||
However, users of the [cabal-install](https://www.haskell.org/cabal) and
|
||||
[stack](http://haskellstack.org) build tools can download and load external packages
|
||||
very easily using the following commands:
|
||||
|
||||
cabal-install:
|
||||
|
||||
```sh
|
||||
cabal repl --build-depends async,say
|
||||
```
|
||||
|
||||
Stack:
|
||||
|
||||
```sh
|
||||
stack exec --package async --package say -- ghci
|
||||
```
|
||||
|
||||
And the modules of the relevant packages will be available for import:
|
||||
|
||||
```sh
|
||||
GHCi, version 9.0.1: https://www.haskell.org/ghc/ :? for help
|
||||
ghci> import Control.Concurrent.Async
|
||||
ghci> import Say
|
||||
ghci> concurrently_ (sayString "Hello") (sayString "World")
|
||||
Hello
|
||||
World
|
||||
```
|
||||
|
||||
Stack users can also use this feature with `runghc` and `ghc` by replacing
|
||||
`ghci` in the command above, and cabal-install users can generate an
|
||||
environment file that will make `async` and `say` visible for GHC tools
|
||||
in the current directory using this command:
|
||||
|
||||
```sh
|
||||
cabal install --lib async say --package-env .
|
||||
```
|
||||
|
||||
Many more packages are waiting for you on [Hackage](https://hackage.haskell.org).
|
||||
|
||||
## Creating a proper package with modules
|
||||
|
||||
The previous methods to compile Haskell code are for quick experiments and small
|
||||
programs. Usually in Haskell, we create cabal projects, where build tools such as
|
||||
`cabal-install` or `stack` will install necessary dependencies and compile modules
|
||||
in correct order. For simplicity's sake, this section will only use `cabal-install`.
|
||||
|
||||
To get started, run:
|
||||
|
||||
```sh
|
||||
mkdir haskell-project
|
||||
cd haskell-project
|
||||
cabal init --interactive
|
||||
```
|
||||
|
||||
If you let it generate a simple project with sensible defaults, then you should have these files:
|
||||
|
||||
* `src/MyLib.hs`: the library module of your project
|
||||
* `app/Main.hs`: the entry point of your project
|
||||
* `haskell-project.cabal`: the "cabal" file, describing your project, its dependencies and how it's built
|
||||
|
||||
To build the project, run:
|
||||
|
||||
```sh
|
||||
cabal build
|
||||
```
|
||||
|
||||
To run the main executable, run:
|
||||
|
||||
```sh
|
||||
➜ cabal run
|
||||
Hello, Haskell!
|
||||
someFunc
|
||||
```
|
||||
|
||||
Now let's add a dependency and adjust our library module. Open `haskell-project.cabal`
|
||||
and find the library section:
|
||||
|
||||
```
|
||||
library
|
||||
exposed-modules: MyLib
|
||||
|
||||
-- Modules included in this library but not exported.
|
||||
-- other-modules:
|
||||
|
||||
-- LANGUAGE extensions used by modules in this package.
|
||||
-- other-extensions:
|
||||
build-depends: base ^>=4.14.3.0
|
||||
hs-source-dirs: src
|
||||
default-language: Haskell2010
|
||||
```
|
||||
|
||||
The interesting parts here are `exposed-modules` and `build-depends`.
|
||||
To add a dependency, it should look like this:
|
||||
|
||||
```
|
||||
build-depends: base ^>=4.14.3.0
|
||||
, directory
|
||||
```
|
||||
|
||||
Now open `src/MyLib.hs` and change it to:
|
||||
|
||||
```hs
|
||||
module MyLib (someFunc) where
|
||||
|
||||
import System.Directory
|
||||
|
||||
someFunc :: IO ()
|
||||
someFunc = do
|
||||
contents <- listDirectory "src"
|
||||
putStrLn (show contents)
|
||||
```
|
||||
|
||||
To add a module to your package, adjust `exposed-modules`, like so
|
||||
|
||||
```
|
||||
exposed-modules: MyLib
|
||||
OtherLib
|
||||
```
|
||||
|
||||
then create `src/OtherLib.hs` with the following contents:
|
||||
|
||||
```hs
|
||||
module OtherLib where
|
||||
|
||||
otherFunc :: String -> Int
|
||||
otherFunc str = length str
|
||||
```
|
||||
|
||||
To use this function interactively, we can run:
|
||||
|
||||
```sh
|
||||
➜ cabal repl
|
||||
ghci> import OtherLib
|
||||
ghci> otherFunc "Hello Haskell"
|
||||
13
|
||||
```
|
||||
|
||||
For further information about how to manage Haskell projects
|
||||
see the [Cabal user guide](https://cabal.readthedocs.io/en/stable/getting-started.html).
|
||||
|
||||
# Where to go from here
|
||||
|
||||
## How to learn Haskell proper
|
||||
|
||||
To learn Haskell, try any of those:
|
||||
|
||||
- A beginner friendly [4-lectures course](https://github.com/haskell-beginners-2022/course-plan) with exercises (by [Kowainik](https://kowainik.github.io/))
|
||||
- An in-depth university [CIS 194 Haskell course](https://www.cis.upenn.edu/~cis194/spring13/) including exercises (by [Brent Yorgey](https://byorgey.wordpress.com/))
|
||||
|
||||
## Projects to contribute to
|
||||
|
||||
* [https://github.com/haskell/haskell-language-server](https://github.com/haskell/haskell-language-server)
|
||||
* [https://github.com/haskell/cabal](https://github.com/haskell/cabal)
|
||||
* [https://github.com/commercialhaskell/stack](https://github.com/commercialhaskell/stack)
|
||||
* [https://gitlab.haskell.org/haskell/ghcup-hs](https://gitlab.haskell.org/haskell/ghcup-hs)
|
||||
* [https://github.com/jgm/pandoc](https://github.com/jgm/pandoc)
|
||||
* [https://github.com/simonmichael/hledger](https://github.com/simonmichael/hledger)
|
||||
* [https://github.com/koalaman/shellcheck](https://github.com/koalaman/shellcheck)
|
@ -13,7 +13,8 @@ theme:
|
||||
|
||||
nav:
|
||||
- Home: index.md
|
||||
- "Getting Started": install.md
|
||||
- "Getting started": install.md
|
||||
- "First steps": steps.md
|
||||
- "User Guide": guide.md
|
||||
- "Developer Guide": dev.md
|
||||
- About: about.md
|
||||
|
Loading…
Reference in New Issue
Block a user