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