osiire’s blog

ふしぎなそふとやさん

OCaml

データ構造と手続きとモジュール分け

アプリケーション全体に渡って使われる基本的なデータ構造については、データ構造と手続きを別モジュールにした方がよい場合もあるんじゃなかろうか。具体的に言うと、四本値とか足の種類とか通貨ペアとか。 type candle = { (* ローソク足のデータ構造 *) u…

maybeモナドはDB読み込みにちょうどよい気がする

思い切って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…

0から小さい順に整数を返す関数をスレッドセーフに

今度は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を拡張した型を含…

C-c C-r

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 …

Functional Reactive Programming.

なんか楽しそうなもの発見。 http://erratique.ch/software/react

PEG関連調べもの

PEGパーサージェネレーター http://aurochs.fr/ パーサージェネレータについて比較 http://www.cocan.org/comparisons/parser_generatorどうやらOCamlではaurochs(なんて読むんだ?)一択の様子。

ビルド難しい

.cmaとか.cmxaとかのライブラリを作りたい。 ライブラリ名でpackしたい。 FFI用C言語の.oファイルもある。 という状況のときに、どうするのが正解なのだろう?ocamlmklibでは-packオプションが使えない。omakeとか使えばできそうだけど、配布ライブラリがoma…

Delimited Control

おおおおおおおおお。秒速で保存完了。 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

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…

private abbreviation type

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.

Unison

が思い出せなくて、「ocaml sync folder」でググっちゃったよ。出てこないし orz結局The humpの有名どころで調べたらあった。