OCaml
アプリケーション全体に渡って使われる基本的なデータ構造については、データ構造と手続きを別モジュールにした方がよい場合もあるんじゃなかろうか。具体的に言うと、四本値とか足の種類とか通貨ペアとか。 type candle = { (* ローソク足のデータ構造 *) u…
思い切ってpa_monadを実プロジェクトに初めて投入してみた。特に今回はDB周りの処理が多かったので、maybeモナドが大活躍。 module MaybeM = struct let bind m f = match m with None -> None | Some v -> f v let return v = Some v end データベースからs…
今度はconcurrent cellを使ってみる。 (* to compile, ocamlfind ocamlc -thread -package ccell -linkpkg sf.ml *) let (@@) f g = f g let (+>) g f = f g let tee f x = ignore (f x); x open Ccell open Event let num = let m = Mvar.init_make 0 in fu…
多相バリアントってとても簡潔に便利なので、すぐに「次の要望」が出て来てしまう。例えば、型のフィルターが欲しい。 # type x = [`A | `B];; type x = [ `A | `B ] # let filter = function #x -> true | _ -> false;; val filter : [> x ] -> bool = <fun> # l</fun>…
多相バリアントとして定義している型xとそれを内包するモジュールがあって、ファンクター経由でそのモジュールを使う為に、そのモジュールのシグネチャーを定義したい。もちろん型xは抽象化して。ところが、そのモジュール内にごくまれに型xを拡張した型を含…
tuareg-modeにC-c C-rで選択部分をトップレベルで実行できる機能がある。evalっぽくて何気に便利。部分的にテストもできるし。
OCamlのlet多相は、 値は多相で処理。それ以外は単相。 単相が多相の部分型になってるときは、多相を回復。 という二段階。で、この部分型判定には、単相型がcovariantな位置にのみ出現するかどうかを調べる。covariantな位置というのは、要するに関数型の右…
言葉にすると訳分からんね。 class virtual ['me] sprite = object ( self ) val cs : 'me sprite list = [] method add_children c = {< cs = c :: cs >} method children = cs method virtual show : unit method print = self#show; List.iter (fun c -> …
そうかっ、コアーションしても自分自身の事は忘れないんだ!考えてみたら当たり前だけど、これは使える! open Printf class type point = object method x : int method y : int method print : unit end class color_point = object (self) val x = 0 val …
なんか楽しそうなもの発見。 http://erratique.ch/software/react
PEGパーサージェネレーター http://aurochs.fr/ パーサージェネレータについて比較 http://www.cocan.org/comparisons/parser_generatorどうやらOCamlではaurochs(なんて読むんだ?)一択の様子。
.cmaとか.cmxaとかのライブラリを作りたい。 ライブラリ名でpackしたい。 FFI用C言語の.oファイルもある。 という状況のときに、どうするのが正解なのだろう?ocamlmklibでは-packオプションが使えない。omakeとか使えばできそうだけど、配布ライブラリがoma…
おおおおおおおおお。秒速で保存完了。 http://okmij.org/ftp/Computation/staging/circle-shift.pdf http://lambda-the-ultimate.org/node/3112
let id x = x let (@@) f x = f x let ($) f g x = f (g x) let (!$) = Lazy.force let (+>) f g = g f let curry f x y = f (x, y) let uncurry f (x, y) = f x y let flip f x y = f y x let rec forever f x = let v = f x in forever f v let spawn_loop…
とあるコードを読んでいて、@?でバッファをフラッシュしているところがあって、ちょっとハッとした。 fprintf std_formatter "hello world@?";; そういえば、pretty printerにそんなのがあったなーと。
The parallel GC project has made a first proof-of-concept of a parallel GC in OCaml. It's an exciting step, but it's not clear to me where it goes from here, although we do expect to see a release of their current prototype. The performanc…
3.11のChangesには、 Introduction of private abbreviation types "type t = private ", for abstracting the actual manifest type in type abbreviations. と書いてある。意味は今までのprivate typesと同じなんじゃないかなー。private指定された型は、…
マルチスレッド関連で色々遊んでいると、メインスレッドが取り残されて待っているだけでよい時があります。そんなとき、 Thread.delay 10. とかやると、なぜか他のスレッドの動きまで止まってしまいます。(メインスレッドはGCの関係で特別なのかなー?)そ…
当たり前だけど、微妙に気づかなかった・・・。 # type r = { a : int; b : float; };; type r = { a : int; b : float; } # (snd (1, { a = 2; b = 3.0 })).b;; - : float = 3.
が思い出せなくて、「ocaml sync folder」でググっちゃったよ。出てこないし orz結局The humpの有名どころで調べたらあった。