「OCamlなどでは可能」は間違い
せっかく型推論があるのだから、指定などさせず、「xに対してisClosedとcloseが呼ばれているから、xの型は〜」ときちんと推論してほしいものだ。実際にOCamlなどでは可能なのだから。
Matzにっき(2007-11-22)
OCamlでできるのだから〜というのは,ちょっとまずい.
例にある,
let safe_close io = if not io#closed then io#close();;
は良いのですが,一般的には上手く行かないでしょう.OCamlで推論できる型はJavaとかで書ける型よりも,相当制限されていることは考慮に入れるべき.
interface A { void f(String s); }
< f : ∀ 'a <: String . 'a -> unit >
みたいになります(<:はSubtypingだと思ってください).こういう「メソッドの型が多相型になっている型」は,一般的に型推論することができません.*1
さらに,Rubyでの経験から言えば,OCamlのライブラリなんかには「推論できない型を持つような値」が注意深く排除されていることも,注意しておいたほうが良いと思う.例えば,RubyのArrayは,OCaml(あるいはML)の型推論では,型が付きません(collectに型が付かないし,問題はそれだけでも無い).もっとも,Scalaの設計者がどう考えているかはわかりませんが.