我完全迷失了。有人解释说,函数是正确的,因此let add x y = x + y;;
的函数类型为int -> int -> int
或int -> (int -> int)
。
我不确定如何定义(int -> int) -> int
类型的函数。我在想我的第一个参数是一个传入int
并返回int
的函数。我试过了:
let add = fun x y -> x + y
--- int -> int -> int
let add = fun f x = (f x) + 3
--- ('a -> int) -> 'a -> int
答案 0 :(得分:2)
怎么样?
let eval (f: int -> int) :int = f 0
答案 1 :(得分: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
答案 2 :(得分:0)
您的问题与Currying
的概念高度相关。
但在此之前,让我说如果你想编写一个需要参数作为函数的函数,你可以声明一个普通函数,并像函数一样使用它的参数。无需复杂化。见前:
let f x = x(10) + 10
现在是曲线部分。在OCaml中,一次只对一个参数进行语义评估,并在评估参数后返回匿名函数。这很重要,因为它允许您提供函数的部分参数,有效地创建一个新函数(称为部分应用程序)。
在下面的示例中,我使用+
作为函数(操作符周围的括号将其转换为正常函数),以创建增量函数。并将其应用于之前的f
函数。
let incr = (+) 1
f incr
代码评估为f incr = incr(10) + 10 = 21
此link有关于应用于OCaml的主题的更多信息。