我最近一直在学习OCaml,截至目前看起来编译器使用了一个箭头来表示下一个类型是什么。例如,int -> int -> <fun>
是一个返回整数的整数,它返回一个函数。OCaml中的箭头“ - >”的目的是什么?OCaml
但是,我想知道我是否可以在OCaml代码中本地使用它。此外,如果有人会碰巧知道它的适当名称。谢谢。
我最近一直在学习OCaml,截至目前看起来编译器使用了一个箭头来表示下一个类型是什么。例如,int -> int -> <fun>
是一个返回整数的整数,它返回一个函数。OCaml中的箭头“ - >”的目的是什么?OCaml
但是,我想知道我是否可以在OCaml代码中本地使用它。此外,如果有人会碰巧知道它的适当名称。谢谢。
该运算符通常称为类型箭头,其中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”。
你是什么意思的“本身使用它”?当然,您可以在明确写下类型签名时使用它。 – Bergi
你的意思是复制粘贴的东西是这样的:'let f a b = a + b ;; val f:int - > int - > int =',其中'int - > int - > int'是f的类型。你可以忽略'= '部分,这意味着非正式地显示'f'的值。 –