Haskell社内勉強会とHaskell学習ツールの紹介

2019年07月31日 水曜日


【この記事を書いた人】
山本 悠滋

日本Haskellユーザーグループ(愛称 Haskell-jp)発起人の一人にして、Haskell-jpで一番のおしゃべり。 HaskellとWebAssemblyとプリキュアとポムポムプリンをこよなく愛する。

「Haskell社内勉強会とHaskell学習ツールの紹介」のイメージ

こんにちは。IIJ-IIの山本悠滋です。
今日はここ数ヶ月私と有志で行っている、Haskellの社内勉強会と、そこで使用している自作のHaskell入門ツールについて紹介します。

Haskellの社内勉強会について

「社内勉強会 失敗しながら学ぶHaskell入門タイム」と称して、私はこれまでに8ヶ月近くもの間、週1回Haskellの勉強会を開催してきました。
この手の勉強会は連続して参加することが前提となっているため、どうしても最初の回から少しずつ人数が減っていくという残念なことになりがちですが、どうにか私含め4~5人程度を維持してここまで30回、18個目の課題まで進めることが出来ました。

開催時、私は準備しておいた内容を読み上げながら、必要に応じてサンプルコードをGHCiで実行して見せたり、ほかの参加者の反応や質問を受けて加筆・修正したりすることで、「Haskell入門ツール」(後述します)の内容をその場で改善しながら進めています。
現在主に参加しているみなさんはあまり静的型付け言語の経験がないにもかかわらず、飲み込みが早く、たくさん質問をくださるのでとても進めやすいです。
「Haskell入門ツール」の内容に含めるには重すぎる話題などで盛り上がりすぎて、しばしば予定時間を超えていることからしても、みなさんの関心の高さがうかがえます。
おかげで私自身もいろいろ気づけることが多くて楽しいです。やっぱり教えることは一番の学習ですね。

Haskell入門ツール: Make Mistakes to Learn Haskell

ここまでで紹介したHaskellの社内勉強会は、私が開発しているこちらの「Haskell入門ツール」を使用して行っています。

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

※以下、名前がやや長いので英語名を略して「mmlh」と呼びます。

「Haskell入門書」でも「Haskell入門コンテンツ」でもなく「Haskell入門ツール」と名乗っているのは、本でもウェブサイトでもなく、Haskellを学ぶためのアプリケーションだからです。
各章ではまずmmlh showというコマンドを実行すると、Haskellでプログラムを書いて解く課題と、その課題を解くのに必要なHaskellの構文や関数が表示されます。

“mmlh show 4”で課題4を表示する

必要な機能の学習が一通り終わったら、ユーザは課題を解くためのHaskellのプログラムを書いて、mmlh verifyというコマンドで答え合わせをすることができるようになっています。

> cat wrong.hs
-- input <- getContents と書くべきところで
-- input = getContents と間違えて書いてしまった例を
-- mmlh verifyで答え合わせする
main = do
input = getContents
putStr (unlines (reverse (lines input)))

> mmlh verify wrong.hs
*** Failed! Falsifiable (after 1 test):
""
==================== runhaskell output ====================


wrong.hs:5:9: error:
parse error on input e= f
Perhaps you need a 'let' in a 'do' block?
e.g. 'let x = 5' instead of 'x = 5'
|
2 | input = getContents
| ^

==================== mmlh HINT output ====================
HINT: Don't assign the result of `getContents` with `=`. Use `<-` instead.

FAIL: Your solution didn't pass. Try again!
HINT: Verified the exercise 4. Note I verify the last `mmlh show`-ed exercise.

単にテキストを読んでHaskellを学ぶだけでなく、「どうやってHaskellで書くのか」、「どうやって(コンパイルエラーなどの)間違いに気づくか」と言ったことを、経験的に習得できるツールにすることを目指して開発しています。
課題を今より実践的なものまで発展させることが出来れば、「Haskellを学んだけど何に使えばいいのかわからない」みたいな悩みの解決にもつながるかも知れません。

