Arantium Maestum

プログラミング、囲碁、読書の話題

Lispを実装したくなったら読んでほしい本6選

言語実装 Advent Calendar 2022の1日目の記事として書いた。 Lisp Advent Calendar 2022でも枠が空いていたのでダブル投稿。 プログラミング言語を実装してみたい!と思ったらまずは簡単なLispインタプリタから始めるというのは一つの王道だと思う。 複雑な…

TIL:源氏二十一流

今年の大河で出てきた源仲章が源姓なのに明らかに公家&いわゆる源平合戦の源氏とは別な描写だった。 武家ではない公家な源氏というのは百人一首に選ばれた歌人として源融、源兼昌がいるし、さらにフィクションでは源氏物語の光源氏もいるわけだが、どういう…

TIL:OCamlのバリアントは比較できる

wamlのコードを読んでいて let rec enforce inf (p : pred) = function ... | Bool | Byte | Text when p <= Eq -> () のようなコードに行き当たった。predというのは type pred = Any | Eq | Ord | Num のように定義されている。つまり普通のバリアントだ。…

wamlのコードを読んでる

Andreas RossbergがwebassemblyのGC proposalを試すために作ったミニML言語waml。以下の記事で紹介した: zehnpaard.hatenablog.com それからもちょこちょこと眺めていたのだが、 考えれば考えるほどwamlは(wasmとは関係なく)すごいな。正格評価なラムダ計算…

再帰型の実装に関して悩んでいること2 equi-recursive対iso-recursive

TaPLを読むと再帰型の理論と実装について、equi-recursiveとiso-recursiveという二つの流儀があると書いてある。 equi-とiso-については以下の記事でも少し触れた: zehnpaard.hatenablog.com しかし実際どういう違いなのかをメモった上でどちらにするのかを…

再帰型の実装に関して悩んでいること1 再帰する型変数の表現

型システムにどうやって再帰型を追加するかで悩んで手が止まっている。何に悩んでいるのかを書き出して整理していきたい。 今回は「現在、型そのものをtyというバリアント型で表現しているが、その枠組みで再帰型をどう表現するか」について。 そもそも再帰…

wasm GC Proposalのために作られた実験的な関数型言語処理系Wamlが面白そう

自分で実装している型システムに再帰型をつけたくてiso-recursive typesで検索していたらwasm garbage collectorのGitHubレポジトリで行われている侃侃諤諤な議論を見つけて読み漁っていた。 その中で見つけたのがwasmの中心的な人物であるAndreas Rossberg…

型システム実装幕間2 unifyとoccurs check、adjust levelについて

