在OCaml中箭头" - >"的目的是什么

Cha*_*man 3 ocaml

我最近一直在学习OCaml,到目前为止,编译器似乎使用了一个箭头来表示下一个类型是什么.例如,int -> int -> <fun>一个返回整数的整数,它返回一个函数.

但是,我想知道我是否可以在OCaml代码中原生使用它.此外,如果有人碰巧知道它的适当名称.谢谢.

lam*_*y.x 8

操作符通常称为类型箭头,T1 -> T2表示从一个类型T1到另一个类型的函数T2.例如,类型+int -> (int -> int)因为它需要两个整数并返回另一个整数.

->定义方式,函数总是接受一个参数并且只返回一个元素.具有多个参数的函数可以转换为一系列一元函数.我们可以解释1 + 2为创建+1增量函数(您可以通过(+) 1在OCaml命令行中进行评估来创建它)到数字2.这种技术称为Currying或Partial Evaluation.

在评估一个术语时,让我们看看OCaml的输出:

# 1 + 2;;
- : int = 3

# (+) 1 ;;
- : int -> int = <fun>
Run Code Online (Sandbox Code Playgroud)

该术语1+2的类型为整数,其值为,3并且该术语(+) 1是从整数到整数的函数.但由于后者是一个函数,OCaml无法打印单个值.作为占位符,它只是打印<fun>,但类型是留下的=.

您可以使用fun关键字定义自己的函数:

# (fun x -> x ^ "abc");;
- : bytes -> bytes = <fun>  
Run Code Online (Sandbox Code Playgroud)

这是将"abc"附加到给定字符串x的函数.让我们以语法分开:fun x -> term意味着我们定义一个参数的函数x,这x现在可以内出现term.有时我们想给函数名,然后我们使用let构造:

# let append_abc = (fun x -> x ^ "abc") ;;
val append_abc : bytes -> bytes = <fun> 
Run Code Online (Sandbox Code Playgroud)

因为let f = fun x -> ...有点麻烦,你也可以写:

let append_abc x = x ^ "abc" ;;
val append_abc : bytes -> bytes = <fun>
Run Code Online (Sandbox Code Playgroud)

无论如何,您可以使用以下新功能:

# append_abc "now comes:" ;;
- : bytes = "now comes:abc"
Run Code Online (Sandbox Code Playgroud)

变量x被替换为"now comes:",我们获得表达式:

"now comes:" ^ "abc"
Run Code Online (Sandbox Code Playgroud)

评估为"now comes:abc".