探索函数

已完成

你经常会发现你的代码看起来具有重复性。 它在多个位置提供相同的作用,或只存在细微的差异。 在这种情况下,应考虑如何使代码可重用。 实现此目的的方法是提取这些表达式,并创建一个或多个函数。 函数是众多编程语言中的一个基本构建基块,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

参数现已通过代码 string 添加类型 let convert (a:string)。 现在,可以通过添加返回类型来更明确地体现这一点。 为此,请在参数后添加另一个 :<type>

let convert (a:string) :int =
    int a

现在,括号括起参数,如 (a:string) 所示。 返回类型是要发生的最后一个 :<type> 批注,即 :int。 F# 足够智能,可用于大多数方案,但有时需要让代码更明确,以便提升代码性能。 添加类型的另一个好处是,这使其他开发人员可以更轻松地了解目前的情况。