型システムはある種のバグを静的に検査可能な手法で、多くの型システムは健全性を満たします。つまり、型システムが言うことは全て正しいです。
一方で、実世界の型システムは、ひょんなことから健全性を破壊する「穴」が存在していたりします。怖いですね。
本トークでは、Java や Rust、OCaml など、実世界のプログラミング言語における型システムの「穴」を概観します。罠を事前に知ることで、実際にハマったときの素早い対処や、プログラミング言語への深い理解が期待されます。
本セッションは、数理論理学を学ぶことによって型システム理論への入門が容易になると主張するものです。
発表者はかつて『型システム入門』の勉強会に参加していましたが、参加者の一部はプログラマではないにもかかわらず、ときに職業プログラマーである発表者よりも、深く内容を理解できていました。彼らは、数理論理学に深く通じているという点で共通していました。
なぜ数理論理学の知識が型システム理論の理解を助けるのでしょうか?それは、静的型付け言語における操作的意味論と型システムの関係が、論理学における意味論と証明体系の関係に対応するからだと発表者は考えています。つまり、論理学に詳しい彼らにとって、『型システム入門』の内容はとても馴染みのあるものだったのです。
そこで本発表では、『型システム入門』への入門を目論んでいる方々に向けて、あえて数理論理学を経由することを提案します。セッションは次のような内容を含みます。
XSLTはXMLを変換するためのテンプレート言語ですが、関数型プログラミング言語とよく似た特徴を持っています。
本発表では、XSLTを関数型言語として捉え、実際にBrainfuck処理系を実装した事例を紹介します。
テンプレート適用によるパターンマッチ、変数の不変性、再帰的な処理といった関数型的な特徴を活用し、
ループや状態管理をXSLTでどのように記述できるかを具体的なコードとともに解説します。
Brainfuckのようなチューリング完全な処理系を実装できることから、XSLTもチューリング完全なプログラミング言語であることを示します。
この実装を通じて、関数型プログラミングの視点を広げるきっかけになれば幸いです。
高階関数を用いたI/Oの実現方法について、TypeScriptでの例をご紹介します。
関数型プログラミングでは、高階関数や部分適用を活用することで、DIコンテナに依存することなくI/Oを実現することができます。
私の周りでは、オブジェクト指向プログラミングやそのフレームワークに慣れ親しんだプログラマーが関数型プログラミングを学び始める際に、
以下のような戸惑いを感じるケースを見てきました。
私自身も関数型プログラミングを学び始めた当初は、同様の戸惑いを感じていました。
オブジェクト指向プログラミングでは、フレームワークが提供するDIコンテナを使うことは一般的です。
これに慣れていると関数型プログラミングでの設計にギャップを感じることがあります。
私は関数型プログラミングが楽しいですし、実用性も感じています。もっと広まってほしいと願っています。
しかし、上記のような理由で、関数型プログラミングの学習に躓いたりすることもあると思います。
今回のトーク内容としては、以下のような内容を予定しています。
高階関数や部分適用は実用的なテーマですし、I/Oの実現方法についても関数型プログラミングの魅力の一つだと感じます。
このセッションを通じ、より実用的な関数型プログラミングの知識を共有できると嬉しいです。
「ElixirでIoT!!」と Erlang & Elixir Fest 2019 で喧伝しだしてから早くも5年以上の月日が流れてきました.
提案者はこれまで,「ElixirはIoT向きのプログラミング言語である」という旗印のもとで,IoTシステムに使える(はずの)さまざまなライブラリやプラットフォームをElixirで作ってきて,そしてそれらの価値を指し示すための「論よりRUN!!」なデモをお見せしてきました.
今回の発表では,どのような技術的思考と願望からこのような活動を進めてきたのか,そして得られてきた研究開発の成果を振り返りたいと思っています.
そして,提案者は正直に申し上げると,関数型言語はElixirしか分かっていません.参加される皆さまそれぞれに思い思いの「推し」があるはずですので,それらもIoT開発に使えるのか?使うとしたらどういう素敵なことが起きるのか?ざっくばらんに語り合えたらと考えています.
関数型言語の応用例として、制御をElixirで行った小水力発電所の例を紹介します。現在の産業機械の制御に使われてるハードウェア・ソフトウェアは多くの問題を抱えており、それを近代化する手法の一つにElixirの導入があると考えています。セッションではおおよそ以下の話をする予定です。
Intermediate。do
式(Haskell)/for
式(Scala)/qdo!
マクロ(Rust)などを使って、エラーが起こりうる処理を書けることを想定します。
関数型プログラミングの初学者向けの説明では、しばしば、Maybe
(Scala/Rust のOption
)は「失敗しうる」ような「文脈」/「計算」であると説明されます。Scala で言うfor { a <- f1(); b <- func2(a) } yield b
が、Rust で言う question mark operator による early-return(let a = f1()?; let b = f2(a)?; Ok(b)
)と同等である、という観察を提示されることによって、Maybe
が「失敗しうる計算」を表しているという言説に納得している方も多いかもしれません。
しかし、これらの例をよく観察してみると、「失敗しうる」のは「Maybe a
を計算する処理片」などであって、個々のMaybe
値は「失敗しうる」という性質を持っていないように見えてきます。特に、個々のMaybe
値というのはJust x
かNothing
という具体的な値であり、これらが「計算」や「文脈」の概念を内包しているようには到底見えません。Maybe
によるdo
/for
が「失敗しうる処理」を表現できていることには(先程の Scala/Rust の対比から)納得できるかもしれませんが、Maybe
そのものが失敗/成功の概念を果たして内包しているでしょうか。
この講演は、この(しばしば見落とされている)ギャップに焦点をあてて、「失敗しうる計算」という現象を、多段階計算/メタプログラミング的な視点を導入することで整理することを試みます。特に、以下の点について詳しく見ます。
Maybe
の個々の値は本当に成功/失敗の概念を持つが、それ自体は early-return 的な操作とはかけ離れていることMaybe
のことを(ナイーブに)「失敗しうる計算」だと考えるべきだということOBJファイルフォーマットから3Dジオメトリを読み込むために、elm-obj-fileパッケージを使ってデコーダーパターンを使う方法を説明します。OBJフォーマットにはglTFのシーングラフのような最新の機能はありませんが、デコーダーパターンを使うと:
Blenderから作ったモデルをウェブアプリケーションに読み込む実例を示します。
Coqには、証明付きプログラミングを容易にする Program 機構があります。本LTでは、この Program 機構の概要とその利用例を紹介します。
この機能を紹介する題材として、インデックスを用いたリストの要素取得を取り上げます。Coq において、指定したインデックスにあるリストの要素を取得する場合、通常は option
型を返すか、指定したインデックスに要素がない場合に備えて、あらかじめデフォルト値を渡す必要があります。しかし、指定したインデックスがリストの長さ未満ならば、毎回 Some
が返ってくることは明らかです。
本LTでは、Program 機構を活用し、インデックスがリストの長さ未満であることが前提の場合に、option
型を用いず、またデフォルト値を与えることなくリストの要素を取得できることを紹介します。「Coqにこんな機能があるのか!」と興味を持ってもらえたら幸いです。
「関数型」に基づく事象のとらまえ方をすることで、専門性が必要で敷居が高いように思われる「ドメインモデリング」を容易に実現できるアプローチを提案します。
「関数型プログラミング」についてまだまだ馴染みがないエンジニアが多いように思いますし、私自身も最近触り始めた程度で、まだまだ詳しくありません。実務では手続型の実装が多く「オブジェクト指向」に基づく思考プロセスでドメインモデリングや / 設計 / 実装をしていました。上手く実装できている手応えもある一方で、ドメインモデリングが「特定の人しかできない」「人によって考え方が大きく変わってしまう」...などスケールが難しい状況となっていました。
そんな中書籍「関数型ドメインモデリング」から、「オブジェクト指向」をベースにするより「関数型」をベースにした思考プロセスの方が、「より直感的で」「複雑なことをせずに実現可能である」...という気づきを得ることができました。その後「関数型」の思考プロセスをベースにした「ドメインモデリング」の実践方法を整理し、チームで実践してきました。
上記の経験を踏まえ「関数型のアプローチの何が優れているのか」「実際にどんなアプローチをしているのか」についてお話しします。
Hasktorchは、Haskellでディープラーニングを行うためのライブラリであり、関数型プログラミングの強みである型安全性を活かしながら、PyTorchの強力な計算エンジンを利用できます。本セッションでは、Hasktorchの基本的な使い方に加えて、セットアップ方法やJupyter Notebookを活用したインタラクティブな開発フローについても解説します。
特に、次のようなトピックをカバーします:
このセッションでは、コードデモを交えながら、Hasktorchを実際に動かしながら学べる内容を提供します。関数型プログラミングを活かしたディープラーニングに興味のある方はぜひご参加ください!
Elixir は Erlang VM 上で動作し、高い並行性と耐障害性を持つ関数型言語です。特に Web フレームワーク Phoenix によってサーバサイドでの利用が広まっています。
本セッションでは、Elixir (Erlang) の並行性と耐障害性を支える仕組み(OTP)を紹介し、それが IoT の分野でも有効であることを説明します。
そして、サーバサイドの Elixir 開発をシームレスに IoT 開発へ適用できるオープンソースのプラットフォーム Nerves を紹介します。
Nerves は Raspberry Pi や BeagleBone などの安価なシングルボードコンピュータを公式にサポートしており、ホビー開発からプロトタイプ開発まで気軽に始めることができます。
サーバサイド Elixir の開発体験をそのまま IoT に活かせる Nerves の魅力を伝えられたらと思います。
新卒入社後、1年ほどF#での開発に携わってきた経験をもとに、F#の基本機能であるコンピュテーション式から、F#+を使った拡張までこのLTでお伝えできたらと思います。コード例や実際のユースケースを交えながら、以下のトピックをわかりやすく解説予定です。
30年前、初めて触ったプログラミング言語。「日本語ロゴライター」。
唯一無二の「タートルグラフィックプログラミング言語」ですが、その作法は関数的であり、オブジェクト(亀)な素養もありました。
その後、C言語で本格的に関数型手続き言語を学ぶまでのおよそ3年間の記憶から、現代の関数型プログラミングに通じるノウハウを掘り起こしてみましょう。
という名の主に思い出語りです。
「関数型まつり」のWebサイトを構築するにあたり、 elm-pages というフレームワークを採用しました。
本発表では、elm-pagesの特徴や採用の理由、実際の開発プロセスを紹介しつつ、Elmを用いた静的サイト開発のメリット・課題について考察します。
Scala歴10年超のエンジニアが、TypeScriptやPythonを書く際にScalaならこう書けるのに!というあるあるを紹介していきます。
型周りの話から、パフォーマンスの話まで、実際に業務で書いていて感じたところを紹介していきます。
TypeScriptやPythonで、関数型スタイルのライブラリを導入して無理やり実現してみて、それでもまだ足りない!ところまで踏み込みます。
Scalaに未練タラタラの内容です。
次のライブラリ/機能にも少し触れます
昨年v1に達したGleamという静的型付けな関数型言語があります。
この言語はErlang VM(BEAM)とJavaScript(Node.js/Deno/Bun)で実行でき、ifやforなどが存在しないなど非常にシンプルな構文を持っているという特徴があります。
Erlang VMは並列性と耐障害性に優れた処理系で、
主にゲームサービスや通信システムなど大量に同時接続されたりサーバーや高い可用性が求められるシステムにおいて採用されています。
現在のGleamエコシステムはバックエンドフレームワークであるwispや、
フロントエンドフレームワークであるLustreなど様々なライブラリ・フレームワークが登場しています。
本登壇を通して始め方や周辺ツールの導入方法からGleamという言語の強みやエコシステムの現状、今後のGleamの可能性などを紹介していきます。
なるべくSwift言語や関数型プログラミングの前提知識を必要としないように説明したいとは思いますが、たとえばクロージャが何かという説明などは省略します。
みなさんは関数型プログラミングの説明を読む時、「それで結局何ができるようになるのか?」または「どんな課題を解決するのか?」と感じたことはありませんか?私自身そう感じることが何度もあります。
本発表では、まずiOSアプリ開発を知らない方向けに、iOS開発で課題となる状態管理やコードのテストについて説明します。そして、それらが関数型プログラミングの考え方をベースにしたOSSフレームワーク『The Composable Architecture (TCA)』によって、どのようにシンプルな形で解決されるのかを解説します。
Excel 2021でLAMBDA関数が実装されてExcelの数式はチューリング完全になるとともに、MAP、REDUCE関数などの関数型プログラミングでよく使われる関数も実装されました。
また、Excelは、数式は常に返り値を持つことに加え、データは完全にイミュータブルで、ほとんどの場合に参照等価性を持っているなど、関数型言語としての特徴も有しています。
そこで、今回のセッションでは、Excelを使って関数型プログラミングの初歩的な処理をする方法を紹介しようと思います。
F#は.NETプラットフォーム上で実装された実用的な関数型言語です。本セッションでは、F#の言語設計における特徴的な選択と制約について解説します。
まず、非純粋関数型言語としてのF#の特徴を説明します。副作用の扱い方、関数型の機構とオブジェクト指向プログラミングの共存、そして実用性を重視した設計判断について概観します。
次に、F#独自の機能であるコンピュテーション式と非同期処理を取り上げます。HaskellのMonadやScalaのfor式との比較を交えながら、DSLとしての表現力や、非同期プログラミングモデルの特徴を示します。
最後に、.NETプラットフォームがF#の型システムに与える影響と制約について説明します。メソッドオーバーロードと型推論の相互作用、高カインド型の欠如、そしてそれらの制約に対する解決策としてのSRTPなど、実践的な観点から解説します。