Arantium Maestum

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

OCaml

OCamlで存在型を試してみた (その2ーーファンクタ)

zehnpaard.hatenablog.com の続き。 前回は第1級モジュールを非常に綺麗に存在型に対応させられることが示せた。 しかし第1級モジュールを使わずとも、OCamlだとモジュールのシグニチャ自体が存在型的だ。(ただし微妙だが重要な差異もある) 今回はファン…

OCamlで存在型を試してみた (その1ーー第1級モジュール)

Types and Programming Languagesの24章の主題は存在型(Existential Types)である。 私は何回読んでもここでつまづく。 この章に到達するまでに部分型やら再帰型やら型推論やら全称型やら出てくるが、まあ難しくとも、なんとなくどういった言語機能に関連…

モジュールシグニチャの多重継承

前回の記事で module type ADD = sig type t val add : t -> t -> t val to_string : t -> string (* ここ *) end のようなシグニチャを書いたが、書いていて「うーん、これはおかしいな」と思った。 MULでto_stringが必要だったからといってADDのインターフ…

Expression ProblemにおけるOOPと関数型の対比について

Expression Problemという計算機科学・ソフトウェア工学の世界でそれなりに有名な問題がある。 この記事がいい感じにまとめていると思う: eli.thegreenplace.net Imagine that we have a set of data types and a set of operations that act on these type…

OCamlProのOCaml Cheat Sheets

OCamlProのブログを過去に辿っていたらこういう記事を見つけた: www.ocamlpro.com OCamlの構文の1ページまとめと、標準ライブラリの2ページまとめ。(出たのは2019年9月) 流石に構文に関しては(Objects & Classes関連以外は)知らないところはなかった…

Robert Harperの型クラス批判

Robert Harperのブログに(10年くらい前に)載っていたHaskellの型クラスに対する批判について@elpin1alさんに教えていただいたのでメモ。@elpin1al ありがとうございます! 型クラスとモジュール 言語の抽象化機構の中心的存在は何かと考えると、Haskellな…

open recursionなモジュールに型定義を持たせる(下改)

open recursionの記事に関して、より良い書き方があることに気づいたので書き留めておく。 あっちの記事ではシグニチャ二つを定義していて、GT.t = GT.s greet、NT.t = NT.s named greetと、GT.t型とNT.t型の形が違っていた: module type NT = sig type s t…

let rec内での多相とlocally abstract typeとpolymorphic type constraints

こういう記事を最近読んだ: tatta.hatenadiary.org (書かれたのは10年以上前だが) こういうコードは型チェック通らないよ、という話: let rec f x = x and g () = f 1 and h () = f true;; Line 3, characters 13-17: Error: This expression has type b…

OCamlでGADTを試してみた

なんとなく幽霊型がわかったので、その勢いに乗ってGeneralized Algebraic Data Typesについても調べてみた。 OCamlの言語機能としては: caml.inria.fr OCaml 4.00から導入された(ちなみに2021/3で最新版は4.12)とのことで、リリーススケジュールを見てみ…

OCamlで幽霊型を試してみた

open recursionなモジュールに型定義を持たせる(下) - Arantium Maestum のシグニチャ(シグネチャが正しいのか)についての話で module type S = sig type 'a t = 'a list end module M = struct type 'a t = int list end 的なコードを書いて「型が合わ…

OCamlのモジュールシグニチャ隠蔽しすぎてしまいがち問題

最近のopen recursion関連記事を書いていてふと思い出したのがこちらの記事: camlspotter.hatenablog.com モジュールを使ったプログラミングではプログラマが情報を必要以上に減らしたモジュール型を書いてしまって 型の同値性が知らず知らずに失われてしま…

open recursionなモジュールに型定義を持たせる(下)

ようやくopen recursion関連の話もひと段落になる(予定)。それなりにしっかりOOP継承っぽい機能を実装する。 前回の記事では module GreetF(Self : GT) : GT with type t = Self.t and type ctor = Self.ctor = struct include Self let addressee _t = "w…

open recursionなモジュールに型定義を持たせる(中)

今回は今まで散々参考にしてきたこの記事の内容に近い形でopen recursionを実装してみる: blag.bcc32.com 題材もまったく同一なのでパクリと言われても仕方ない・・・ 前回までの記事の内容を踏まえて少し整理したり、スタイルをいじったりしてあるくらい。…

open recursionなモジュールに型定義を持たせる(上)

前回はこちらの記事の内容を非常に簡略化した実装を探ってみた: blag.bcc32.com 最大の簡略化ポイントはモジュール内でtype t = ...のような型定義がなされないところで、それによっていろいろなところでモジュール間の型の整合性を満たすための制約を明示…

OCamlでも(オブジェクトもrefも使わずに)Open Recursionしたい!!・・・したい??

前回の記事をツイートしたら@dico_lequeさんからこういう話を教えていただいた: 多相バリアントでのやり方を考えるとファンクタ経由で非再帰で書いておいてmodule rec M = F(M)みたいな、と思ってググったところOpen Recursion with Modules | bcc32https:/…

OCamlでも(オブジェクト使わずに)Open Recursionしたい!・・・したい?

