勉強会は以下の目的、方針で進めます。
Haskell勉強会の目的
- 「自然言語処理(文章の分析、および自由な加工)」と、
- 「目に見える形での具体的なHaskell製のGUIプログラム」を通して
- 「Haskellっぽいこと」を勉強していきます。
最初は、「文字列を自由に操作できるようになること」、これに小目標にします。
理想的にはプログラミングを全くやったことがない人が、いきなりHaskellを使いこなせるような内容にしたいです(理由は後述)。
文字列を操作できてしまえば、広範なことがやれるようになると考えています。
勉強会全体としては、以下の流れを想定しています。
内容 | Haskellっぽいこと |
---|---|
Data.Listの関数 | 基本文法、型、高階関数、ラムダ式、スコープ等 |
S式のParser作成と操作 | 再帰、モナド、データ型(型クラスとか)、(圏論) |
GUI | IORef, 並列・並行プログラミング |
勉強会の流れ次第では、Parserは触らずに先にGUIに進む展開も考えています。
その辺りは柔軟に進めていくつもりです。
よろしくお願いします。
教育向け言語Haskell
話がやや逸れますが、教育分野でHaskellが広く採用されたらなと思っています。
プログラミング初心者が最初の言語としてHaskellを勉強するのは、現状ではレアケースと見られますが、
それは可能であり大きなメリットがあるはずです。
この勉強会でそれを実証したいと思っています。
以下、その理由です。
シンプルなルールと手厚いエラーチェック
Haskellは普通に書いた場合は、複雑なことが出来ないようになっています。
そのシンプルなやり方は初心者には非常に分かりやすいです。
さらにそのように制限することで、強力なエラーチェックが自動で行われます。
これらは初心者でなくとも強力なメリットになってきます。
体系的知識の習得
Haskellは学者が後押ししている言語です。
学習の過程で、情報科学の基礎的な概念が体系立って出てきます。
効率的にそれら概念を学べます。
更にそれは他言語にも応用できます。
サバイバル術の習得
小さな関数を組み合わせて大きな関数を作っていきます。
自作した関数を組み合わせて強力にしていくのは、
初心者にとっては成長を実感できる良いプロセスだと思います。
勉強会では、これら重要な関数(Data.Listの関数)を最初に学んでいきます。
これらは汎用性が高く、サバイバルナイフの使い方を憶えるみたいな感があります。
表現力に起因した短いコード
Haskellは他言語と比べ、コード量少なくなるとされます。
それは緩い文法規則に起因するのではなく、高い表現力に起因するものであり、
教育の観点ではメリットになってきます。
先端性と将来性
主流言語と比べてマイナーなのは確かです。
ただし学者が後押ししているので廃れるリスクは小さいです。
Haskell自体は1990年に出てきていましたが約30年続いています。
むしろ流行の先端にいます。学者が色々と面白そうなことを試すからです。
初心者はこれら先端的な内容を避けるべきですが、
そういう先端性と将来性は、学習のモチベーションになってきます。
勉強会で扱うガジェット
新しいプログラミング言語を学ぶ際は、その言語だからこそやれる、みたいなモチベーションが欲しいです。
プログラミング初心者にとってよりも、他言語の習得者にとってその辺りは重要になってきます。
ライブラリが豊富、今やっている仕事で使える、などはその一例です。
Haskellである必要性
敢えてHaskellをやる必要がある題材を見つけました。
ご紹介しているガジェットです。
理想のガジェットをつくる際に、抽象度の高いところで試行錯誤できるHaskellは大きなアドバンテージになってきます。
要となる正確な構文解析や、高度なA.I.は、型理論が必須になってきます。
Haskellは型理論に立脚した言語です。
型理論の文脈では、Haskellの先にAgdaという言語があります
AgdaはHaskellと似たような構文を持っています。
勉強会ではAgdaにも触れる予定です。
GUIであること
学習の結果が視覚的に現れるのは、題材として筋が良いです。
更に、利用者がガジェットに働きかける(タッチできる)ゲーム的な要素も持っています。
Haskellの場合こういうGUIはあまり得意ではないので、ユニークな題材だと見ています。
実用性
更に、このガジェットは電子文書(PDF)に適用可能です。
一例としては電子化された教科書にそのまま適用できます。
普段の勉強を効率的にするために、ガジェットを強化するというモチベーションが生まれてきます。
未完成なガジェット
まだまだ未完成です。
文章に色を付けるという行為は、絶妙なバランスでないと逆に読みにくくなります。
着色のルールやその指定の仕方など、面白い課題がたくさん残っています。
これらは認知科学、人間工学にもとづいたGUI、紙の本に適用可能なA.R.等といった、
プログラミング外の広大な他領域を学ぶ良いきっかけにもなります。
進め方(方針とかポリシーとか)
プログラミング初心者を大事にする
以上を鑑み、
はじめのうちは、原則としてはプログラミング初心者が最初の言語としてHaskellのコアな部分を学べるような内容にします。 プログラミング経験者の方もHaskell(関数型プログラミング的なやり方)に慣れてなければ、退屈はしないかなと思ってます。
ただし、上は原則であって勉強会の構成員次第で柔軟に内容を変えていきます。
扱う内容は要点のみざっくりと、といった感じです。勉強会で雰囲気をつかんで、家で落ち着いて勉強する感じにします。
勉強が目的なので、標準ライブラリ以外のライブラリは極力使わないようにします。
知的好奇心をくすぐり、後でご自身で勉強したくなる系のをものふんわりとご紹介します。
詳しい人がいれば適宜掘り下げサポートをお願いします。
参加者が何かを持ち帰る形
初心者も経験者も(そして私自身も)勉強会に参加して何かを持ち帰る、そんな形にしたいと思っています。
みなさん、ご協力をお願いします。
補足1(開発環境についての予告)
詳しくは当日ご説明するつもりですが、特に希望がなければ、以下の環境を導入するつもりです。 (【追記】以下の構成の環境構築は難しすぎて、別の環境で勉強会を進めることにしました。https://polymony.net/2020/01/26/next/)
- OS: Ubuntu18.04(推奨)、 Windows10 (64bit)(動作確認済)、 MacOS
- エディタ等: Spacemacs(Emacs) + intero
- パッケージ依存解消ツール:stack
- GUI: Gtk2hs(Gtk2)
- 自然言語処理前処理: (英語:StanfordParser, 日本語:Mecab)
- おまけ(定理証明): Agdaという言語
OSについて
私が試したという意味で、他のものでも問題ありません。
MacOSは試せていないのですが、Web上の記事を見る限りおそらく大丈夫でしょう。
Windows10が少し心配でしたが、何とか環境構築できました(実は以前このブログでも紹介していましたが、そのやり方が通用しました)。
途中やっぱり罠がありましたが(笑)、Ubuntu、Windowsともに同じやり方で回避できました。
上の罠については、MacOSについても同じやり方で解決できるとみています。
エディタについて
エディタについてEmacs(Spacemacs)を選んだのは、AgdaモードがEmacsにのみ存在するからです。
ただしAgdaは最初のうちは必須ではないので、他のエディタでも問題なしです。
2020年現在だとVSCode+HIE(Haskell IDE Engine)が主流っぽく見えます(自分がHaskellをやり始めた頃はEmacs一択な感がありました)。
補足2(資料の配布)
勉強会ではなんらかの資料を用意します。
このHPでも勉強会後にアップロードする予定です。