探索函式
您通常會發現自己的程式碼看起來似乎有點重複。 該程式碼在許多地方執行相同的工作,或是只有些微差異。 在這些情況下,請思考如何讓程式碼可重複使用。 解決這種情況的方法是擷取這些運算式,然後建立一個或多個函式。 函式是許多程式設計語言中的基本建置組塊,而 F# 也不例外。
函式
函式是一個具名參考,其包含由一個或多個運算式組成的主體。 其中也可以包含參數。 函式的開頭為 let
關鍵字和函式名稱。 接著會有一個指派運算子,而位於運算子右邊的則是函式主體。
以下是函式的語法:
let <function name> <parameters> = <function body>
如同上述的範例語法,實際的函式範例會如下所示:
let add a b = a + b
在此範例中,函式名稱是 add
,而參數是 a
和 b
。 函式主體會將這兩個參數相加 (a+b
),然後傳回結果。
傳回值
如同您在第一個範例中所見,沒有 return
關鍵字可說明傳回的內容。 在 F# 中,函式最後一行中的資訊就是傳回的內容。 請參考此多行函式:
let addAndMultiply a b c =
let sum = a + b
let product = sum * c
product
透過將 product
放在最後一行,告訴您傳回的內容為何。 那麼,您要如何呼叫像這樣的函式?
呼叫函式
若要呼叫或叫用函式,請使用函式的名稱,並新增您想要使用的任何參數 (以空白字元分隔)。 例如,若要呼叫 addAndMultiply()
函式,請輸入下列程式碼:
addAndMultiply 2 3 3 // 15
若要查看函式的結果,您可以將其指派給變數或直接列印出來,如下所示:
let sum = addAndMultiply 2 3 3
printfn "%i" sum
// OR
printfn "%i" (addAndMultiply 2 3 3)
推斷的型別
讓我們看看下列程式碼:
let add a b = a + b
let sum = add 2 2
let concat = add "hello" "world" // will give compilation error
這段程式碼將在最後一行失敗,並顯示下列訊息:
error FS0001: This expression was expected to have type
'int'
but here has type
'string'
失敗的原因是 F# 已經決定應該使用哪一個參數型別,而其決定使用整數。 因為第二個資料列中的資訊 (let sum = add 2 2
),所以其決定使用整數。 add()
函式的使用方式會表明參數類型絕對為整數。
如果第二個資料列不存在,您的程式碼就能運作:
let add a b = a + b
// let sum = add 2 2
let concat = add "hello" "world" // will work
編譯器會看到第一次使用函式是使用字串來進行,所以會得出參數類型為字串的結論。 因此,內容和第一次使用會推斷類型。
明確的型別
在某些情況下,您可能希望明確說明參數接受什麼類型別,以及函式傳回的內容。 其有助於提高可讀性,即使編譯器很可能並不需要此動作。
以下列函式為例:
let convert a =
int a
若要在其中新增型別,請新增 :<type>
,如下所示:
let convert (a:string) =
int a
參數現在已透過 let convert (a:string)
程式碼具備 string
型別。 您現在可以透過新增傳回型別來避免含糊的情況。 若要這樣做,請在參數正後方新增另一個 :<type>
:
let convert (a:string) :int =
int a
現在,括號將參數涵括在內,如 (a:string)
所示。 傳回型別是最後一個要發生的 :<type>
註釋,也就是 :int
。 F# 非常聰明,足以找出大部分的情況,但有時您需要更明確地協助程式碼。 新增類型的另一個優點是,可讓其他開發人員更輕鬆地了解情況。