Beginner~Intermediate
言語処理系、理論、入門
プログラミングにおいて何かを深く学ぶには、それを自分で作ってみるのが最良の方法です。
そこで、型システムを学ぶためのプログラミング演習として、型検査器を書くことを提案します。
前半では、型付きラムダ計算に相当するTypeScriptの極小サブセット言語を定義し、その型検査器を自作します。
この過程で、抽象構文木(AST)の扱いや型検査の基本構造を解説します。
後半では、対象言語を拡張し、最終的に型検査器自身を型検査できるようにする(セルフホスト) ことを目標とします。
具体的には、オブジェクト型、タグ付きunion型、再帰関数、再帰型などを導入し、より強力な型システムへと発展させます。
本発表を通じて、型検査器の実装を通じた型システムの理解を深め、プログラミング言語処理系の基礎に触れる機会を提供します。
Elixir は Erlang VM 上で動作し、高い並行性と耐障害性を持つ関数型言語です。特に Web フレームワーク Phoenix によってサーバサイドでの利用が広まっています。
本セッションでは、Elixir (Erlang) の並行性と耐障害性を支える仕組み(OTP)を紹介し、それが IoT の分野でも有効であることを説明します。
そして、サーバサイドの Elixir 開発をシームレスに IoT 開発へ適用できるオープンソースのプラットフォーム Nerves を紹介します。
Nerves は Raspberry Pi や BeagleBone などの安価なシングルボードコンピュータを公式にサポートしており、ホビー開発からプロトタイプ開発まで気軽に始めることができます。
サーバサイド Elixir の開発体験をそのまま IoT に活かせる Nerves の魅力を伝えられたらと思います。
ソフトウェア開発において、複雑なビジネスドメインを正確に捉えることは極めて重要です。しかし、その過程でしばしば直面するのが、余計な詳細や偶有的複雑さ(accidental complexity)です。これらはシステムを理解しにくくし、保守コストを高める原因となります。
そこで鍵となるのが「抽象」の役割です。本発表ではドメインモデリングにおける抽象の役割を取り上げ、問題空間と解決空間の橋渡しや、ドメインの核となるモデルを的確に表現する土台を作り上げることの重要性について述べます。そして、これらを実現するためのアプローチとして、tagless-finalによる型安全なDSL構築手法について取り扱います。さらに、DSL自体を、型安全に最適化あるいは拡張していくための方法について扱います。また、ソフトウェア開発において、DSLをいつ作るべきか、どのように活用するか、についても触れます。
キーワード:
講演者は Haskeller ですが、最近は業務では Rust を書いています。その過程でどうしても do 式が使いたくなり、Rust で do 式を使うための qualified_do
を開発しました。
まずは、この qualified_do
によるプログラムの例を紹介し、かなり便利なものであるというお話をします。
特に、do式によって Rust の ?
構文糖衣に対する代替的な記法が実現できることや、イテレータの合成や proptest によるランダムデータ生成を見通しよく書けることなどを見ます。
do式を使うには、Monad や Applicative といった構造に類似の演算を備えている必要があります。「Haskellのひとたちが使っている難しそうな……」と身構えるかもしれませんが、do式のうちどういう構文がつかえるかという基準を念頭におくと、こうした階層を自然に理解できることを紹介します。また、Rust でモナド等を抽象化するために Generic Associated Types を使うトリックについても欠点と利点を解説します。
Rust や Linear Haskell のようなリソース管理にうるさい言語では、資源管理にどこまで敏感かによって、Monadの階層は複数に分裂します。本講演では、最後に発展的話題としてこうしたフレーバーの異なる複数の Monad 階層の関係について触れ、また Rust と Linear Haskell の型システムの違いにより、Rust では資源に敏感な do 式をより広い型に適用できるという事を説明します。
Rust、線型型、所有権、do式、プログラミング言語意味論、モナド、Functor、Applicative、Haskell、Linear Haskell
Hasktorchは、Haskellでディープラーニングを行うためのライブラリであり、関数型プログラミングの強みである型安全性を活かしながら、PyTorchの強力な計算エンジンを利用できます。本セッションでは、Hasktorchの基本的な使い方に加えて、セットアップ方法やJupyter Notebookを活用したインタラクティブな開発フローについても解説します。
特に、次のようなトピックをカバーします:
このセッションでは、コードデモを交えながら、Hasktorchを実際に動かしながら学べる内容を提供します。関数型プログラミングを活かしたディープラーニングに興味のある方はぜひご参加ください!
「関数型プログラミング」や「関数型言語」の定義に普遍の共通認識は存在しませんが、複数の(いわゆる)関数型言語にしばらく触れてみると、共通して重視されている概念や考え方、設計パターン、機能と思われるものも見えてきます。
Haskell, Scala, Clojure, Elixirという性質の異なる4つの関数型言語での特徴的なプログラミングスタイルを吟味(= テイスティング)してみることを通して、関数型プログラミングの中核にありそうなもの、周辺にありそうなもの、(直接的には)無関係そうなものについて一緒に考えてみましょう🍷
取り上げる(かもしれない)キーワード: 関数とその組み合わせ方いろいろ, 変換 vs 命令, 式指向 vs 文指向(cf. コードの形), よくある設計パターン/言語機能, 参照透過性, 不変性と永続性, 合成可能性, データ指向 vs オブジェクト指向, 再利用性と抽象度(cf. 命名), メタプログラミングと言語処理系, 関数型プログラマのメンタルモデル
Siiibo証券株式会社は2019年に創業して以来、バックエンドにElixir,フロントエンドにElmと関数型言語をフルスタックに採用して、社債専門の証券システムを作り上げてきました。
このセッションでは実際に関数型言語を業務で(特にスタートアップ企業などの少人数開発組織で)採用し、維持し、継続するにあたって重視している価値観、手続き、手法などをざっくばらんに紹介してみようと思います。
計算機プログラムは現実のフォン・ノイマン型計算機上での計算が前提ですから、命令を記述する部分が必ずあります。
I/Oがその典型です。このセッションでは、そのI/O部分をできるだけ、小さく一箇所に隔離する方法を対話的ソート問題を例に紹介します。
interact :: (String -> String) -> IO ()
の紹介2025年、CursorやCline、DevinなどのAIエージェントを活用した開発が主流となりつつあります。しかし、大規模な開発においては、AIが実装しやすい「枠組みの提供」と「コンテキストの最小化」が重要となります。本セッションでは、形式手法や関数型プログラミングの手法がこれらの課題にどのように寄与するかを探ります。具体的な事例を通じて、これらのアプローチがAIエージェントを活用した開発の生産性と品質向上への貢献度合いを検証していきます。
カバーするトピック
本セッションでは、プログラミングにおける再帰の基礎を初心者向けにわかりやすく解説します。まず、再帰とは何か、そしてなぜ関数プログラミングにおいて重要なのかを説明し、簡単な例を通じてその概念を掴んでいただきます。また、命令型プログラミングにおけるループ処理と、関数プログラミングにおける再帰アプローチの違いについても、実際のコード例を用いて比較し、解説します。
さらに、再帰を利用する際に直面しがちな問題点とその対策にも触れます。例えば、再帰呼び出しが深くなりすぎることで生じるスタックオーバーフローなどのリスクについて説明し、それを回避するテクニックとして末尾呼び出し最適化を紹介します。また、より高度な話題として継続渡しスタイルによる再帰の書き換えにも触れ、パフォーマンスやスタック使用量の観点から再帰を最適化する方法を概観します。
その後、再帰の実践的な応用例として、木構造の探索アルゴリズムやファイルシステムの再帰的な探索処理を紹介します。これらの例を通じて、再帰が現実世界の問題解決にどのように役立つかを具体的に示します。
初心者の方でも安心して参加できる内容となっており、再帰の基礎から応用までを学べるセッションです。
「ElixirでIoT!!」と Erlang & Elixir Fest 2019 で喧伝しだしてから早くも5年以上の月日が流れてきました.
提案者はこれまで,「ElixirはIoT向きのプログラミング言語である」という旗印のもとで,IoTシステムに使える(はずの)さまざまなライブラリやプラットフォームをElixirで作ってきて,そしてそれらの価値を指し示すための「論よりRUN!!」なデモをお見せしてきました.
今回の発表では,どのような技術的思考と願望からこのような活動を進めてきたのか,そして得られてきた研究開発の成果を振り返りたいと思っています.
そして,提案者は正直に申し上げると,関数型言語はElixirしか分かっていません.参加される皆さまそれぞれに思い思いの「推し」があるはずですので,それらもIoT開発に使えるのか?使うとしたらどういう素敵なことが起きるのか?ざっくばらんに語り合えたらと考えています.
Elmは型安全性や開発体験の良さが注目されがちですが、実際のパフォーマンスはどうなのでしょうか?
「Elmは遅いのか?速いのか?」という疑問に対して、実際にベンチマークを取り、得られた知見を共有します。
処理が重いサンプルコードを起点に少しずつ改良を進め、パフォーマンスを向上させてみましょう。
昨今巷で Effect システムが流行っていますが、実はその双対、Coeffect システムというものがあるのをご存じでしょうか。
Effect が関数のボディでの作用について述べるシステムだとすれば、Coeffect は対称的に、引数の性質について述べるシステムです。変数の使用回数のトラッキング、セキュリティレベルの追跡などがそのインスタンスになることが知られています。
Effect システムについても軽く説明しますが、型付きラムダ計算等の知識は前提とします。
関数型言語の応用例として、制御をElixirで行った小水力発電所の例を紹介します。現在の産業機械の制御に使われてるハードウェア・ソフトウェアは多くの問題を抱えており、それを近代化する手法の一つにElixirの導入があると考えています。セッションではおおよそ以下の話をする予定です。
高階関数を用いたI/Oの実現方法について、TypeScriptでの例をご紹介します。
関数型プログラミングでは、高階関数や部分適用を活用することで、DIコンテナに依存することなくI/Oを実現することができます。
私の周りでは、オブジェクト指向プログラミングやそのフレームワークに慣れ親しんだプログラマーが関数型プログラミングを学び始める際に、
以下のような戸惑いを感じるケースを見てきました。
私自身も関数型プログラミングを学び始めた当初は、同様の戸惑いを感じていました。
オブジェクト指向プログラミングでは、フレームワークが提供するDIコンテナを使うことは一般的です。
これに慣れていると関数型プログラミングでの設計にギャップを感じることがあります。
私は関数型プログラミングが楽しいですし、実用性も感じています。もっと広まってほしいと願っています。
しかし、上記のような理由で、関数型プログラミングの学習に躓いたりすることもあると思います。
今回のトーク内容としては、以下のような内容を予定しています。
高階関数や部分適用は実用的なテーマですし、I/Oの実現方法についても関数型プログラミングの魅力の一つだと感じます。
このセッションを通じ、より実用的な関数型プログラミングの知識を共有できると嬉しいです。
本発表では、関数型プログラミングにおいて最も強力な概念の一つである、残りの計算を表す"継続"とその進化について、歴史的背景から最新技術までを包括的に整理します。
アセンブリレベルのコントロールフローやC言語のgotoといった低水準の制御命令から、構造化プログラミング期における明確な制御構造の発展、そしてSchemeにおけるcall/ccなどの継続演算子の登場へと、歴史を辿っていきます。さらに、CPS変換やANF、CFGとの対応を通じ、言語処理系の中間言語としての継続の性質について考察します。
加えて、async/awaitやモナド、代数的効果といった近年発展を続けている副作用の管理方法や、ワンショット性を考慮した効率的な実装など、先進的な概念・技法について論じ、継続が言語設計および実装に与える影響と今後の可能性を探ります。
ElixirはErlang VM (BEAM) の上で動作するRubyライクな文法をもつ関数型言語として知られています。
Erlangと同様に値は全てイミュータブルですが、Erlangが再束縛(再代入)不可である一方、Elixirは再束縛(再代入)可という異なるアプローチを採用しています。
再束縛(再代入)の可否を選択できる言語においては、正当な理由がない限り再束縛(再代入)不可の利用が推奨されており、Elixirのアプローチは一見悪手のように見えるかもしれません。
なぜElixirの再束縛(再代入)可という選択が悪くない戦略なのかについて、関数型言語の特性や、束縛、代入、ミュータブル、イミュータブル等の整理を通じて紐解いてみたいと思います。
Excel 2021でLAMBDA関数が実装されてExcelの数式はチューリング完全になるとともに、MAP、REDUCE関数などの関数型プログラミングでよく使われる関数も実装されました。
また、Excelは、数式は常に返り値を持つことに加え、データは完全にイミュータブルで、ほとんどの場合に参照等価性を持っているなど、関数型言語としての特徴も有しています。
そこで、今回のセッションでは、Excelを使って関数型プログラミングの初歩的な処理をする方法を紹介しようと思います。
定理証明支援系であり純粋関数型プログラミング言語でもある、Lean について紹介します。
Lean はまだ新しい言語であり知名度も低いので、このトークではLean言語の名前と特徴を憶えてもらうことを目標とします。
XSLTはXMLを変換するためのテンプレート言語ですが、関数型プログラミング言語とよく似た特徴を持っています。
本発表では、XSLTを関数型言語として捉え、実際にBrainfuck処理系を実装した事例を紹介します。
テンプレート適用によるパターンマッチ、変数の不変性、再帰的な処理といった関数型的な特徴を活用し、
ループや状態管理をXSLTでどのように記述できるかを具体的なコードとともに解説します。
Brainfuckのようなチューリング完全な処理系を実装できることから、XSLTもチューリング完全なプログラミング言語であることを示します。
この実装を通じて、関数型プログラミングの視点を広げるきっかけになれば幸いです。