2017-10-13 355 views
0

我正在OCaml做一个学校任务,我对表达的含义有疑问。什么是(int - > int) - >(int - > int)是什么意思?

当定义功能,如果我举个例子,写道:

let iter : int * (int -> int) -> (int -> int) 
= fun (n,f) -> 

是什么(int -> int)意思?我明白函数本身收到一对作为参数,但我不完全明白括号是什么意思...

+0

应用'(INT - > INT)'是函数从'int'到'int'类型。 – gallais

+1

@gallais这并没有真正帮助很多。 – PieOhPah

+0

目前还不清楚你在问什么...... – gallais

回答

4

括号用于消除类型为(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 
1

查找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)或者接受一对intint -> int类型的函数作为参数的应用程序(可以将其写入作为int * (int -> int))。

Stanford Encyclopedia of Philosophy (very good read)

+0

如果你解释说在这个没有括号的情况下,你的解释可能是好的,函数会在整数上期望一对并返回一个类型为“int - >”的函数int - > int'因为'*'在' - >'上具有更高的优先级。 – Lhooq

相关问题