在OCaml的方法可选参数(Optional argument in a method with o

2019-10-18 07:21发布


我遇到一个问题,在方法类可选参数。

让我解释。 我有一个寻路类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的侮辱我。

预先感谢您的帮助 :)

Answer 1:

这是不是很清楚你的情况是什么,但我想以下几点:

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中不能推断省略可选参数,试着给某些类型的情况下对他们作了明确规定。



文章来源: Optional argument in a method with ocaml