質問

私は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

は無効です。任意の(と私が意味するのいずれかの)は助けが高く評価されます。

役に立ちましたか?

解決

のタイプを宣言します:

class myClass (foo:myClass2) =

他のヒント

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

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周りの括弧は構文嫌なもののほんの少しである)foo#doSomething、例えば、通常のパラメータ化dataypesと同様です。 <=>は<=>のではなく、<=>のタイプであることに注意してください。

# let x = new myClass (new myClass2);; 
val x : unit myClass = <obj>
# x#doIt ;;
Doing something
- : unit = ()
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top