无法创建任意新的Object,参数化为函数调用

时间:2015-10-31 02:42:48

标签: object ocaml

我想在OCaml

中使用这种表达方式
let wrapper obj f = fun raw -> f (new obj raw)

但是我得到了Unbound class obj的编译错误,但是为什么,编译器为什么不满足于创建这个函数,只是说在这个对象上调用一个函数,恰好采用了一个init arg。

2 个答案:

答案 0 :(得分:2)

传递构造对象的函数。对于单参数类foo,您可以使用new foo来获取该函数。

let wrapper make_obj f raw = f (make_obj raw)

class foo (x) = object
  method y = x + 1
end

let answer = wrapper (new foo) (fun o -> o#y) 2

在这里,wrapper有一个非常普遍的类型,根本没有提到对象。如果要明确指出对象构造函数是参数,可以使用注释来限制类型:

let wrapper (make_obj: (_ -> < .. >)) f raw = f (make_obj raw)

答案 1 :(得分:0)

一种看待这种情况的方法是OCaml类是一种类型,而不是一种值。所以你不能在OCaml中编写一个接受类作为参数的函数。

这是一个会话:

$ ocaml
        OCaml version 4.02.1

# class abc = object method m = 12 end;;
class abc : object method m : int end
# abc;;
Error: Unbound value abc
# let f (x: abc) = x#m ;;
val f : abc -> int = <fun>
# f (new abc);;
- : int = 12

如您所见,abc是一种类型。不是价值。

在其他语言中,类是值。但不是在OCaml。