功能基础

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 乘以 2x2 的类型必须相同。 (作为一般规则,F#不会隐式地将值转换为不同的类型;你必须明确指定所需的任何类型转换)。

如果要创建一个不带任何参数的函数,这是错误的方法:

let hello =  // This is a value, not a function
    printfn "Hello world"

正确的做到这一点的方法是:

let hello () =
    printfn "Hello world"

hello 函数的类型为 unit -> unit,在 单位类型中进行了解释。