2022年9月30日に開催された「第三回関数型プログラミング(仮)の会」のレポートをお届けします。
関数型プログラミング(仮)の会とは
「関数型プログラミングについて仲良くわいわい盛り上がろう」という趣旨のイベントで、希望者がLTを行うオンラインイベントです。
関数型プログラミングかつ設定したテーマに関する話題であれば特に制限はなく、
- 熟練者による実装の話
- 関数型プログラミングに触れて感じた利点や課題の話
- 実務的な観点
- 関数型言語ではない言語で、関数型プログラミングを実践するためのライブラリの話
などなんでも大歓迎のイベントです。
第一回はフリーテーマで、第二回は「現場での関数型プログラミング」というテーマで実施し、それぞれ200人以上の方に参加いただきました。
ちなみになぜ「(仮)」なのか... については、第二回関数型プログラミング(仮)の会の舞台裏で紹介しております。
第三回関数型プログラミング(仮)の会
第三回目となる今回は、「関数型データ構造」というテーマで開催しました。
イベント中のTwitterハッシュタグ#func_partyのツイートはTogetterにもまとめられています。
純粋関数型データ構造と依存型同時入門
依存型を使って「長さを型に持つ Banker's Queue」を Idris で実装するという発表でした。 まず前提となる依存型の説明として、依存型とは型で値を扱えるものであることや、ユーザーインターフェースや実装補助としての利便性が語られていました。
またコンパイラは l + (1 + m)
と 1 + (l + m)
は同一であることが判定できないため素直に実装していくとエラーになる実装がありましたが、標準ライブラリの証明を行う関数を活用することで解決できていました。
JavaでZipper
by @kmizu
Java を使った List に対する Zipper の実装例の発表でした。
Zipper は純粋関数型の双方向イテレータ(抽象化された繰り返し処理)で、設定・取得・挿入・削除などの操作が O(1) でできて効率が良いことなどが利点です。
既に辿った分の逆順リスト(visit)と残りのリスト(rest)を持つことで、 isBegin
, isEnd
, next
, previous
などの基本操作をシンプルに実装されていました。
List 以外にも Zipper は実装可能で、かつ Zipper 自体は単純に実装できるので、複雑なデータ構造や好きな言語で Zipper を作ると良い訓練になるかもしれないというメッセージで締めくくられました。
ElmでVisual Study!!
データ構造・アルゴリズムの学習方法として、絵に近いコードで表現する手法を紹介する発表でした。
関数型は抽象データ型・パターンマッチ・再帰によって絵に近い形でコードを表現できるため、データ構造・アルゴリズムの学習に適していると説明されていました。 また実装に利用されていた Elm は標準で HTML・CSS が使えかつ状態管理ができるため、書いたコードをWebブラウザ上でそのまますぐ動かせることが利点です。
今回は Stack 、赤黒木のデータ構造と実装方法が語られていました。
実装されたコードは Elm のクラウド開発環境である Ellie で誰でも触れるようになっているようですので、ぜひ触ってみてはいかがでしょうか。
Clojureコレクションで探るimmutableでpersistentな世界
関数型言語に実用上求める機能は「不変で永続的なデータ構造が豊富に提供され、また容易に定義可能であること」と定義して、Clojureのデータ構造について探っていく発表でした。
Java の ArrayList は可変かつ刹那的なデータ(変更前のデータを取得できない)であることに対し、 Clojure の Vector は不変で永続的であることがコード例と共に語られ、 Clojure コレクションの性能特性の比較などを見ていきました。
Union Findを永続にしたい
by @fumieval
典型的な Union Find はポインタを書き換えていくミュータブルな操作で実装されるためイミュータブルな実装とは相性が悪いが、工夫して永続的な Union Find を実装する試みの発表でした。
今回の発表では、変更前の状態も保持するデータ構造である永続配列を用いて Union Find を実現するアプローチを取られていました。 Haskell で実装されており、変更後の配列に置き換える破壊的変更は禁術とも言われる unsafePerformIO を使って実現されていました。
おわりに
登壇者・参加者の皆様のおかげで、第三回関数型プログラミング(仮)の会も盛況のうちに幕を閉じました。 発表後のオンライン懇親会は盛り上がり、夜遅くまで続きました。
次回の第4回関数型プログラミング(仮)の会は3/24開催予定です。
オンライン参加のほかオンライン発表枠、オンラインLT枠も募集しているので、興味のある方はぜひ下記より参加登録をお願いします。
ご参加頂いた皆様、ありがとうございました!
Opt Technologies では関数型言語を業務で活用したいという方も歓迎しています( Scala や Clojure で開発しているプロダクトがあります)。カジュアル面談も可能ですので、下記リンク先よりお気軽にご応募ください。