如何将未指定的算术声明(或其他函数)作为参数?

时间:2014-09-21 01:36:36

标签: ocaml

例如,

(*)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或折叠结构)。我一直尝试不同的格式,但到目前为止没有成功......有谁能请证明我如何将未指定的算术声明或函数作为参数?

谢谢!

1 个答案:

答案 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中不是免费的,你必须定义它。