用于将自定义对象作为参数传递的OCaml语法

时间:2009-02-01 22:28:50

标签: oop syntax ocaml

我正试图掌握OCaml语言语法,并且在应用一些OOP结构时遇到了一些麻烦。我在下面的代码中的目标是拥有一个继承自虚拟类foo的类栏。虚拟类包含三个虚拟方法,我希望将“播放器”对象的实例作为参数。当我编译下面的代码时,我得到错误:方法doThis类型'a - > 'b但是预计会有型球员。这意味着什么(记住,我是新手)以及如何纠正它?

谢谢!

class player =
object

end;;

class virtual foo =
object (self)
 method virtual doThis : player
 method virtual doThat : player
 method virtual notifyAll : player array
end;;

class bar (playersIn: player array) =
object (self)
 inherit foo
 method doThis (p:player) = Printf.printf "%s\n" "This!"
 method doThat (p:player) = Printf.printf "%s\n" "That!"
 method notifyAll (p:player array) = Printf.printf "%s\n" "Notifying!"
end;;

2 个答案:

答案 0 :(得分:2)

(我不知道OCaml,但我知道F#,他们是相似的,所以我希望我猜对了。)

尝试更改

method virtual doThis : player 
method virtual doThat : player 
method virtual notifyAll : player array

method virtual doThis : player -> unit
method virtual doThat : player -> unit
method virtual notifyAll : player array -> unit

答案 1 :(得分:1)

我认为之前的答案是正确的:有问题的方法需要将它们的类型作为返回单位的函数。

另一个更一般的建议:不要通过开始学习对象系统来开始学习OCaml。 OCaml中的对象可能很有用,但是您真正希望使用对象进行编程的情况很少见。在掌握核心语言之前,您将无法理解OCaml的对象系统。重点介绍如何使用基本代数数据类型(变体,元组,记录),普通参数多态(与您使用多态变体和对象看到的子类型相反)和模块(但不是仿函数)来解决问题。

在玩弄对象之前,先了解这些基本工具。使用其他语言的对象解决的大多数问题在没有它们的情况下在OCaml中得到最好的解决。