当前位置:  开发笔记 > 编程语言 > 正文

基本的OCaml OOP问题

如何解决《基本的OCamlOOP问题》经验,为你挑选了1个好方法。

我正在尝试学习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

是无效的.任何(我的意思是任何)帮助表示赞赏.



1> Chris Conway..:

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#doSomething,而不是foo.

# let x = new myClass (new myClass2);; 
val x : unit myClass = 
# x#doIt ;;
Doing something
- : unit = ()

推荐阅读
乐韵答题
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有