OCaml函数具有可变数量的参数

die*_*stn 6 ocaml function variadic-functions

我正在探索OCaml函数的"高级"用法,我想知道如何用可变数量的参数编写函数.

例如,一个函数,如:

let sum x1,x2,x3,.....,xn = x1+x2,+x3....+xn
Run Code Online (Sandbox Code Playgroud)

Jef*_*eld 11

OCaml是强类型的,并且其他(无类型)语言中使用的许多技术都不适用.在我看来(经过50年的编程)这是一件非常好的事情,而不是一个问题.

处理相同类型的可变数量参数的最清晰方法是传递列表:

# let sum l = List.fold_left (+) 0 l;;
val sum : int list -> int = <fun>
# sum [1;2;3;4;5;6];;
- : int = 21
Run Code Online (Sandbox Code Playgroud)

  • “其他(非类型化)语言中使用的许多技术都不适用。” 您是说可变参数函数在强类型语言中不可能吗? (2认同)

gsg*_*gsg 11

有点类型hackery,当然:

let sum f = f 0
let arg x acc g = g (acc + x)
let z a = a
Run Code Online (Sandbox Code Playgroud)

和(ab)用法:

# sum z;;
- : int = 0
# sum (arg 1) z;;
- : int = 1
# sum (arg 1) (arg 2) (arg 3) z;;
- : int = 6
Run Code Online (Sandbox Code Playgroud)

整洁,对吧?但是不要使用它 - 这是一个黑客.

有关解释,请参阅此页面(就SML而言,但想法是相同的).

  • 我不会使用它,因为传递一个int列表是更好的方法。但是很好地使用了更高级别的函数和延续传递样式。 (3认同)