我正在OCaml做一个学校作业,我有一个关于表达式的含义的问题。
例如,在定义函数时,如果我写道:
let iter : int * (int -> int) -> (int -> int)
= fun (n,f) ->(int -> int)是什么意思?我理解函数本身接收一对作为参数,但我不完全理解括号的含义.
发布于 2017-10-13 10:16:35
括号用于消除(int -> int)类型的函数之间的歧义--这意味着它接受一个int类型的参数并返回一个int --并且可能只有两个常规的int作为该函数的参数。例如,如果没有第一对括号,您的iter将期望一个(int, int)元组,如果没有其他参数,则将int -> int -> int作为返回类型。
请注意,第二对括号并不是绝对必要的,但它可以很好地指示您期望得到一个函数作为回报。如果没有这对括号,函数就可以读取为(int, int -> int)的一个元组加上另一个int,例如返回一个int。
一个与您的iter具有相同签名的函数的示例可以是:
let random_func: int * (int -> int) -> (int -> int) =
fun (n, f) -> f发布于 2017-10-13 23:32:50
在下面找到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;博士
但是,使用括号对这些输入/输出链进行分组是很棘手的,但在Ocaml中是必要的,因为实际上编译器无法从例如int * int -> int中猜测,如果您指的是接受int * int对作为输入并将int作为输出返回(我们可以将其作为(int * int) -> int括号)的应用程序,或者接受作为参数的对int和类型为int -> int的函数的应用程序(可以将其写入为int * (int -> int))。
https://stackoverflow.com/questions/46725458
复制相似问题