OCaml

Lisp脳の弊害

OCamlは関数に渡す引数をスペースで区切るので、関数の引数に関数の戻り値を渡すときは、そいつを括弧で囲んでやらなきゃいけない。 funa (funb "hogehoge");; みたいに。括弧あったりなかったり考えるのがめんどい→全部括弧つければいいんじゃね?→それ何て…

飯吹いた

オレオレマージソートの一部 let rec merge_two ls1 ls2 ret = match ls1, ls2 with | x1 :: xs1, x2 :: xs2 -> if (comp x1 x2) then merge_two xs1 ls2 (x1 :: ret) else merge_two ls1 xs2 (x2 :: ret) | ls1, [] -> rev_append ls1 ret | [], ls2 -> rev…

ちょっとだけ最適化

OCamlでひきつづきソーティング。camloptに-pオプションをつけるとgprofでネイティブコードのプロファイリングができるので試してみたら、全体の40%の時間がGC関係のコードに使われていた。リストをガンガン組み換えていく作業が、かなりのゴミを発生させて…

引き続き最適化

String.compare と = だとString.compareのほうが遅いので、同じ値が多い場合は = で比較してからcompareするようにしたら早くなるかな、と思ってコードを書く。すると早くなった!しかし、よくコードを見ていると意図しているアルゴリズムとは別のアルゴリ…

OCamlの罠

ソフトウェアの授業の課題のソーティングプログラムをOCamlで書き始めてから、度重なるStack overflowに悩むこと1週間。ファイル読み込み時のstack overflowは普通に末尾再帰に書き直してうまくいったけど、2つのリストをマージする関数に2,000,000要素くら…

OCaml習作: マージソート

できた。arrayでデータを受け取ってlistで返すという謎仕様なのは、データの列を分割するのはarrayのほうが簡単で、分割してソートした結果を組み立てていくのはlistのほうが簡単だったから。 open Array open List let rec mysort comp arr = match arr wit…

OCamlをちょっとだけかじる

Schemeで好き勝手なことやってると、型推論みたいな制限がとても窮屈に感じる。多相型とか使えるようになれば違うのかな。