Functional programming OCaml可选参数

Functional programming OCaml可选参数,functional-programming,ocaml,Functional Programming,Ocaml,如何在OCaml中编写一个函数,其中一个或多个参数是可选的 let foo x y z = if(x+y > z) then true else false;; 如果foo没有收到z参数,它将0用作z foo 3 3 2 -> true foo 3 3 10 -> false foo 2 1 -> true 有什么OCaml特性可以实现这一点吗?OCaml有可选参数,但它比您预期的要复杂得多,因为OCaml函数基本上只有一个参数。在您的例子中,foo是一个需要int并

如何在OCaml中编写一个函数,其中一个或多个参数是可选的

let foo x y z = if(x+y > z) then true else false;;
如果foo没有收到
z
参数,它将
0
用作
z

foo 3 3 2 -> true
foo 3 3 10 -> false
foo 2 1 -> true

有什么OCaml特性可以实现这一点吗?

OCaml有可选参数,但它比您预期的要复杂得多,因为OCaml函数基本上只有一个参数。在您的例子中,foo是一个需要int并返回函数的函数

如果您不使用尾随参数,通常这意味着您对将返回的函数感兴趣;这有时称为部分应用

结果是尾部可选参数(如您所要求的)不起作用

可选参数始终与名称相关联,该名称用于指示是否提供了参数

如果将
z
作为函数的第一个参数,而不是最后一个参数,则可以得到如下结果:

# let foo ?(z = 0) x y = x + y > z;;
val foo : ?z:int -> int -> int -> bool = <fun>
# foo 3 3 ~z: 2;;
- : bool = true
# foo 3 3 ~z: 10;;
- : bool = false
# foo 2 1;;
- : bool = true
#让foo?(z=0)xy=x+y>z;;
val foo:?z:int->int->int->bool=
#foo3~z:2;;
-:bool=true
#foo3~z:10;;
-:bool=false
#foo 2 1;;
-:bool=true
一般来说,我认为OCaml中的可选(和命名)参数不能解决与其他一些语言相同的问题


我个人从不使用可选参数定义函数;因此,可能有更好的方法来实现您的要求。

OCaml没有Java或C#中的可选参数。由于函数可以部分应用,所以可选参数可能会使您很难判断何时已完成参数传递并希望对函数进行求值。但是,OCaml确实具有相同的功能,可用于实现相同的效果

标签参数的常见警告适用。请注意,带标签的参数不能出现在参数列表的末尾,因为一旦函数具备所需的一切,就会对其进行求值:

let foo x y ?z_name:(z=0) = (x + y) > z;;
Characters 12-39:
  let foo x y ?z_name:(z=0) = (x + y) > z;;
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^
Warning 16: this optional argument cannot be erased.
val foo : int -> int -> ?z_name:int -> bool = <fun>
让foo x y?z_名称:(z=0)=(x+y)>z;;
字符12-39:
让foo x y?z_name:(z=0)=(x+y)>z;;
^^^^^^^^^^^^^^^^^^^^^^^^^^^
警告16:无法删除此可选参数。
val foo:int->int->?z_name:int->bool=
参数列表的其他部分也可以:

# let foo ?z:(z=0) x y = (x + y) > z;;
val foo : ?z:int -> int -> int -> bool = <fun>
# foo 1 1;;
- : bool = true
# foo (-1) (-1);;
- : bool = false
# foo ~z:(-42) (-1) (-1);;
- : bool = true
让foo?z:(z=0)xy=(x+y)>z;; val foo:?z:int->int->int->bool= #foo 1;; -:bool=true #foo(-1)(-1);; -:bool=false #foo~z:-42-1-1;; -:bool=true 以与上述相同的方式,一旦在参数列表中“移过”可选参数,您将失去提供该参数的能力:

# foo 1;;
- : int -> bool = <fun>
#foo 1;;
-:int->bool=