功能基礎
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
,在 單位型別中進行了解釋。