无法创建任意新对象,为函数调用参数化
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)
我想要 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)