2017-03-15 27 views
2

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

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

+0

你是什么意思的“本身使用它”?当然,您可以在明确写下类型签名时使用它。 – Bergi

+0

你的意思是复制粘贴的东西是这样的:'let f a b = a + b ;; val f:int - > int - > int = ',其中'int - > int - > int'是f的类型。你可以忽略'= '部分,这意味着非正式地显示'f'的值。 –

回答

4

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

定义方式->,函数总是只带一个参数,并且只返回一个元素。具有多个参数的函数可以被转换成一系列一元函数。我们可以将1 + 2解释为创建+1递增函数(您可以通过在OCaml命令行中评估(+) 1来创建它)编号为2.此技术称为Currying或部分评估。

我们评价一个术语,当我们看在OCaml的输出:

# 1 + 2;; 
- : int = 3 

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

术语1+2为整数类型,并且具有3值和术语(+) 1是从整数到整数的函数。但是由于后者是一个函数,OCaml不能打印单个值。作为一个占位符,它只是打印<fun>,但类型是=

可以搭配的乐趣关键字定义自己的职能:

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

这是追加“ABC”给定的字符串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:"取代,我们得到的EXP ression:

```now comes:```^"abc" 

其评估为“现在来:abc”。