我正在OCaml做一个学校任务,我对表达的含义有疑问。什么是(int - > int) - >(int - > int)是什么意思?
当定义功能,如果我举个例子,写道:
let iter : int * (int -> int) -> (int -> int)
= fun (n,f) ->
是什么(int -> int)
意思?我明白函数本身收到一对作为参数,但我不完全明白括号是什么意思...
我正在OCaml做一个学校任务,我对表达的含义有疑问。什么是(int - > int) - >(int - > int)是什么意思?
当定义功能,如果我举个例子,写道:
let iter : int * (int -> int) -> (int -> int)
= fun (n,f) ->
是什么(int -> int)
意思?我明白函数本身收到一对作为参数,但我不完全明白括号是什么意思...
括号用于消除类型为(int -> int)
的函数之间的歧义 - 这意味着它需要一个参数键入int
并返回一个int
- 可能只是两个常规int
s作为该函数的参数。例如,如果没有第一对圆括号,则iter
将预期为(int, int)
元组,并且在没有其他参数存在的情况下,期望int -> int -> int
作为返回类型。
请注意,第二对括号不是严格必要的,但它可以是一个很好的指示器,表示您期待函数的回报。如果没有这一对括号,函数可以被读取为期望一个(int, int -> int)
的元组加上另一个int
,例如返回一个int
。
具有相同签名为您iter
函数的例子可能是:
let random_func: int * (int -> int) -> (int -> int) =
fun (n, f) -> f
查找TL; DR以下。
在lambda微积分中(请耐心等待),这是ML语言的根源,核心思想是抽象应用程序或将函数映射到参数。 只有一个参数。
λx[x + 1]
在上述的λ
读取抽象功能x + 1
到等待值x
的应用程序,从改变保护它,并应用(与值的函数替换x
和计算)。
OCaml中上述将相当于:
fun x -> x + 1
其具有类型int -> int
,或输入类型int
和输出类型int
。现在,lambda每次只处理一个参数。它如何与多个参数一起使用,如x*x -2*x + c
(多项式函数x2 − 2·x + c
)?它像以前一样一次评估一个参数。
λc[λx[x*x - 2*x + c]]
因此,前一个应用程序的输出成为下一个输入,依此类推。OCaml的等效将是
fun c x -> (x * x) - (2 * x) + c
该函数具有键入int -> int -> int
或(int -> int) -> int
(输入的链 - >输出)如果应用部分的功能的自变量x = 3
,会得到一个简化功能,如下所示:
fun c 3 -> (3 * 3) - (2 * 3) + c
fun c -> 9 - 6 + c
fun c -> 3 + c
,其中得到的函数将具有类型int -> int
。这是咖啡的基础。它起初可能看起来很混乱,但它在命令式语言中被证明是非常有用和不受重视的。举例来说,你可以做这样的事情:
let waiting_for_c_and_x = fun c x -> 2*x + c
let waiting_for_c = waiting_for_c_and_x 10 in
let result = waiting_for_c 2 (* result = 22 *)
TL; DR
但是,使用括号组输入这些链/输出棘手,但在Ocaml程序编写必要的,因为在现实中,编译器不能从例如猜测int * int -> int
如果您的意思是接受int * int
对作为输入并将int
作为输出(我们可以将其加入为(int * int) -> int
)或者接受一对int
和int -> int
类型的函数作为参数的应用程序(可以将其写入作为int * (int -> int)
)。
如果你解释说在这个没有括号的情况下,你的解释可能是好的,函数会在整数上期望一对并返回一个类型为“int - >”的函数int - > int'因为'*'在' - >'上具有更高的优先级。 – Lhooq
应用'(INT - > INT)'是函数从'int'到'int'类型。 – gallais
@gallais这并没有真正帮助很多。 – PieOhPah
目前还不清楚你在问什么...... – gallais