match_fun_tyなどのヘルパ関数をなくす是非を考えていて「型変数を新しく作成して使うコストは低いのだから(破壊的代入でリンクをアップデートしてるので管理する型変数の数が増えても処理が重くならない)、match_fun_tyなどでパターンマッチせずTArrow(tv…

TIL:OCamlコンパイラのrectypesフラグ

再帰型についてTaPLなどを読み返していて、ようやく再帰型の「2大流派」であるisorecursiveとequirecursiveの違いなどがわかってきた。調べている間にOCamlコンパイラの-rectypesというフラグについて知ったのでメモ。 OCaml(そしてほとんどの関数型プログ…

型システム実装幕間1 各種matchヘルパ関数について

ここまで実装した型システムではコアな部分であるtypeofの中で使うヘルパ関数として5つmatch_..._tyという名前の関数を定義している: match_fun_ty match_tuple_ty match_rec_ty match_ref_ty match_list_ty これらは元々効率的なHM型推論のお手本として使…

Hindley Milner型推論に機能を追加していく13 Listの追加(後編)

前回に続いてList追加の実装を見ていく。今回はtypeofで使われるヘルパ関数について。 match_list_ty 前回見ていったtypeof関数で新しく使われたmatch_list_tyは「tyをとりリスト型と単一化させた上でそのリスト型が保持している型を返す」という関数。EHead…

Hindley Milner型推論に機能を追加していく12 Listの追加(前編)

前回「次は再帰型を追加する」と書いたが、その前振りとして関連しているがより簡単な「言語機能としてリスト型を提供する」をまずやっていく。 OCamlでユーザがリスト型を定義するなら: type 'a list = Nil | Cons of 'a * 'a list このように代数的データ…

TIL: 世界恐慌で滅んだ世界的マッチ王

第二次世界大戦以前に不透明な金融やM&A戦略により世界的なマッチ帝国を築き、世界恐慌で全てを失った人物について知ったのでメモ スウェーデン富豪イーヴァル・クルーガーが一時期世界のマッチ生産の75%を握り、世界各国でマッチの独占供給権を持ってい…

Hindley Milner型推論に機能を追加していく11 Refの追加(後編)

前回書いたとおり、Let多相とRefとパラメトリックな型を組み合わせても型安全性が維持されるためには、Letで型が全称化される対象の式を制限する必要があり、これをvalue restrictionと呼ぶ。 残念ながらこの「全称化される式」であるsimple valuesのリスト…

TIL: gitで差分なしコミット

このツイートで知った: Gitで差分がなくても空コミット作ることができるのはじめて知った。今までプッシュでのCI/CDやり直したい時、適当にリファクタリングしていたりしてたんだけど必要なかったみたい。https://t.co/VkQDcEnJUz— いぐぞー!! ✈️ 旅する…

Today I Learnedという記事フォーマット

こんな記事を読んだ: simonwillison.net 「ブログを書くススメ」的な記事で、その中で勧められている「Today I Learned」がよさそうだったので真似したい。 言ってしまえば日々知ったふとしたことをメモるまさに備忘録な小記事なわけで、そんなに大発見なわ…

Hindley Milner型推論に機能を追加していく10 Refの追加(中編)

前回の終わりに 前述のとおり今回のコードはRefとLet多相の関係により型安全ではない。 と書いた。 しかしよくよく考えてみると、現在実装した型システムだと機能がギリギリなところで弱く、Let多相とRef型があるにもかかわらず型安全性は保たれている、よう…

Hindley Milner型推論に機能を追加していく9 Refの追加(前編)

Ref型とそれに関係した式の処理を追加する。 この記事で(HM型推論なしで)追加したものと同じ: zehnpaard.hatenablog.com ref型を作るためのオペレータref(ここら辺OCamlだと型とオペレータの名前が被ったりしてややこしい)、ref型からデータを取り出すd…

型コンストラクタは型なのか

ツイッターで型コンストラクタが型かどうか?という話があり、ツイートで少し書いたのだがもうちょっとまとめてみる。 TaPLにおける定義 型コンストラクタと型はまったく同じ概念を指す言葉である 型はカインドを持つ カインド*の型を真の型と呼び、これらは…

Hindley Milner型推論に機能を追加していく8 Fixの追加

再帰関数を定義するためのFixオペレータを言語に追加する。 型推論なしで追加した時の記事はこれ: zehnpaard.hatenablog.com Fixの使い方などはこの記事を参照してほしい。 今回のコードはここ 型 型には変更なし。 式 Fix式を追加: type exp = ... | EFix…

Hindley Milner型推論に機能を追加していく7 Variant型の追加(後編)

前回に続いてバリアント型を追加していく話。今回はバリアント型を扱うための式とその式に対する型推論のロジックを見ていく。 式 バリアント型の値を作るETagと、パターンマッチでバリアントに保持されている値を取り出すECaseを追加: type exp = ... | ET…

Hindley Milner型推論に機能を追加していく6 Variant型の追加(前編)

バリアント型を追加していく。前回のレコード(あるいは前々回のタプル)と合わせて、代数的データ型の直積、直和が表現できるようになる。 コードはここ。 少し長くなったので今回は型としてバリアントを追加する話のみ。バリアント型の式を言語に追加して…

Hindley Milner型推論に機能を追加していく5 Record型の追加

HM型推論にレコード型を追加していく。今回のコードはこちら。 型 Record型を追加: type ty = ... | TRecord of (string * ty) list 基本的にはタプル型の要素に文字列のラベルがついているというイメージでいい。 TRecord of (string * ty) listとTRecord …

Hindley Milner型推論に機能を追加していく4 Tuple型の追加

HM型推論にタプル型を追加していく。今回のコードはこちら。 型 タプルというのはちょっと不思議な型で、型コンストラクタとして表そうとすると「任意の数の型をとる型コンストラクタ」となる。理論上の考え方としては二つの型をとるPair型コンストラクタとU…

Hindley Milner型推論に機能を追加していく3 Int型の追加

前回のBoolに続いてInt型とそれに関連する式であるIntリテラル、AddとIsZeroを実装する。 型 Int型の追加: type ty = ... | TInt 式 Intリテラル、Add、IsZeroを追加: type exp = ... | EInt of int | EAdd of exp * exp | EIsZero of exp AddはInt型の式…

Hindley Milner型推論に機能を追加していく2 Bool型の追加

前回の記事に続いてHM型推論を少し拡張する。 今回はBool型を追加し、Boolのリテラル式二つとIf式を実装する。 型 Bool型を追加: type ty = ... | TBool 式 True、False、If式の追加: type exp = ... | ETrue | EFalse | EIf of exp * exp * exp If式は条…

Hindley Milner型推論に機能を追加していく1 Unit型の追加

前々回、前回の記事でそれなりに実用的なLet多相型推論が実装できた: 型推論を実装・改善していく9 レベルによるLet多相の効率化(前編) - Arantium Maestum 型推論を実装・改善していく10 レベルによるLet多相の効率化(後編) - Arantium Maestum し…

OCamlコンパイラのバックエンドを提供するMalfunctionが面白そう

OCamlのDiscuss掲示板を眺めていたらこんなプロジェクトについての言及があった: github.com Malfunction is a high-performance, low-level untyped program representation, designed as a target for compilers of functional programming languages. OC…

型推論を実装・改善していく6.5 組み込み関数の多相型推論

このようなツイートを拝見した: instantiationだけ実装すれば組み込み関数の多相化が出来るのでは?— taka2 (@Jj1Fxh) October 30, 2022 確かにそのとおりで、単相型推論からLet多相の間に「ユーザ定義の関数は単相だが特定の組み込み関数は多相」という型…

型推論を実装・改善していく10 レベルによるLet多相の効率化(後編)

前回に続いてLet多相にレベルを導入した実装の詳細を見ていく。 具体的にはinstantiate、match_fun_ty、unify、occursinがレベルの導入でどう影響を受けるかという点と、unifyで新しく使われるadjustlevelの理屈と実装を解説する。 instantiate 汎化された型…