Arantium Maestum

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

Algebraic Effects

『「作ってかんたんAlgebraic Effects」をRustに移植した』を読んだ

ツイッターでalgebraic effectsについての話題を探していたら以下の記事を見つけた: zenn.dev Haskellで書かれた「Algebraic Effectsのある処理系の作り方」のRust移植だ。@Nymphiumさんの書かれた元の記事はこちら: nymphium.github.io この記事は出た時…

OCaml Effects Tutorialの演習「Async/await」をやってみる

OCaml 5.0にeffect handlerが入った理由の一つである、並行処理をdirect styleで記述できるasync/awaitの実装をやってみる。 この演習: github.com 演習用のコード・サンプルはこれ: github.com Schedulerのインタフェース この演習ではasync/awaitといっ…

Effect Handlerで相互再帰を分割するコードの変遷

前回の記事で書かれたコードに到達するまで、いくつかのアプローチで漸進的に単純化されていったのでその経緯についても書いておく。 第一案 そもそも「相互再帰を分割するサンプルコードを書こう」と思い立ったのはComposable Interpreterで使った「すべて…

Effect Handlerで相互再帰を分割する

タイトルどおり、OCaml 5.0のeffect handlerを使って相互再帰的な関数を分割して別々に定義できるようにする。 相互再帰な処理 ベタだが今回はis_oddとis_evenという相互再帰な関数を例にとる: let rec is_odd n = if n=0 then false else is_even (n-1) an…

Effect Handler、Extensible Interpreter、Expression Problem

前回の記事に書いたとおり、今回はこのExtensible Interpreterの枠組みを使うとExpression Problemを解決できるということを見ていく。 Expression Problem Expression Problemについては以前この記事で書いた: zehnpaard.hatenablog.com かいつまんで説明…

OCaml 5.0のEffect HandlersでComposable Interpreter

前回のコードをベースに「任意のExtensionハンドラを変更なしで組み合わせて作る」Composable Interpreterを実装する。 問題 前回のコードの何がComposabilityを阻害していたかというとインタプリタを拡張するハンドラが、拡張前のインタプリタ関数を使って…

OCaml 5.0のEffect HandlersでExtensible Interpreter 続

前回「任意のハンドラを組み合わせてインタプリタを作るといったComposabilityも持たせることができる」と書いた。今回はそのComposable Interpreter実装への準備段階として、前回のコードをリファクタしてeval関数とeffect handlerをある程度分離した形にす…

OCaml 5.0のEffect HandlersでExtensible Interpreter

ツイッターでOCamlのEffect Handlerの話題を漁っていたらこのようなツイートを見つけた: Algebraic Effects (Multicore OCaml)を使ってExtensible Interpreterを実装する例:https://t.co/b1Tu4pys6dポイントはeffect handlerにcontinuationが渡ってくる (=…

OCaml Effects Tutorialの演習「Generators from iterators」をやってみる3

前回の終わりに書いた通り、Effect.Shallowを使って「generatorが作成されてまだ要素を返していない」状態を特殊ケース化せずに処理できるようにする。 今回のコード type ('elt, 'container) iterator = ('elt -> unit) -> 'container -> unit type 'elt ge…

OCaml Effects Tutorialの演習「Generators from iterators」をやってみる2

前回に続いてOCaml Effects TutorialのGenerators from Iteratorsをやっていく。 前回のコード 前回のコードを再掲する: type ('elt, 'container) iterator = ('elt -> unit) -> 'container -> unit type 'elt generator = unit -> 'elt option let generat…

OCaml Effects Tutorialの演習「Generators from iterators」をやってみる1

OCaml Effects Tutorialの演習問題として、任意のcontainerとそれに対するiteratorからgeneratorを作成する関数を実装してみる。 github.com エフェクトハンドラが受け取る限定継続を直ちに使用あるいは破棄してきた今までの例と違って、「限定継続を一旦保…

Effect.Deepで書かれたResumable ExceptionをEffect.Shallowで書き直す

OCaml 5.0のeffect handler機能はStandard Libraryに入っているEffectというモジュールを通して扱う。 このEffectというモジュールにはEffect.DeepとEffect.Shallowという二つのサブモジュールがあり、ほとんどの機能はこれらサブモジュールに入っている。 …

OCaml Effects Tutorialの演習「StateのHistory実装」をやってみる

前回に続いてState関連の演習問題を解いていく。 github.com 問題 今回は今までのStateの履歴をリストとして返すHistoryエフェクトの実装。 まずはSTATEシグニチャに追加: module type STATE = sig type t val get : unit -> t val put : t -> unit val his…

OCaml Effects Tutorialの演習「StateのPut実装」をやってみる

前回見たStateの実装はGetのみで、どちらかというとHaskellのReaderモナドに近いものだった。 Stateを更新するPutと、過去のStateの履歴を見るHistoryの実装が演習問題として提示されている: github.com 問題 今回はStateを更新する機能としてPutの追加をや…

OCaml Effects Tutorialの例題「Stateの実装」を追ってみる

OCaml Effect TutorialのStateの実装の話を見ていく。これはEffect.DeepとEffect.Shallowの違いを紹介するセクションの例題: github.com 実際に示されているコードはHaskellでいうところのReaderモナドに似たもので、Stateを読むGetは定義されているがPutは…

OCaml Effects Tutorialの第一演習「Exceptionの再実装」をやってみる2

前回の締めで書いたとおり、以下のException再実装は結果こそ期待通りに返ってくるものの、内容的には不満が残る: open Effect open Effect.Deep type _ Effect.t += Raise_exception : exn -> _ Effect.t let raise (e : exn) : 'a = perform (Raise_excep…

OCaml Effects Tutorialの第一演習「Exceptionの再実装」をやってみる1

前回に続いてOCaml Effects Tutorialをやっていく。 問題 github.com Exercise 1: Implement exceptions from effects ★☆☆☆☆ As mentioned before, effects generalise exceptions. Exceptions handlers are effect handlers that ignore the continuation. …

OCaml 5.0のEffect Handlerのチュートリアルをやりはじめた

12月16日にOCaml 5.0が正式にリリースされた。 目玉機能としてはMulticoreサポートで、以前はPythonなどと同じくGlobal Interpreter Lockがあって複数スレッドでCPUバウンドな計算が同時に実行できなかったのを、ガベージコレクタをはじめとしたランタイムの…