Haskell Day 2016のチュートリアルの準備

2016年9月17日に、 [Haskell Day 2016](http://connpass.com/event/37892/) が開催されます。このエントリでは午前中のHaskell チュートリアルの参加者向けに、チュートリアルの概要と、参加するために必要な準備について説明します。なお、チュートリアルは[Turtle.Tutorial](https://hackage.haskell.org/package/turtle/docs/Turtle-Tutorial.html)に沿って進めますので、本エントリはTurtle.Tutorialを始めるための日本語資料としても利用できるでしょう。

【追記】[本編が開催されました](http://qiita.com/hiratara/items/169b5cb83b0adbfda764)。【/追記】

## チュートリアルの概要

他言語の経験者を対象に、Haskellでコマンドラインツールを作る演習を開催します。本チュートリアルは以下の内容を含みます。

* Haskellの実行環境の作り方 (本エントリ)
* Haskellでスクリプトを作成するのに便利なライブラリTurtleの紹介
* Turtleを利用した、簡単なコマンドラインツールの作成

以下の内容は **含みません** 。

* パターンマッチ、代数的データ型、再帰など、関数型言語的な側面の詳説
* 型付きラムダ計算、ファンクタ・モナドなど、Haskellの理論的背景

チュートリアルは、概要を説明した後に実際に手を動かしてもらうという手順で進めます。詰まったときには手を挙げてもらえれば、チューターか講師が疑問を解決するお手伝いをします。

なお、チュートリアル開始前に、Haskellの経験者の中から **ボランティアでチューターをしていただける方を募集する予定** ですので、普段からHaskellを利用される方はお手伝いしていただけると幸いです。

## チュートリアルの持ち物

演習時間をとりますので、PCを持ってこないと暇です。PCの貸出は行ないません。

* 本エントリに従ってHaskellとTurtleの実行環境が用意されたPC。

## チュートリアルの準備

チュートリアルの参加者は、以下の手順に従ってStackとGHC、turtleパッケージをインストールして下さい。基本的に[Turtle.Tutorial](https://hackage.haskell.org/package/turtle/docs/Turtle-Tutorial.html)にも書かれている内容ですので、英語に抵抗がない方は本家も一緒に参照するといいでしょう。

### stackのインストール

[Stack](https://docs.haskellstack.org/) はHaskellのビルドツールであり、HaskellのコンパイラであるGHCのインストールまで含めてHaskellを利用した開発を全般的にサポートしてくれるものです。 [インストール手順](https://docs.haskellstack.org/en/stable/README/#how-to-install)に従い、Stackを各自のPCへインストールして下さい。

* [windowsはインストーラーから](https://docs.haskellstack.org/en/stable/install_and_upgrade/#windows) (`Windows 64-bit Installer` などのリンク)
* Linux、UNIX系OSは `curl -sSL https://get.haskellstack.org/ | sh` コマンドで
* MacはhomebrewでもO.K. `brew install haskell-stack`

Stackが管理するパッケージデータベースは、プロジェクトごとに分かれています。本エントリではglobal projectを利用する想定ですので、以降、`stack`コマンドを実行するときは必ず **他のHaskellプロジェクトのディレクトリ内で実行しない** ように気をつけて下さい。

また、 **元々stackがインストールされていた人は、global project で使われる resolverが古すぎないか確認** して下さい。本チュートリアルでは `lts-6.x` を使ってます。

使われるresolverは `stack.yaml` に書かれています。 `stack path --config-location`コマンドで `stack.yaml` の場所を確認し、ファイル内の`resolver:`の項目を確認して下さい。`lts-6.x` 以外が指定されている場合は、 `stack.yaml` を編集して下さい。本エントリ執筆時点では、`lts-6.14`を指定するのが一番いいでしょう。

### GHCのインストール

GHCはHaskellのコンパイラの1つです。Stackは指定した `resolver` に対応したGHCをインストールしてくれます。 `lts-6.x` では `ghc-7.10.3` がインストールされます。(`ghc-8.x` 向けのltsは、本エントリの執筆時点ではまだ出ていません)

* `stack setup` を実行し、ghcをインストール

### turtleのインストール

Stackを使うと [resolverに含まれているパッケージ](https://www.stackage.org/lts)を簡単にインストールすることができます。チュートリアルでは`turtle`パッケージを利用しますので、事前にこれをインストールしておいて下さい。

* `stack build turtle` を実行し、 turtle パッケージをインストール

### 動作確認その1

REPLを利用し、環境が整ったかを確認します。次のコマンドを実行し、出力を確認して下さい。REPLから`pwd`関数が呼び出せれば問題ありません。

```shell-session
$ stack repl
Prelude> import Turtle
Prelude Turtle> pwd
FilePath "/tmp"
Prelude Turtle> :q
Leaving GHCi.
$ 
```

### 動作確認その2

stackを使うと、Haskellでスクリプト(実際は単に毎回コンパイルされるだけですが)を書くことができます。次の内容で `pwd.hs` という名前のファイルを作って下さい。

```haskell
#!/usr/bin/env stack
-- stack --install-ghc runghc --package turtle
import Turtle

main = pwd >>= print
```

作成したスクリプトにパーミッションを与え、実行します。REPLの時と同様に`pwd`の結果が出力できていれば問題ありません。

```shell-session
$ chmod a+x pwd.hs
$ ./pwd.hs
FilePath "C:\\msys64\\tmp"
```

## まとめ

Haskellで[Turtle.Tutorial](https://hackage.haskell.org/package/turtle/docs/Turtle-Tutorial.html)を実施するための環境構築方法を説明しました。チュートリアルではHaskellを用いたコマンドラインツールの作成を行います。副作用の塊であるコマンドラインツールとHaskellは相性が良くないと思われる方もいるかもしれませんが、まったくそんなことはありません。超強力な静的型チェックと静的言語ならではの実行効率、さらに[Hackage](http://hackage.haskell.org/) が提供する豊富なライブラリによる実用性を兼ね備えているのがHaskellの本当の魅力です。興味のある方はぜひ、[Haskell Day 2016](http://connpass.com/event/37892/) のチュートリアルにお越しください。

あと、当日、**チューターをしてくださる方の参加もお待ちしています！**