今日は一転、真面目な話です ある程度 OCaml プログラミング経験がある皆様は、 int, string 等の基本型の比較には多相比較ではなく、単相比較を使うべし。最適化された比較関数が使われ、早くなる という教をご存知かと思います。正しいです。でも、そこに実は落とし穴が: 実は、型だけ単相にしてもダメで、引数を全適用した形で使用しないと、最適化されない!! (OCaml 3.11.2 現在。将来は知りませんよ!!) もしこれをご存知でしたら、もう読んでいただく必要はありません。 第一のポイントは結構知られているようなのですが、実は第二のポイントはあまり知られていない様なのです。ざっと私が普段使っているOCaml のオープンソースライブラリを検索してみましたが、最適化された比較関数を使おうとしているが、第二のポイントを知らなかったため、実はされていなかった、というコードを結構見つけてしま
Camel spotter: Oh, it was extremely interesting, very, very - quite... it was dull; dull, dull, dull, oh God it was dull. Sitting in the Waterloo waiting room. ... OCaml module language is powerful. So extremely powerful that you can be lost yourself easily inside huge OCaml projects with tons of modules. Spotting the definition of a variable is sometimes "extremely interesting". Let's see such a
参考:人材獲得作戦・4 試験問題ほか: 人生を書き換える者すらいた。 Lv4に評価されるためには、最短性の完全なチェックが必要だったのでCoqで証明してみた。 まず、accessiblesという関数を定義し、以下の性質を証明した。 ここでplengthはパスの長さを計る関数で、Path x pはpがxを起点としたパスであるという述語。endofはパスの終点を求める関数。 Fixpoint accessibles (start : node) (len : nat) : list path := match len with | O => (PUnit start) :: nil | S n' => div_equiv path_equiv_dec @@ (flat_map expand @@ accessibles start n') end. この関数はstartから始まってlenの長さ
あと、やはりネットワーク周りなどI/Oの多いプログラムの書きにくさが課題になっている印象。関数的なI/OはFRPで解決できそうな気がするんだけど調べてない。そろそろFRPをちゃんと理解したいなー。 Parsec 3活用事例: Keepalived構文チェッカ - maoeのブログ なんて書いてから早1ヶ月半、ようやくFRPが掴めてきたのでわかったことをまとめてみます。 Reactive programmingって何? FRPの前に、一般的にwikipedia:en:Reactive programmingと呼ばれるパラダイムについて触れておきます。reactive programmingとは疑似言語を使ってかなーり大雑把に説明すると、 var a = 1 var b = a + 1 a = 10 // aを書き換える print b // => 11print bの出力は2ではなく11です
http://www.haskell.jp/cgi-bin/haskell.cgi?2009%C7%AF%CB%BA%C7%AF%B2%F1 ほんとにあんたなんでここにいるの?みたいな子ですみません。 感動したこと↓ Prelude> "あいうえお" "\12354\12356\12358\12360\12362" 隔世の感があります。(難しい話は全然分からなかったらしい) ↑とは直接関係ないのですが、私は何年かに1度は無限リストが無いと死ぬ病にかかります。今更感炸裂ですので耳タコの方は戻るボタンをお押しください。 所謂(「ハンドル」または「OOP」風の)ストリームに対する無限リストのメリットはいろいろあると思われるのですが キューとかバッファいらない スレッド使わなくても生成側も処理側もどちらも自分がmainのつもり風に書ける ungetcまたはシーク操作あるいは破棄操作の類いがいらない
前にも触れたけど、これ((http://conal.net/papers/simply-reactive/)を元にOCamlでFRP(っぽいもの)が実現できる機能をconcurrent cellに追加した。ほぼできたと思う。あとはテスト(バグがないか、メモリリークはないか、速度はどうか)といったところ。もし興味がある強者がいらっしゃったら、 svn checkout svn://svn.forge.ocamlcore.org/svnroot/ccell からチェックアウトして下さいまし。 とにかく、このFRPの実装は落とし穴が多かった。最初は簡単かもと思って始めたのに、まず論文に書いてあるHaskellの実装をOCamlに直すところで躓き(主に止まらない)、Futureの意味を理解するのに躓き、論文のままだとpull評価の値を評価しないと延々とメモリが食われる問題にどう対処するか悩み(しか
OCaml は現時点でマルチコア対応じゃないので、マルチスレッドにしてもマルチコアの恩恵を享受することができません。ですので、OCaml で thread を使う旨みというのは、関数を並行に走らせる事ができるってことだけです。でも並行に走らせる事が出来ればいろいろ便利ですよね。 でもマルチスレッドプログラミングで一番困るのが排他制御。これを上手くやってやらないと、OCaml で type safe なはずなのに、 segfault という事になります。もちろん OCaml プログラマは普段から type safety に慣れきっているので、 type system で保障されない排他制御を完璧に書けるはずがないのです。心が折れます。 そこで、light weight thread。こいつは実は thread じゃありません。要は同一スレッド内でタスク関数をとっかえひっかえ asynchro
OCamlのコンテキストスイッチのタイミングを調べた。 OCaml では OSネイティブのスレッド (pthread) を使える。 しかし、OCamlのランタイム内で同時に走るネイティブスレッドは1本だけ、という制限がある。OCamlはスレッドセーフなGCを備えていないためだ。 スレッドはプログラムを構造化して書くために使うツールと割り切ろう、ということらしい。 OCamlの(シングルスレッドの)高いパフォーマンスの代償だろうか。 いずれコンカレントGCはサポートされるだろうと期待するけれど*1、待ってられないので現在の話を考えよう。 動機 : スレッドのコンテキストスイッチの頻度 OCamlで書いたバイナリとCやJavaを協調動作させるとき、この1スレッド制限がどう効いてくるのかすこし気になっている.たとえば 1つのスレッドが OCaml側で走っているときに C to OCaml のコー
On F# By chance I have got interested in F#, although I have been and will be a happy O'Caml programmer. In fact I have never imagined that I would seriously try to use programming languages which do not support polymorphic variants. They are too useful to miss! Yet of cource it is useful to learn other languages and I will keep possibly biased notes on F# as long as I have good appetites. Please
OcaIDE: an O'Caml plug-in for Eclipse
Syntax extension for Monads in Ocaml Jacques Carette, Lydia E. van Dijk and Oleg Kiselyov Summary This Camlp4 extension provides some syntactic sugar to beautify monadic expressions. Example: A simple but realistic example of the use of a list monad looks like this bind [1; 2; 3] (fun a -> bind [3; 4; 5] (fun b -> return (a + b))) where we assume the appropriate definitions of the functions "bind"
思い切って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 データベースからselect文でデータを取ってこようとすると、列の値がoptionになる(nullの可能性もあるから)ので、本来はパターンマッチしてSomeの中身を取り出さなきゃならない。でもmaybeモナドならそんな事殆ど気にしなくてよくなる。次のコードは実際に使ったコードの一部。 select original_db (* select文実行 *) "select distinct maker_code, syasyu_code, syasyu,
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く