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

时间:2017-03-15 17:20:07

标签: ocaml

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

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

1 个答案:

答案 0 :(得分:6)

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

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

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

# 1 + 2;;
- : int = 3

# (+) 1 ;;
- : int -> int = <fun>

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

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

# (fun x -> x ^ "abc");;
- : bytes -> bytes = <fun>  

这是附加&#34; abc&#34;到给定的字符串x。我们将语法分开:fun x -> term表示我们定义一个带有参数x的函数,此x现在可以显示在term中。有时我们想提供函数名称,然后我们使用let构造:

# let append_abc = (fun x -> x ^ "abc") ;;
val append_abc : bytes -> bytes = <fun> 

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

let append_abc x = x ^ "abc" ;;
val append_abc : bytes -> bytes = <fun>

在任何情况下,您都可以按如下方式使用新功能:

# append_abc "now comes:" ;;
- : bytes = "now comes:abc"

变量x"now comes:"取代,我们得到表达式:

"now comes:" ^ "abc"

评估为"now comes:abc"