我遇到一个问题,在方法类可选参数。
让我解释。 我有一个寻路类graph
(该沃利模块中)和一个他的方法shorthestPath
。 它使用一个可选参数。 事实是,当我致电(有或没有可选参数)这个方法返回ocaml的类型的冲突:
Error: This expression has type Wally.graph
but an expression was expected of type
< getCoor : string -> int * int;
getNearestNode : int * int -> string;
shorthestPath : src:string -> string -> string list; .. >
Types for method shorthestPath are incompatible
而shorthestPath
类型是:
method shorthestPath : ?src:string -> string -> string list
我同样试图使用选项格式的可选参数:
method shorthestPath ?src dst =
let source = match src with
| None -> currentNode
| Some node -> node
in
...
只有在我删除optionnal参数的情况下,停止ocaml的侮辱我。
预先感谢您的帮助 :)
这是不是很清楚你的情况是什么,但我想以下几点:
let f o = o#m 1 + 2
let o = object method m ?l x = match l with Some y -> x + y | None -> x
let () = print_int (f o) (* type error. Types for method x are incompatible. *)
使用位点(这里的定义f
),对象的类型是从它的上下文推断。 这里, o : < x : int -> int; .. >
o : < x : int -> int; .. >
该方法x
的类型被固定在这里。
对象o
后面定义是独立于的参数f
和具有类型< m : ?l:int -> int -> int; .. >
< m : ?l:int -> int -> int; .. >
而不幸的是这种类型与其他不兼容。
一种解决方法是给更多的输入上下文使用网站有关的可选参数:
let f o = o#m ?l:None 1 + 2 (* Explicitly telling there is l *)
let o = object method m ?l x = match l with Some y -> x + y | None -> x end
还是举的类型o
:
class c = object
method m ?l x = ...
...
end
let f (o : #c) = o#m 1 + 2 (* Not (o : c) but (o : #c) to get the function more polymoprhic *)
let o = new c
let () = print_int (f o)
我想,因为通常还有一类是事先声明这是比较容易。
这种高阶使用功能与可选参数之间的毛刺也恰好对象之外。 OCaml的尝试很好地解决它,但它并不总是可能的。 在这种情况下:
let f g = g 1 + 2
let g ?l x = match l with Some y -> x + y | None -> x
let () = print_int (f g)
是很好的类型。 太好了!
关键规则:如果OCaml中不能推断省略可选参数,试着给某些类型的情况下对他们作了明确规定。