Object 创建任意新对象时遇到问题,已为函数调用参数化

Object 创建任意新对象时遇到问题,已为函数调用参数化,object,ocaml,Object,Ocaml,我想要OCaml中的这种表达式 let wrapper obj f = fun raw -> f (new obj raw) 但是我得到了一个编译器错误,Unbound class obj,那么,为什么编译器不满足于创建这个函数,它只是说在这个对象上调用一个函数,而这个对象恰好带有一个init arg。一种看待这个问题的方法是OCaml类是一个类型,而不是一个值。因此,不能在OCaml中编写接受类作为参数的函数 下面是一个环节: $ ocaml OCaml version

我想要OCaml中的这种表达式

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

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

一种看待这个问题的方法是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
$ocaml
OCaml版本4.02.1
#abc类=对象方法m=12结束;;
类abc:对象方法m:int end
#abc;;
错误:未绑定值abc
#设f(x:abc)=x#m;;
val f:abc->int=
#f(新abc);;
-:int=12
如您所见,
abc
是一种类型。没有价值


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

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

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)
让包装器(make_obj:(-><…>)f raw=f(make_obj raw)

为什么我们不能说这个函数适用于所有使用一次初始化的对象?obj不只是一个占位符吗?我们可以从类型签名判断所提供的对象是否会统一……我仍然不相信。