无法创建任意新对象,为函数调用参数化

Having trouble creating arbitrary new Object, parametrized for function call

我想要 OCaml 中的这种表达式

let wrapper obj f = fun raw -> f (new obj raw)

但是我得到一个编译器错误 Unbound class obj 但是那又怎样,为什么编译器不满足于创建这个函数,它只是说在这个对象上调用一个函数,它恰好采用一个初始化参数。

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

这是一个会话:

$ 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 是一种类型。不是一个值。

在其他语言中,classes 是值。但在 OCaml 中没有。

传递构造对象的函数。对于单参数 class 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)