Object 创建任意新对象时遇到问题,已为函数调用参数化
我想要OCaml中的这种表达式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
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不只是一个占位符吗?我们可以从类型签名判断所提供的对象是否会统一……我仍然不相信。