「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);
}

というJavaの型は,OCaml風の構文で書くと,

< f : ∀ 'a <: String . 'a -> unit >

みたいになります(<:はSubtypingだと思ってください).こういう「メソッドの型が多相型になっている型」は,一般的に型推論することができません.*1

さらに,Rubyでの経験から言えば,OCamlのライブラリなんかには「推論できない型を持つような値」が注意深く排除されていることも,注意しておいたほうが良いと思う.例えば,RubyのArrayは,OCaml(あるいはML)の型推論では,型が付きません(collectに型が付かないし,問題はそれだけでも無い).もっとも,Scalaの設計者がどう考えているかはわかりませんが.

*1:と言うと乱暴なんだけど,少なくとも「健全で完全」な型推論アルゴリズムは構築できないはず.