我最近一直在学习OCaml,截至目前,编译器似乎使用了一个箭头来表示下一个类型是什么。例如,int -> int -> <fun>
一个返回整数的整数,它返回一个函数。
但是,我想知道我是否可以在OCaml代码中原生使用它。此外,如果有人碰巧知道它的适当名称。谢谢。
答案 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"
。