OCaml - 给出类型为 (int -> int) -> int 的函数
OCaml - Give a function of type (int -> int) -> int
我完全迷失了。据解释,函数是右对齐的,因此 let add x y = x + y;;
的函数类型为 int -> int -> int
或 int -> (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 的主题的更多信息。
我完全迷失了。据解释,函数是右对齐的,因此 let add x y = x + y;;
的函数类型为 int -> int -> int
或 int -> (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 的主题的更多信息。