OCaml

4.02 予習その2 新しい module type、 (module M)

OCaml 4.02 に追加された新しいモジュール型、 (module M) が結構いけているのです。OCaml である既存のモジュールの型は?というと、 module type of M というのがあって、 module type of Unix とやると Unix モジュールの signature を貰えるというもので…

大事なことは全部MLが教えてくれた 〜 Apple の Swift の mutability 周りの件を理解する

開発者アカウントに金が出せない貧乏人の方々が、次の Apple の Swift のコードの挙動がわからない、というので盛り上がっております: let a = [1,2] // a = [1,2] var b = a; // b = [1,2] b[1] = 3; // a = [1,3] b = [1,3] b.append(5); // a = [1,3] b =…

OCaml MinGW でがんばる時メモ

Wodi に依存する場合は死ぬまで依存。上手く行かなくなっても泣かない。Wodi に依存しない場合 OCaml の Windows ビルドは三種類あり、それぞれ特性が違う。これは Native MinGW での話である。他人の Windows での OCaml の話を聞くときにはまずどの種類か…

OCaml + Mingw bigarray.cma issue

Summary: OCaml+Mingw or Flexlink need to be upgraded for newer cygwin mingw gcc(I dunno which one exactly) so that -static-libgcc can be given to the link of dllXXX.dll. So far, a tentative fix in OCaml side is to change config/Makefile:FL…

ソウルフル小話: 型付き関数型言語と C++ は同時に使ってはいけない

いやまじで使っちゃいけないです。三年前こういうことがあったんです。 Haskell と C++ を使っているコードなんですが、 突然ビルドができなくなる。さっきまで上手く行っていたのに、意味不明な C++ のエラーがゴボゴボ出てくる。 git status や hg status …

単一化で人間の気持ちが失われるんだ!というサビシイ話

OCaml 演習とかやってひぃひぃ言っている人対象ですぅ。わからない人にはわかるように書いていませんから、「さっぱりわからない」とか呟く前にスルー推奨です type t = int list list list let x : t = [[[1]]] let y = x @ x をコンパイルすると、 x は t …

A memo for installing Wodi32 on Vista

I got a trouble to install wodi32 on my Vista box.bsdtar hang saying: 5 [sig] bsdtar 2428 get_proc_lock: Couldn't acquire sync_proc_subproc for(5,1), last 7, Win32 error 0The real trouble is, this bsdtar process is a real badass. You canno…

OutsideIn(X) と OCaml

Haskell の実装 GHC の新しめのバージョンでは 多相let の型付けが今までの HM (Hindley Milner) 方式から新しい OutsideIn(X) に変わっています。(言語拡張でどうたらあるらしいがシラネ) 詳しい動機はまあいろいろあるみたいですが GADT とか Type family …

金融と OCaml

関数型言語というと金融で流行っている、特に OCaml と言えば金融御用達関数型言語として語られることも多い。金融業界に関数型言語を持ち込み成功した最初の二社 LexiFi とJane Street Capital は共に OCaml を採用し、そして二社とも今日成功しているから…

OCaml がおかしくなったとき

違うバージョンのコンパイラを違うバージョンのライブラリセットに対し間違って使ってしまった コンパイラが変われば元のコンパイラで作成したオブジェクトやライブラリは新コンパイラではまず使えない clean せよ which ocaml / which ocamlc / which ocaml…

Launch CamlP4 with some help of OCamlFind

I do not know why but there is no ocamlfind camlp4o. Here is a tip for this: #!/bin/sh # \ mark is actually a backslash. camlp4o \ `ocamlfind query -r -i-format $*` \ `ocamlfind query -r -a-format -predicates syntax,preprocessor $*`I named…

すぐできるキモイ OCaml 改造メモ

