功能基础
F#中的大多数函数都是使用 let
语法创建的:
let timesTwo x = x * 2
这定义了一个名为 timesTwo
的函数,它接受一个参数 x
。如果你运行交互式 F#会话(OS X 和 Linux 上的 fsharpi
,Windows 上的 fsi.exe
)并将该功能粘贴到(并添加告诉 fsharpi
的 ;;
以评估你刚刚输入的代码),你将看到它回复:
val timesTwo : x:int -> int
这意味着 timesTwo
是一个函数,它接受 int
类型的单个参数 x
,并返回 int
。函数签名通常在没有参数名称的情况下编写,因此你经常会看到此函数类型写为 int -> int
。
可是等等! F#怎么知道 x
是一个整数参数,因为你从未指定过它的类型?这是由于类型推断。因为在函数体中,你将 x
乘以 2
,x
和 2
的类型必须相同。 (作为一般规则,F#不会隐式地将值转换为不同的类型;你必须明确指定所需的任何类型转换)。
如果要创建一个不带任何参数的函数,这是错误的方法:
let hello = // This is a value, not a function
printfn "Hello world"
在正确的做到这一点的方法是:
let hello () =
printfn "Hello world"
此 hello
函数的类型为 unit -> unit
,在 单位类型中进行了解释。