Awesome
現在はex6
というブランチで、課題6以降の執筆を続けています
興味がある方は是非ご覧ください。こちらがmaster
にマージされるのは、課題22の文面まで一通り埋まってからです。あしからず。
Make Mistakes to Learn Haskell!
作りながら学ぶHaskell入門
💾インストール方法
まだStackやHaskell Platformをインストールしていない場合は
Stackのインストールを推奨します。
下記のいずれかの方法でインストールしてください。
🍎🐧Mac OS XやLinuxなどのUnix系OSをお使いの方:
「ターミナル」を起動し、下記のいずれかのコマンドを実行してください。
curl -sSL https://get.haskellstack.org/ | sh
あるいは、
wget -qO- https://get.haskellstack.org/ | sh
🏁Windowsをお使いの方
64bit版のWindowsをお使いの方はこちらからインストーラーをダウンロードして、インストールしてください(よくわからなければ、とりあえず64bit版を試してみてください。32bit版のWindowsをお使いの方は残念ながらあきらめてLinuxを仮想マシンで動かしてインストールしてください)。
Chocolateyをお使いの方は、
choco install haskell-stack
でもインストールできます。
💾GHCと「Make Mistakes to Learn Haskell!」のインストール方法
現状はHackageにまだ公開していないので👇のコマンドを実行してください(どのOSでもこのコマンドです)。
git clone https://github.com/haskell-jp/makeMistakesToLearnHaskell
# あるいは git clone git://github.com/haskell-jp/makeMistakesToLearnHaskell
cd makeMistakesToLearnHaskell
stack install
GHCのインストールと、「Make Mistakes to Learn Haskell!」のビルドが始まります。
インストールが完了したら、「⚙️使い方」の節に書かれたコマンドを試してみてください。
なお、Linuxにおいて、libtinfoパッケージがないとインストールできない」というトラブルが報告されています。
例えばUbuntuの場合、下記のコマンドを実行してインストールしておく必要があるかも知れません。
sudo apt-get install libtinfo-dev
⚠️トラブルが発生したら:
インストール中などに何か困ったことが発生した場合、下記のいずれかのウェブサービスで質問してみてください。
- teratailのHaskellタグ
- スタック・オーバーフローのHaskellタグ
- 日本Haskellユーザーグループ (a.k.a. Haskell-jp)の公式Slack Workspaceにおける、questionsチャンネル
- Redditのr/haskell_jp
🆙「Make Mistakes to Learn Haskell!」自体のアップデート方法
現状、当入門はまだまだ完成度が低いため、今後も度々更新することとなります。
アップデートが必要な場合は、👆の手順でgit clone
したディレクトリーに移動した上で、
git pull
stack install
を実行してください。
⚙️使い方
-
課題の一覧を表示する(特に引数を与えなければ一覧が表示されます)
mmlh
-
課題1の内容を表示する
mmlh show 1
- ブラウザーが起動してHTMLで課題の内容が表示されるはずですが、うまく行かない場合はターミナル上で表示させるため、次のように
--terminal
オプションを付けて実行してください。
mmlh show --terminal 1
- ブラウザーが起動してHTMLで課題の内容が表示されるはずですが、うまく行かない場合はターミナル上で表示させるため、次のように
-
課題の回答をテストする
(最後にmmlh show
した課題のテストをする)mmlh verify your_answer.hs
🏁Windowsユーザー向けTips
MSYS2を利用している場合、stackがインストールするMSYS2と衝突して問題が起こることがあります。その場合、%APPDATA%\stack\config.yaml
に以下の行を追加し、インストール済みのMSYSを使うように設定しましょう。
skip-msys: true
開発に協力していただける方へ
現状
問題を表示したり、ユーザーが与えた回答を判定するための基本的なフレームワークはできています。
私 igrepが社内の勉強会で使用するため、下記のことに取り組んでいます。
- 計算アプリケーションを作る(概要)に書いた目標に従い、課題とその判定処理の実装。
- 「そのために以下の課題を解いて、Haskellの初歩を身につけましょう」以降に書いた各課題とその判定処理を実装します(実際には課題の中身を優先して作っています)。
- その他Issuesをご覧ください。
課題におけるプロンプト表記について
- GHCi に対する入力は
ghci>
- シェルに対する入力は
shell>
と書きましょう。
特に私 igrepが行いたいこと
- 課題の内容とその文章を書く
特に私 igrep以外にやっていただきたいこと
- 課題の判定処理の実装。
- ヒントの出し方を含みます。詳細は次のセクションをご覧ください。
- その他Issuesに書いたこと。
課題の判定処理の実装方法
主に編集するファイルはsrc/Education/MakeMistakesToLearnHaskell/Exercise.hsです。
このファイルに各課題の判定方法や、ヒントの判定処理がすべてまとまっています。
文字列まわりで共通化できる処理を追加したくなったら、Exercise.hs
に直接追加するか、src/Education/MakeMistakesToLearnHaskell/Evaluator/
以下にファイルを追加するのが良いかと思います(おいおいRegex.hs
というファイルを追加します)。
課題の判定処理のテストを書く場合は、test/Education/MakeMistakesToLearnHaskell/ディレクトリーに、ExerciseNSpec.hs
(N
は整数)という名前のファイルを追加してください。
具体的なテストの書き方は既存のファイルを見ていただくとわかるかと思います。Hspecを使っています。
注意事項
- このアプリケーションは、Haskellの初心者でもソースコードを編集できるよう、できるだけ素朴なHaskellで書くことを目指しています。
具体的な基準は適宜議論しようと思いますが、現状は例えば- 使用方法が比較的分かりやすい(かつ必要性が高い)
default-extensions
に記載した言語拡張のみを使う - いわゆる
ReaderT IO
パターンを使用せず、Env
を受け取る関数を全体で使用する- Monad Transformerを極力使わない(局所的には使うかも)
- 型レベルプログラミングをしない
- 使用方法が比較的分かりやすい(かつ必要性が高い)
- その一方、
CPP
を使うことでimport
をsrc/imports/external.hs
にまとめる、というかなり変わったことをしています。
これは、コードベース内でimport
の書き方を統一する、同じimport
を何度も書かないで済ますために考えた方策です。
現状、external.hs
で外部のパッケージのimport
のみをまとめていますが、今後もっとコードベースが大きくなったとき、レイヤーを分ける際にも役立つでしょう。
そのため、今後も少なくとも外部のパッケージを新たにimport
する際は、必ずsrc/imports/external.hs
に書いてください。
ターゲット
- プログラミングは他の言語で経験している。
- 他のHaskell入門書を読んでみたが、Haskellでプログラムを書く方法がわからない。
- TODO: にしては今の内容はちょっと初歩的すぎるかもしれないので、このターゲット自体かexerciseの内容を改めよう
- Haskellがどんな言語か、どうやってプログラムを作るのか、軽く知りたい。