探索函式

已完成

您通常會發現自己的程式碼看起來似乎有點重複。 該程式碼在許多地方執行相同的工作,或是只有些微差異。 在這些情況下,請思考如何讓程式碼可重複使用。 解決這種情況的方法是擷取這些運算式,然後建立一個或多個函式。 函式是許多程式設計語言中的基本建置組塊,而 F# 也不例外。

函式

函式是一個具名參考,其包含由一個或多個運算式組成的主體。 其中也可以包含參數。 函式的開頭為 let 關鍵字和函式名稱。 接著會有一個指派運算子,而位於運算子右邊的則是函式主體。

以下是函式的語法:

let <function name> <parameters> = <function body>

如同上述的範例語法,實際的函式範例會如下所示:

let add a b = a + b 

在此範例中,函式名稱是 add,而參數是 ab。 函式主體會將這兩個參數相加 (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# 非常聰明,足以找出大部分的情況,但有時您需要更明確地協助程式碼。 新增類型的另一個優點是,可讓其他開發人員更輕鬆地了解情況。