Arantium Maestum

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

2022-12-01から1ヶ月間の記事一覧

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

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

OCamlのlocally abstract typeに関するメモ2 (構文)

Locally abstract typeについてメモを続けていく。今回は構文について。 locally abstract typeに関する構文は4つある。そのうち3つは糖衣構文と言っていい。 基本構文 まず一番基本の構文 fun (type a) -> e ぱっと見では関数式のように見えるが、上記の…

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のlocally abstract typeに関するメモ1 (基本的な疑問)

「EffectでState実装」の記事で何故Stateエフェクトのためにpolymorphic locally abstract typeが使われる必要があったのかを掘り下げたいと書いた。それに関して@dico_lequeさんからこのようにご教示いただいた(ありがとうございます!): loopの型が再帰…

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バウンドな計算が同時に実行できなかったのを、ガベージコレクタをはじめとしたランタイムの…

TIL: OCamlで再帰とlet多相

これは相互再帰ではないですが、let main = id(3);let id(n) = n;のようなプログラムの時に、main: Int -> Int, id: a -> aと型推論したいのですが、現在(単相型推論)の場合構文解析時にトップレベルで定義された変数名を記録しておいて、型推論時に予め型環…

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

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