14263


次のようなmapメソッドが作れなくて困っています

[code]

    class ['a] my_ref (x_init : 'a) =
    object
      val mutable x = x_init
      method get = x
      method set y = x <- y
      method map : 'b. ('a -> 'b) -> 'b my_ref = fun f -> new my_ref (f x)
    end
    
[/code]

エラーメッセージは

[code]

    Error: The universal type variable 'b cannot be generalized:
           it escapes its scope.
    
[/code]

です。'b の量化を消すと通りますが、'a と 'b が同じ型になってしまいます。

元々の問題は js_of_ocaml の  
<https://github.com/ocsigen/js_of_ocaml/blob/2.6/lib/js.mli#L296>  
がポリモーフィックになってないのでバグレポートを送りたいのですが、js_of_ocaml 側がどうにか工夫すれば対応できる問題なのか知りたいのです。


CC BY-SA 3.0
2015-08-08T19:27:39.860
14191
2015-08-11T06:37:43.063
10849
question
ocaml
OCaml のクラスにポリモーフィックな map メソッドを持たせたい


これが通るとまずいというよりも、こういう型を許すと型推論ができなくなります。OCamlは再帰型を正則なもの(型パラメーターの変わらないもの)にすることで、型推論を可能にしています。上のような非正則なものまで許すとぐんと難しくなります。ICALPの20年前の言語理論の論文によれば、扱える可能性がありますが、現実的なアルゴリズムはありません。  
ちなみに、構造的な再帰型の代わりに、生成的なものを使うと、再帰の推論をする必要がなくなって、非正則な型が扱えます。Haskellの型クラスやGADTでそれを利用できます。


CC BY-SA 3.0
2015-08-11T06:37:43.063
14263
2015-08-11T06:37:43.063
10878
14191
answer