OCaml:带有标签和可选参数的函数应用程序

时间:2015-03-29 20:57:05

标签: ocaml

我正在编写一个函数,其中x作为可选参数,y,z作为标记参数。假设格式类似于concat1。我意识到当我尝试concat1 y:"hello" z:"world"时它实际上并不应用该函数,而是返回一个函数。

let concat1 ?(x = " ") ~y ~z = y ^x ^ z
let concat2 ?(x = " ") y z = y ^x ^z
let concat3 ?(x = " ") y ~z = y ^ x ^z
let concat4 ?(x = " ") ~y z = 

应用这些不同形式的结果是

concat1 ~y:"hello ~z:"world" -> ?x:string -> string <fun>
concat1 "hello" "world" -> "hello world"
concat2 "hello" "world" -> "hello world"

concat3 "hello" -> z:string -> string = <fun>
concat4 "world" -> y:string -> string = <fun>

如何让concat1执行?我不想在没有标记参数的情况下调用该函数。

1 个答案:

答案 0 :(得分:2)

以下是language definition

中的文字
  

如果传递了未标记的参数,并且其相应参数前面有一个或多个可选参数,则这些参数默认,即将传递值None他们。将保留所有其他缺少的参数(没有相应的参数),包括可选参数和非可选参数,并且函数的结果仍然是f的主体缺少这些参数的函数。

如果您希望默认可选参数,则需要提供至少一个未标记的参数。由于您的concat1函数没有非标签参数,因此无法实现。

我见过的有许多带标签和可选参数的函数的成语是有一个最终单元参数:

let concat1 ?(x = " ") ~y ~z () = y ^ x ^ z

然后,您可以轻松提供一个未标记的参数来获取可选的默认值。

# let concat1 ?(x = " ") ~y ~z () = y ^ x ^ z;;
val concat1 : ?x:string -> y:string -> z:string -> unit -> string = <fun>
# concat1 ~y: "abc" ~z: "def" ();;
- : string = "abc def"

我不确定这对你有用。