http://d.hatena.ne.jp/KeisukeNakano/20070314/1173846972
なるほど、参考になります。でも 2 番目の

  • apply_3 で f を呼ぶときにはオプショナル引数を省略しているから,apply_3 f は int 型.
  • apply_3 で f を呼んでも部分適用かもしれないので,apply_3 f は ?i:int -> int 型.

のところがまだよく分かっていません。

# (fun ?i:(i=0) x y -> x) 7;;   
- : '_a -> int = <fun>

の場合 ?i は消えてますが、そういう問題ではないのかな。
メイリングリスト似たような問題があったが、微妙に違うみたい。

オプション引数

$ocaml
        Objective Caml version 3.09.3

# let f x y = failwith (x^y);;
val f : string -> string -> 'a = 
# (fun g -> g "foo" "bar") f;;
Exception: Failure "foobar".

OK。

# let f ?(a=0) x y = x ^ y;;
val f : ?a:int -> string -> string -> string = <fun>
# (fun g -> g "foo" "bar") f;;
- : string = "foobar"

これも OK。しかし次でエラーになる。

# let f ?(a=0) x y = failwith (x^y);;
val f : ?a:int -> string -> string -> 'a = 
# (fun g -> g "foo" "bar") f;;
This expression has type ?a:int -> string -> string -> 'a
but is here used with type string -> string -> 'b

うーん、これは通ってもいいと思うんだけどなあ。次のようにすると通る。

# (fun g -> g "foo" "bar") (f : ?a:int -> string -> string -> string);;
Exception: Failure "foobar".

infix to postfix

真面目にパースしたら 336B で絶望したので、あんまり真面目じゃないので参加。それでも 318B とさほど変わらず。もうちょっと縮むような気もするが…。
あと echo の 29B は謎すぎです。

!

ksk さんが even lines の記録を縮めてるのを見て、えー!と思ったが、昨日書いたように演算子を使えばいいんですね。定義できるのは二項演算子だけだと思っていたので盲点でした。
というわけでネタバレ。

let rec(!)r=r();print_endline(r());!r;;!read_line

これで 49B。ところで (!) 以外で一文字の前置演算子ってあるんでしょうか。(-)はそうだけど自分で定義できないっぽい?