糖衣構文で可能 (P4 マター) 関数にする (.[1]) (.[]) (.(1)) (.()) (.field) (#meth) (,,,) どんどん関数にする (.[] もっともっと関数にする {.. with x = e} など (.. が無いとさすがに怖い) 糖衣構文ではできない (コンパイラ改造コース) open M の名前…

OCaml 4.01.0 変更点

スペルチェック 識別子のミスタイプがあった場合訂正を提案します: # List.lentgh ;; Characters 0-11: List.lentgh ^^^^^^^^^^^ Error: Unbound value List.lentgh Did you mean length? 個人的には、はあだから?と言った感じかと思っていたのですが、今の…

オブジェクトファイルのリンク順

OCaml のオブジェクトファイル(.cmo, .cmx)を並べる順番には意味がある。 順番を間違えると: Reference to undefined global Hogehoge などと言われるので注意。 a.ml: let x = 1 b.ml: let y = A.x c.ml: let z = B.y というソースがあったとする。 a.ml, b…

List の ; と tuple の ,

List, Array, Record などの要素区切りの ; はとても奇妙に見えるかもしれない。 OCaml を使っている人でもあまり意識していないのだが、実は一貫性がある。 A ; B は B ; A と書いても型は変わらない A , B は B , A と書くと型が変わる場合がある 例: prin…

例外の効率: OCaml の例外は早い、は本当か

例外による再帰関数からの大域脱出は OCaml ではランタイムのペナルティはほとんどない、 という事になっている。 try with を書いてそれでもコードが読みやすければ使って構わない。 が、実際のところ、どうか。 -g を付けてコンパイルした場合、遅くなる。…

CamlP4 が何やっているか知りたいときどうするか

一番よいのは CamlP4 が何を出力しているか見ることです。例として OCamltter の Twitter API の JSON 表現と OCaml の型との間を取り持つ api11.ml がどうなっているか見てみましょう。 type 'a t = { previous_cursor : Json.t; next_cursor : Json.t; nex…

GODI 終了宣言事件に関して

A rough summary in English which might sound too more direct than the original Japanese version. Sorry if you feel attacked: pro came in and did great jobs, while a volunteer felt burnt out. Probably this kind of things happens in the worl…

Real World OCaml が出ました

一昨年から少しずつ書かれていた OCaml プログラミングの本、 Real World OCaml (以下 RWO)がついに public beta になり公開されました。 ( https://realworldocaml.org/beta1/en/html/ ) 版元の O'Reilly ではこのベータ版の状態の e-book が 今なら安く手…

OCurl or ocaml-curl 0.5.3 has a bug around set_postfields

A personal memo. Probably useful for the others met the same problem.Symptom: POST data set by set_postfields are often sent with garbages at the end.Cause: a typical bug of forgetting copying \0 in C codeWorkaround: In 0.5.3, set_postfiel…

1モジュール1データ型主義

OCaml の「1モジュール1データ型スタイル」。このプログラミングスタイルは21世紀に入ってからモジュールを多用する OCaml コミュニティで流行りだしたもので私も採用しています。源流は SML 方面にあると聞きましたが…私自信は確認していません。要出典です…

OCaml 開発環境について ~ コンパイラに付属しない非公式ツールたち

2012年12月での関数型言語 OCaml コンパイラ一式には入っていない 内部もしくは外部開発されたのツール群の紹介を行う。 例によって多岐に渡るので、一つ一つの詳しい説明は行わない。 各ツールの細かい情報はそれぞれのドキュメントを参照して欲しい。 リン…

Meta_conv による OCamlデータ型 と 樹状データ の相互変換自動生成

Web にアクセスするプログラムを書いていると良く JSON というデータを扱う ことがあります。JSON とは世間で何と言われているかわかりませんが OCaml では: type t = | String of string | Number of float | Object of obj | Array of t list | Bool of bo…

OCaml 開発環境について ~ OCaml コンパイラソース付属ツール

2012年12月での関数型言語 OCaml コンパイラ一式をインストールした際に付属する「公式」ツール群の紹介を行う。多岐に渡るので、一つ一つの詳しい説明は行わない。各ツールの細かい情報はそれぞれのドキュメントを参照して欲しい。 もし知らないツール名が…

OCaml 4 に付属のコンパイラSDKでコンパイラを改造する

OCaml 4 に付属する compiler-libs を使うと、以前より手軽に OCaml コンパイラを改造することができます。(できないこともありますが)https://bitbucket.org/camlspotter/compiler-libs-hackに、SML スタイルの多重定義を実現するコードと解説記事を置いて…

ML系言語の型エラー報告を改良する

さて、お約束していた OCaml の型エラーメッセージ改良のための改造、ある程度形になりましたので、公開します。 hg clone -b typeloc https://bitbucket.org/camlspotter/mutated_ocaml ビルドは configure の後、 make core coreboot world です。インスト…

ウェブブラウザで関数型プログラミング! js_of_ocaml

js_of_ocaml が熱い。 Google の Dart とか、そんな場合じゃない!! OCaml で書かれたプログラムがなぜか JavaScript に変換され、それがブラウザで動く。 JS で型がついていないオブジェクトでも何となく型をつけて OCamlで型安全に呼び出せる! 既存の JS ラ…

OCaml-indent: OCaml で書いた OCaml ソースコードインデンタ

OCaml のソースコードのインデント整形には Emacs なら ocaml-mode, tuareg-mode, Vim なら ocaml.vim(?) や omlet.vim があります。便利です。でもどうも細かい部分が自分のスタイルと違ったり、特殊な改行をするとボロボロッとおかしなインデントをしてき…

OCaml search で欲しいものメモ

型情報から求めている関数を探すというのはそもそものアイデアは http://www.dicosmo.org/ResearchThemes/ISOS/ISOShomepage.html この辺を参照してほしいんですけど、型付き関数型言語でのプログラム開発の超強力なツールになっていて、OCamlBrowser, Hoogl…

Monad にしちゃう functor を通して今時の OCaml モジュールプログラミングを俯瞰

これは私用の覚え書きを適当に整形したもの(というか Sphinx で hatena 記法にしただけだけど)。だから他の人が読んで判るように全く書いていない。OCaml や ML のモジュールシステム、 value polymorphism、さらには relaxed value polymorphism、そして日…