例如,
(*)f是算术声明:+, - ,*,/。 x是int列表。 y是int。
rawr将f应用于x的每个元素,并返回累计值*)
让rawr f x y = .... .... ....
rawr(*)[1; 2; 3] 2应该返回(1 * 2)+(2 * 2)+(3 * 2)= 12
rawr(+)[1; 2; 3] 2应该返回(1 + 2)+(2 + 2)+(3 + 2)= 12
我不需要编写rawr代码(这只是我提出的一个随机的例子,可以让我的问题清楚),但我确实需要将其他函数或算术声明作为参数(特别是对于rec或折叠结构)。我一直尝试不同的格式,但到目前为止没有成功......有谁能请证明我如何将未指定的算术声明或函数作为参数?
谢谢!
答案 0 :(得分:0)
目前尚不清楚您是想采用符号公式还是OCaml函数,或者您是否需要接受其中任何一种。
让我们假设你对一个函数参数感到满意。
函数作为函数的参数就像OCaml这样的FP语言不会让人痛苦。
这个典型的例子是函数List.fold_left
。这是List.fold_left
的一个实现,它可能会告诉你这种事情是什么样的:
let rec fold_left f accu l =
match l with
[] -> accu
| a::l -> fold_left f (f accu a) l
如果你像函数一样使用参数,OCaml会发现它是一个函数。这就是类型推断的工作原理。
您可以使用此功能添加数字列表:
$ ocaml
OCaml version 4.01.0
# let rec fold_left f accu l =
match l with
[] -> accu
| a::l -> fold_left f (f accu a) l
;;
val fold_left : ('a -> 'b -> 'a) -> 'a -> 'b list -> 'a = <fun>
# fold_left (+) 0 [4;5;7];;
- : int = 16
#
事实上,如果你想接受 函数或某种符号表达式,你需要弄清楚如何表示和评估你的符号表达式。这在OCaml中不是免费的,你必须定义它。