下面是两个例子,它们非常简化,并且这种简化形式没有实际意义,但它有助于我理解使用这两者的工作原理:
let test x = object (self)
val x = x
method testme = x == self
end in
Printf.printf "printme: %b\n" (test test)#testme;;
let test x = object
method testme = (==) x
end in
Printf.printf "printme: %b\n" ((test test)#testme test);;
第一个例子不起作用,而第二个例子不起作用。第一个论点是关于x
和test
的类型不相容,但我不明白它是如何得出x
的类型是< testme : bool > -> < testme : bool >
的结论。为什么不只是< testme : bool >
?
答案 0 :(得分:2)
这就是我所看到的:
# let test x = object (self) method testme = x == self end;;
val test : < testme : bool > -> < testme : bool > = <fun>
实际上,test
是一个函数,而不是一个对象。它具有基本OCaml函数定义的形式。您说x
是一个函数,但x
是test
的函数参数。因此x
的类型为< testme: bool >
。