タイトルからも察していただいた方も多いと思うが、実用的な話はしません。あくまで「open recursionってなんだっけ」「こんな感じの開かれた再帰をOCamlで書いてみよう」という趣旨です。 Open Recursionってなんだ? ソフトウェアデザイン誌の2021年3月号…

TaPLの公式実装をduneでビルドする時にハマったこと

非常に限定された一部界隈では非常に有名なことで有名なTypes and Programming Languagesの公式サイトから、本に出てくる型システムの実装がダウンロードできる: www.cis.upenn.edu 以前も気になった部分を落として実装を覗いてみたりはしたのだが、コンパ…

js_of_ocamlでocamllex/menhir製パーサをJSにコンパイルする

私は趣味の言語処理系実装でocamllex/menhirというパーサジェネレータにお世話になることが多い。(このブログの過去記事を参照) js_of_ocamlは基本的にFFIを使わないライブラリだったらJavaScriptにコンパイルしてくれるはずなので、ブラウザでパーサが使…

js_of_ocamlでsnake作ってみた

OCamlでcanvasとLwtを使ってsnakeゲームを実装して、js_of_ocaml + duneでコンパイルしてみた: js_of_ocaml snake - compile to JS with command `dune build ./main.bc.js` · GitHub ポイントとしては ゲームロジックを比較的ステートレスな形でgame.mlに…

js_of_ocamlでゲームループを実装する方法二つ

js_of_ocamlでゲームループ的なものを実装する方法を考えてみたい。 ゲームループというのは、特定の時間デルタごとに何らかの計算と出力が行われるようなコードのことだ。今回は例によって最小構成ということで、1秒ごとにコンソールに"hello"と出力してい…

js_of_ocamlでHTMLにCanvasを追加して操作してみる

前回、前々回に続いてjs_of_ocamlの話。今回はDOM要素をコード側で作成する。 だいたいの元ネタはjs_of_ocaml公式サンプルのこれ: https://github.com/ocsigen/js_of_ocaml/blob/master/examples/minesweeper/main.ml ただし、この記事ではCanvas要素を作成…

js_of_ocamlとduneでDOMオブジェクトを操作してみる

前回に続いてjs_of_ocamlとduneを使ってみる話。今回はJs_of_ocamlが用意しているDOM操作のAPIと構文を使う。 ディレクトリ構成は前回と同一: . ├── dune ├── main.ml └── main.html main.htmlもまったく変わらず: <html> <head> <script type="text/javascript" src="_build/default/main.bc.js"></script> </head> <body> </body> </html> main.ml: open Js_of_ocaml let …

js_of_ocamlをduneでビルドしてブラウザで確認するための最小構成

ここ数日、ブラウザゲーム的なものを作りたくなってJs_of_ocamlを調べていた。 duneを使ってビルドできるのがわかったのだが、どういう構成でやれるのかは少し試行錯誤があったので、半ば備忘録もかねて記事にしておく。 この記事ではタイトルどおり最小構成…

OCamlでの相互再帰的なPolymorphic Variantに関するメモ

発端は@dico_lequeさんのこのツイート そういえばOCamlでtype t = [ atom | `List of t list | `DottedList of t list * atom ]and atom = [ `Int of int | `Vector of t array ]みたいなのはThe type constructor atom is not yet completely definedになっ…

型の違うCPS表現への変換

前回に続いてCPS変換の話。 前回はパーサから帰ってくるExp.t型のASTを同じExp.t型のCPS形式になっているASTに変換してからインタプリタに実行させていた。 インタプリタが(特にビルトイン関数について)関数の最終引数を継続だと認識するようになったので…

CPS変換はじめてみた

インタプリタ自作によってプログラミング言語の諸概念を学んでいく「Essentials of Programming Languages」の第5章、第6章はどちらも継続渡しスタイルについて語っている。 第5章は「インタプリタを継続渡しスタイルで書くとどうなるか」という話を掘り下げ…

Monadic Reflectionについて

kontlang作成の一つの目標は、この資料を元に: モナドをつくろう from dico_leque www.slideshare.net モナドをつくれるようにしてみたい、というものだった。 結果的にMaybe、ListやStateモナドを「つくって」みたのだが。 そもそもこのつくったものは本当…

めざそう言語処理系の沼 〜shift/resetへの旅 〜 その22 モジュール

実装したモナドやmap、fold_leftなどの関数をライブラリ化することで毎回定義し直さなくても済むようにしたい。 その準備段階としてモジュールを実装する。(ファイルから読み込む場合もモジュールとして扱いたいため) 具体的には (module [...])という構文…

merlinサポートのあるエディタでOCamlを書いていて微妙にイラっとくること

私は現在Visual Studio CodeでOCaml & Reason IDEを使っている。 全般的に非常に気に入っているのだが、一つ頻繁に起きて心をすこしだけささくれ立たせることがあるので書き出しておく。OCaml & Reason IDEプラグインはエラー検出などにmerlinを使っているの…

めざそう言語処理系の沼 〜shift/resetへの旅 〜 その21 やはり俺のListモナドはまちがっている。

前回こう書いた: ちなみにこの記事を書いている最中にListモナド実装にも重大なミスがあることに気づいた 今回はその話。 reifyの型 Representing Monadsのreifyとreflectの型定義: signature RMONAD = sig structure M : MONAD val reflect : '1a M.t -> …