質問
私は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 = ()
所属していません StackOverflow