2023-01-01から1年間の記事一覧
最近考えるきっかけがあったので書いておく。 一般的にmapやfoldは再帰を使って実装でき、そして再帰に比べて制約がかかっていて表現力が落ちるとされている。むしろその制約があるからこそそのコードの「何をしたくて何をしないか」という意図が明確になる…
ツイッターでalgebraic effectsについての話題を探していたら以下の記事を見つけた: zenn.dev Haskellで書かれた「Algebraic Effectsのある処理系の作り方」のRust移植だ。@Nymphiumさんの書かれた元の記事はこちら: nymphium.github.io この記事は出た時…
OCaml 5.0にeffect handlerが入った理由の一つである、並行処理をdirect styleで記述できるasync/awaitの実装をやってみる。 この演習: github.com 演習用のコード・サンプルはこれ: github.com Schedulerのインタフェース この演習ではasync/awaitといっ…
前回の記事で書かれたコードに到達するまで、いくつかのアプローチで漸進的に単純化されていったのでその経緯についても書いておく。 第一案 そもそも「相互再帰を分割するサンプルコードを書こう」と思い立ったのはComposable Interpreterで使った「すべて…
タイトルどおり、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…
前回の記事に書いたとおり、今回はこのExtensible Interpreterの枠組みを使うとExpression Problemを解決できるということを見ていく。 Expression Problem Expression Problemについては以前この記事で書いた: zehnpaard.hatenablog.com かいつまんで説明…
前回のコードをベースに「任意のExtensionハンドラを変更なしで組み合わせて作る」Composable Interpreterを実装する。 問題 前回のコードの何がComposabilityを阻害していたかというとインタプリタを拡張するハンドラが、拡張前のインタプリタ関数を使って…
前回「任意のハンドラを組み合わせてインタプリタを作るといったComposabilityも持たせることができる」と書いた。今回はそのComposable Interpreter実装への準備段階として、前回のコードをリファクタしてeval関数とeffect handlerをある程度分離した形にす…
ツイッターでOCamlのEffect Handlerの話題を漁っていたらこのようなツイートを見つけた: Algebraic Effects (Multicore OCaml)を使ってExtensible Interpreterを実装する例:https://t.co/b1Tu4pys6dポイントはeffect handlerにcontinuationが渡ってくる (=…
前回の終わりに書いた通り、Effect.Shallowを使って「generatorが作成されてまだ要素を返していない」状態を特殊ケース化せずに処理できるようにする。 今回のコード type ('elt, 'container) iterator = ('elt -> unit) -> 'container -> unit type 'elt ge…
前回に続いて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の演習問題として、任意のcontainerとそれに対するiteratorからgeneratorを作成する関数を実装してみる。 github.com エフェクトハンドラが受け取る限定継続を直ちに使用あるいは破棄してきた今までの例と違って、「限定継続を一旦保…