Skip to content

Make Mistakes to Learn Haskell - 失敗しながら学ぶHaskell入門

License

Notifications You must be signed in to change notification settings

haskell-jp/makeMistakesToLearnHaskell

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

現在はex6というブランチで、課題6以降の執筆を続けています

興味がある方は是非ご覧ください。こちらがmasterにマージされるのは、課題22の文面まで一通り埋まってからです。あしからず。

Make Mistakes to Learn Haskell!

作りながら学ぶHaskell入門

💾インストール方法

まだStackHaskell 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

⚠️トラブルが発生したら:

インストール中などに何か困ったことが発生した場合、下記のいずれかのウェブサービスで質問してみてください。

🆙「Make Mistakes to Learn Haskell!」自体のアップデート方法

現状、当入門はまだまだ完成度が低いため、今後も度々更新することとなります。
アップデートが必要な場合は、👆の手順でgit cloneしたディレクトリーに移動した上で、

git pull
stack install

を実行してください。

⚙️使い方

  1. 課題の一覧を表示する(特に引数を与えなければ一覧が表示されます)

    mmlh
    
  2. 課題1の内容を表示する

    mmlh show 1
    
    • ブラウザーが起動してHTMLで課題の内容が表示されるはずですが、うまく行かない場合はターミナル上で表示させるため、次のように--terminalオプションを付けて実行してください。
    mmlh show --terminal 1
    
  3. 課題の回答をテストする
    (最後に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.hsNは整数)という名前のファイルを追加してください。
具体的なテストの書き方は既存のファイルを見ていただくとわかるかと思います。Hspecを使っています。

注意事項

  • このアプリケーションは、Haskellの初心者でもソースコードを編集できるよう、できるだけ素朴なHaskellで書くことを目指しています。
    具体的な基準は適宜議論しようと思いますが、現状は例えば
    • 使用方法が比較的分かりやすい(かつ必要性が高い)default-extensionsに記載した言語拡張のみを使う
    • いわゆる ReaderT IO パターンを使用せず、 Env を受け取る関数を全体で使用する
      • Monad Transformerを極力使わない(局所的には使うかも)
    • 型レベルプログラミングをしない
  • その一方、CPPを使うことでimportsrc/imports/external.hsにまとめる、というかなり変わったことをしています。
    これは、コードベース内でimportの書き方を統一する、同じimportを何度も書かないで済ますために考えた方策です。
    現状、external.hsで外部のパッケージのimportのみをまとめていますが、今後もっとコードベースが大きくなったとき、レイヤーを分ける際にも役立つでしょう。
    そのため、今後も少なくとも外部のパッケージを新たにimportする際は、必ずsrc/imports/external.hs書いてください。

ターゲット

  • プログラミングは他の言語で経験している。
  • 他のHaskell入門書を読んでみたが、Haskellでプログラムを書く方法がわからない。
    • TODO: にしては今の内容はちょっと初歩的すぎるかもしれないので、このターゲット自体かexerciseの内容を改めよう
  • Haskellがどんな言語か、どうやってプログラムを作るのか、軽く知りたい。

依存ライブラリ

About

Make Mistakes to Learn Haskell - 失敗しながら学ぶHaskell入門

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published