OCaml - 给出类型为 (int -> int) -> int 的函数

OCaml - Give a function of type (int -> int) -> int

我完全迷失了。据解释,函数是右对齐的,因此 let add x y = x + y;; 的函数类型为 int -> int -> intint -> (int -> int)

我不确定如何定义 (int -> int) -> int 类型的函数。我在想我会让第一个参数成为一个传入 int 和 returns 和 int 的函数。我试过:

let add = fun x y -> x + y --- int -> int -> int

let add = fun f x = (f x) + 3 --- ('a -> int) -> 'a -> int

let eval (f: int -> int) :int = f 0

?

fun x -> (x 1) + 1;;
- : (int -> int) -> int = <fun>

let foo f = (f 1) + 1;;
val foo : (int -> int) -> int = <fun>

它的工作方式类似于

foo (fun x -> x + 1);;
- : int = 3

您的问题与 Currying 的概念高度相关。

但在此之前,让我说,如果你想写一个函数,需要一个参数是一个函数,你可以声明一个普通函数,然后像函数一样使用它的参数。无需复杂化。见前:

let f x = x(10) + 10

柯里化部分来了。在 OCaml 中,一次仅对参数进行语义评估,在评估参数后,将返回一个匿名函数。这很重要,因为它允许您提供函数的部分参数,从而有效地创建一个新函数(称为部分应用程序)。

在下面的示例中,我使用 + 作为函数(运算符周围的括号将其转换为普通函数),以创建增量函数。并将其应用于之前的f函数。

let incr = (+) 1
f incr

代码的计算结果为 f incr = incr(10) + 10 = 21

link 包含有关应用于 OCaml 的主题的更多信息。