関数型プログラミングカンファレンス2019 in Japanの感想

2019年11月10日に開催された「関数型プログラミングカンファレンス2019 in Japan」に1参加者として参加しました.

関数型言語の業務利用について聞けて参考になりました. ただ,楽しみにしていた英語の発表がリスニング力不足と知識不足で分からず残念でした.

開演のご挨拶

会場ご提供者からのご説明.

なんで会場からの説明があるんだと思ったら,どうやら勉強会みたいなものには無料で貸し出しているようで,ずいぶんと太っ腹です.

1. 「Elmが創る関数型フロントエンドの未来」

関数型のAltJS言語「Elm」を実業務で使ったという話題です.

発表者のIzumiさんは,国内外のElm関連のカンファレンスで発表をしているということです.

内容

ウェブサービスの会社で使っていて,現在7万行くらいのコードがある. フロントエンド開発というのは,実は,ユーザのアクション・タイマー・APIなどを引数として,DOM描画を出力とする関数とみなすことができ,Elmのアーキテクチャはそれを実現している.

近年のフロントエンドのフレームワークもそれを実現する方向に進んできているが,JavaScript周りでは膨大なツール・フレームワーク類があって,その決定のコミュニケーションコストも馬鹿にならない. Elmであれば,その手間がない.

また,Elmの型安全性のおかげで,1日に大規模な変更をドカンとぶち込むことも恐れずできる. SPAの画面はほとんど5種類である(https://www.scotthurff.com/posts/why-your-user-interface-is-awkward-youre-ignoring-the-ui-stack/). よく状態のテストを書いたり,コードレビューしたりするが,型でできるのであれば型で済ませたほうが確実に保証できる.(CSより型)

メンテナンス性と生産性を両立できる.

静的型付けの関数型言語と言われると,よく複雑な型ミスマッチのエラーが出て,どうにも修正できないというようなイメージがあるが,Elmの場合はエラーメッセージがとても易しいらしい.その理由としては,

  1. 教育用言語を意識しているので,エラー内容だけでなく,代替の書き方も提案してくれる.最初のsyntax errorのハードル("The syntax cliff")を下げる.
  2. 関数型言語であるが,必要なものは初めから用意して,モナドをやたら使ったり無駄に難しいはしない設計のため,複雑怪奇な型エラーは出にくい

逆にElmを使うデメリットはと言われると,Elmを書ける人が少ない(メンテナンスできない)ということくらい.

JavaScriptとの連携は,Portという仕組みを使っている.これは,Elm側にportというアクセスポイントを用意して,外部からJSで叩くというもの. Elmの世界はElmの中で閉じ込めるので,型安全性が担保される.

他,further resourcesなど.

質疑

  • Elmの向かないものは? → ゲームや動きの激しいページなど.やろうと思えばやれるが,あえて採用する必要はないかと
  • Elmのできないものは? → Elm単体でほぼほぼできる.たまにできないものがあっても,JSの機能を使えばよい.

その流れで,創造主であるEvanの意向によって(?)WebSocketサポートが外されたという話が出てきた. Elmのバージョンはまだ1.0に到達していなくて,今後もEvanの意見次第で機能削減など変更があるかもということ.Elmの将来的なビジョンが不明(Evan内には考えはあるがあまりオープンにしない)ということはちょっと懸念材料かもとのこと.

感想

Elmは触ったことがありましたが,ちょっと頑張ったトイ言語くらいだろうみたいなイメージでした.

なので,実はフロントエンド技術の潮流に乗った言語であり,実業務でメリットが大きいというのは魅力的な話でした.私自身,教育の分野に興味があるのもあって,また触ってみたくなりました.

早く1.0になって言語仕様が安定化するといいな,と思いました.

2. 「ElixirとHaskellの根底にある同じもの、そして、Elixirが独自進化した道」

ElixirとHaskellの共通点と相違点の紹介と,Elixirの実務での使用,コミュニティの紹介などが内容でした.

えっと,まず私が静的型付け至上主義的なところがあるので,Elixirは基本は動的型付けなので(コンパイル時の一部の型チェックやlinter的なものもあるらしいが)ちょっと興味が薄いのは申し訳ないです(汗)

発表者のpiacereさんは福岡でリモート勤務しているということで,AI学校などいろいろやられているようです.

Elixirって以外にもLINE,slackはじめ有名企業でも使われているのは意外でした. 特に海外では金融系の使用が多いということで,質疑でも「なんで?」という質問がありましたが,「おそらく通信系で使われていたErlangの流れでは?」ということでした. (ErlangはElixirの元になった言語.海外では通信系と金融系の会社はとても近いらしい) 金融系なら金持ちになれるということで,少し興味が湧きました(笑)

他,興味を持ったこと:

  • (Elixirとはあんまり関係ないけど)piacereさんは重力に興味があり,重力波観測器関係のコードを書いて遊んだりしているらしい.
  • FPGAの高位合成をElixirでやってみた.
  • Elixirで論文も出している(FPGAとか).博士号を目指すことも視野という.

Elixirのメリットとして,Haskellの型システムは初学者が理解できると思えないので,Elixirのほうが「親しみやすい」というのは確実そうです*1

Elixirがなぜ静的型付けでないのかというと,「プログラムは人が書くものだからバグはあるし,プログラム外部に依存する部分は必ずあるから,完全にエラーを把握することは不可能だよね.だからエラーは必ず発生することを前提にしよう」ということらしいです. (これでも私は「把握できるエラーだけでも早めに把握すべきでは?」と思いますが.宗教上の理由により...)

色々書きましたが,コミュニティも充実していて面白そう,データ処理が充実とかは興味を持ったなので,一度Elixir触ってみようかなと思いました.fault toleranceとかhot code reloadとかのことももう少し知りたいです.インストールはdocker pull elixirが簡単だそうです!

3. 「Rust's secret sauce and the future of functional-flavored systems programming」

発表者: Pyry Kontio スライド: https://speakerdeck.com/golddranks/rust-secret-sauce

氏名もタイトルも英語だったので,英語の発表と思っていましたが,なんと日本語でした. フィンランド出身らしいですが,日本語はネイティブレベルです.すごい.

発表者の方は,日本の企業で働いてるそうです.Rust歴は5年以上らしいです.

内容は,まず関数型言語って何?っていうことを考えることからスタート.

関数型言語は,狭義には(1) 関数は値だ,(2) 副作用は無い ということですが, 広義ではそれ以外にも参照透過性とかimmutabilityとかいろいろ関数型っぽいものが含まれているとのこと.

また,関数型言語では,「情報のコピーは簡単にできる」ことを前提としている節があります.(逆に一度しか使われない制約を「線形性」と名前を付けたりする) 関数型言語では,エレガントさには多少のパフォーマンスは犠牲になるというのは仕方ないという雰囲気があります.

一方(Rustが対象とする)システムプログラミングは,低レベルのことを扱うことであり,ハードウェアの制約を意識する必要があります.そうすると,先ほどの「情報のコピーは簡単にできる」ことが成り立たなくなります.

Rustは,この 関数型言語のエレガントさ vs 実世界の制約 のうまい落とし所を見つけたと言えます.

パターンマッチとか,無名関数とか,関数型言語っぽい機能はいろいろありますが,中でもRustにユニークな機能としては,linear/affine型*2,ライフタイムの概念で,これの解説がありました.

Rustは公式チュートリアルのライフタイムのあたりはそれなりにやっていたので既知のことが多かったですが,mutability xor sharing(変更できるか共有できるかのどちらかにする)という言葉は端的に表していて,それをコンパイル時にチェックする仕組みをうまく実用言語に組み込んだ型システムはすごいなと思いました.

余談: nlab.itmedia.co.jp

スライド中に出てきて笑いを誘った漢字.なんでさんずい?と思ったらカタカナが合体しただけだった^^;

4. 「Rust: 手続き型言語2.0」

続いてもRustの発表です.発表者の方も「7割方内容かぶっていると思います」ということでした.

発表者の原さんは,形式手法や競技プログラミングもされていた方で,現在は新卒2年目でソフトウェアエンジニアをしているそうです.

Rustの魅力は言語機能それ自体に加えて,ビルドツールやパッケージマネージャなどが共通化されているというのも魅力ということです.

Rustのユニークな特長ということで,主に前の発表と同じくライフタイムなどの話です.

よくあるオブジェクト指向言語のバグの1つとして,1箇所だけデータを変更したつもりが,実は同じ参照を持っていた別の場所も変わった,という例があります. これを防ぐためにはmutable xor sharedという考え方が有効です.

これと同じ考え方なのは,DBアクセス時の共有ロック(読み取り専用) vs 排他ロック(書き込み可能)というのは言われるまで気づきませんでした!

必要なもの以外は変更/共有できないため挙動を予測しやすいというのは,人間にだけでなく,コンパイラにとっても最適化しやすくて嬉しいのですね.(Haskellなども同じことは言えますが)

ますますRustが魅力的に感じる発表でした.

5. 「試験管の中の人工生命体」

  • 発表者: 池上 蒔典

タイトルからして特徴的な発表です.

生命とは何か.生命が生命たる要素の1つである自己複製や帰納的学習とプログラミングの関係性,のような考察が発表されました.

その中で,生命を計算機の中で表現した,ライフゲームのようなプログラムを作成中であるということです.

発表は作成中のプログラムのデモ発表やそれに至る考察が中心で,Common Lispの話はあまり無かったな〜というのがちょっと心残りです.(発表内容の伝達に難があったのでは...

Quineという自分自身のコードを出力するプログラム(Listのコードもありました)とか,Tierraという生命シミュレーターはなかなか面白うそうでした.

プログラムのリポジトリがありました.(Makinori Ikegami / kotonoha_mikoto · GitLab) documents/README.mdの文章がなんとも独創的です.

6. 「On Recursive Data Types」

ここから英語の発表です.

公式サイトに「(通訳あり)」って書いてあったのですが,普通に英語の発表しか無く,「あれ,通訳ってなんだっけ...」な感じでした. ところどころに日本語字幕があって少し助かりました.

ビデオ通話での発表でしたが,機材トラブルで時間が押してしまったため,発表が途中で強制終了になってしまったのが残念です.

再帰データ型をうまいこと表すことを考える話で,同型写像によって相互変換できれば「同じ形」のデータ型とみなせるということです.直感的には,タプルの要素数が同じだったら順番違っていても「同じ形」だろみたいに,まあそうだろうなと納得できます.

Eitherは+,タプルは*,Functionはべき乗のような,データ型と自然数代数系の対応関係があることが面白かったです.

その後,ファンクターが出てきて,foldrが出てきて,再帰データ型に対するfoldrを抽象化して,なんかすごいH本で見たような..となってきたら時間制限で強制終了でした...

その後,質疑の時間に続きの流れの解説をしていただきましたが,理解できず...

でも面白かった!

スライドの内容の記事がありました.

  1. @alexknvl - Recursion schemes.
  2. @alexknvl - Counting type inhabitants.

7. (リアルタイムビデオ質疑応答)

  • 発表者:Simon Peyton Jones

Jonesさんは,HaskellコンパイラGHCの開発者ということです!

これもビデオ通話で,準備に手間取っていました*3

英語なので,気分で聞いていました.

Haskellにextensionがたくさんあるのは,それ自体が実験室であるから.実世界でも使われているHaskellだからこそ,課題もわかる」とか,質問「Haskellでできない / 難しいことは?」→答「Haskellはなんでもできるよ!(会場笑)」「ただ,ハードウェア寄りのリアルタイム処理みたいなのは難しい」といった感じでした面白かったです.

線形型の質問をしていたら,その次の発表者のEdward Kmettが出てきて,Jonesさんと「Hi!」とか言ったりして面白かった.

8. Special Talk「Cadenza: Building fast functional languages on the JVM

  • 発表者:Edward Kmett

とてもおもしろそうな内容なのに,ほとんど聞き取れず&理解できず(泣) このときほど自身の英語力の低さを恨んだことはありません.TOEIC 905点を驕っていました... 精進します.

前日のHaskellDay 2019でも発表した内容のようです.

Normalized-by-evaluationというのをして効率化?それをGraalVMで動かす?くらいを後でreadme (https://github.com/ekmett/cadenza) を読んで理解しました.(汗)

でも途中のラムダ計算のライブコーディングが,見てるだけでも面白かった! Emacsを自由自在に操り,Haskellの型エラーも速攻で直すってすげー(小並感)

懇親会もあったけど

英語を必死に理解しようとして脳が消耗しました.

タダ飯を期待して懇親会も少し興味がありましたが,疲れもあり,結局帰ることにしました. せめて,もう少し英語力があれば!無念...

まとめ

通訳あるのか無いのかとか運営をもうちょっとどうにかして欲しいという気持ちはありますが,関数型言語の実世界の利用事例や,学問的な面白さ,スキルアップの必要性を感じることができ,有益だったな,という感想です.

*1:余談ですが,Elixirだけが持っているものであげられたものとしてあげられたものの中で,軽量な並行プログラミングというのがありましたが,ちょうどHaskell DayのサイトでHaskellで軽量な並行プログラミングという話題があって,Haskellでもできるのでは?と思いました.(アーキテクチャは違うだろうけど)Elixirはマクロがあるというのも,Template Haskellとかあるし...

*2:ちなみに,線形(linear)型は,コピーも削除もできない,affine型はコピーはできないけど削除はできるということです.Rustは削除はできるので,(少なくともプログラマが書く上では)affine型です.

*3:PCをオーディエンスに向けると壁しか見えない,準備ができてひっくり返すと同時に部屋の電気も消すから真っ暗な画面じゃん,みたいなコントのような...