ちなみに、Node.jsには、昔から「workshopper」という名前のよく似たツールがあります。
mmlhはまさしくこのworkshopperにインスパイアされて作っているものなのです。

現在mmlhは、専ら先ほど説明した社内勉強会での発表資料として作られています。
mmlhは原則として独学のためのツールですが、勉強会の資料なので口頭で補うことができます。
そのため私は、毎週のように次の勉強会で発表しそうな範囲までサンプルコードと言及したい内容を一言二言書き添え、勉強会の時間で発表しながら適宜加筆・修正するという進め方でずっと繰り返しております。
リポジトリのmasterブランチを見る限り開発が数ヶ月も止まってしまっているように見えますが、その社内勉強会向けの修正をex6というブランチでずっと行っているのです。
ブランチの名前から察せられるとおり当初はexercise 6、つまり課題6向けのブランチとしていたのですが、そうしたその場しのぎで不完全な状態の課題をいくつも追加していたため、未だにmasterにマージできず、名が体を表していない状態です (^^;
いつか、できればこの上半期中には、文面を一通り埋めて、皆さんに共有できる状態にしてマージするつもりです。
あと、課題を答え合わせする機能も実装できていない課題が大半なのでその辺も…。

今後のmmlhと社内勉強会

これまでmmlhは、GHCの拡張機能を含まない、Haskellの基本的な機能のみで、ごく単純なコマンドラインアプリケーションを作成する方法を紹介してきました。
一段落したところで、より発展的な内容として、Webアプリケーションの作り方をフレームワーク作りから紹介するのが面白いのではないかと思っています。
「学習した内容をすぐに生かしてアプリケーションを作れるようになる」という観点においてはかなり遠回りな方針ではありますが、個人的にHaskellが一番得意だと思う、「副作用を責務に応じて分割する」技法やその重要性をわかりやすく伝えられるのではないかと思っているためです。
あと、自分で作ってみたいフレームワークがあるから、という純粋に個人的な興味もあります。

それから、コマンドラインアプリケーションだとどうしてもインストールする人の環境による問題が発生してしまうので、Webアプリケーションとしてブラウザ上で気軽に使用できるものに作り替えよう、というプランもあります。
これには、mmlhのユーザ支援機能をより使ってもらえるようにすることができる、というメリットもあります。
すでにmmlhでは、ユーザが課題を解けなかったときにmmlh verifyコマンドを通じて支援する機能をいくつか実装してみたものの、コマンドラインアプリケーションとして提供している以上、ユーザは多くの場合mmlh verifyコマンドを実行せずに直接ghcコマンドなどを実行して試す習慣になってしまうので、使ってもらいにくいという問題があります。
一方ブラウザ上で実行するアプリケーションだと、導線を工夫すれば、確実にヒントを出す機能を経由してもらえることができるでしょう。

ブラウザ上で完結してしまうと、Haskellの開発環境をインストールするという重要な体験が飛ばされるという問題はありますが(現在のmmlhではユーザは別途開発環境をインストールする必要がある)、mmlhを通して本当にHaskellを好きになっていただけたら必ずユーザはインストールするでしょうし、最初にインストールでつまずいてあきらめてしまうよりはいいでしょう。

そんな感じで、既存の課題すら満足に書き終えられていないにも関わらず、まだまだ野望が広がるばかりです。
もちろんGitHubにリポジトリを公開しているので、私の野望に共感してPull requestを送っていただけると助かります。
とりわけ、答え合わせするコードについては数が多いし役割分担もしやすいので、特にありがたいです。

ところで

なんで今日になってこの場を借りてこんな話を書いたのかと申しますと、関連するライブラリを作ってリリースしたからついでに書くか、という軽いきっかけがあったためです。
それについてはHaskell-jp Blogに書きましたので、よければ併せてご覧ください hask(_ _)eller

山本 悠滋

2019年07月31日 水曜日

日本Haskellユーザーグループ(愛称 Haskell-jp)発起人の一人にして、Haskell-jpで一番のおしゃべり。 HaskellとWebAssemblyとプリキュアとポムポムプリンをこよなく愛する。

Related
関連記事