我想在OCaml
中使用这种表达方式let wrapper obj f = fun raw -> f (new obj raw)
但是我得到了Unbound class obj
的编译错误,但是为什么,编译器为什么不满足于创建这个函数,只是说在这个对象上调用一个函数,恰好采用了一个init arg。
答案 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。