3

oCaml を学習しようとしていますが、以下のプログラムが無効な理由について問題があります。

class myClass2 =
object
 method doSomething = Printf.printf "%s\n" "Doing something"
end;;

class myClass foo =
object
 val dMember = foo
 method doIt = dMember#doSomething
end;;

let mc2 = new myClass2;;
let mc = new myClass mc2;;
mc#doIt;;

プログラムをコンパイルしようとすると、次のエラーが表示されます。

File "sample.ml", line 6, characters 5-84:
Some type variables are unbound in this type:
  class myClass :
    (< doSomething : 'b; .. > as 'a) ->
    object val dMember : 'a method doIt : 'b end
The method doIt has type 'a where 'a is unbound

私が特に興味を持っている理由は次のとおりです。

val dMember = foo
method doIt = dMember#doSomething

無効です。任意の (つまり、任意の) ヘルプをいただければ幸いです。

4

2 に答える 2

6

OCaml オブジェクトは、署名に自由な型変数を持つことはできません。引数の型がfoo完全に指定されていないため、 の型myClassの自由変数によってパラメーター化する必要がありますfoo

class ['a] myClass foo =
object
 val dMember = foo
 method doIt : 'a = dMember#doSomething
end;;

この定義の型は

class ['a] myClass :
  (< doSomething : 'a; .. > as 'b) ->
  object val dMember : 'b method doIt : 'a end

これは、たとえば、通常のパラメータ化されたデータ型に似ています'a tree(を囲む括弧は'a、ちょっとした構文です)。ではなく の'aタイプであることに注意してください。foo#doSomethingfoo

# let x = new myClass (new myClass2);; 
val x : unit myClass = <obj>
# x#doIt ;;
Doing something
- : unit = ()
于 2009-01-26T05:08:26.537 に答える
1

タイプを宣言します。

class myClass (foo:myClass2) =
于 2009-01-26T00:03:43.467 に答える