F#功能
在F#中,函数的工作就像数据类型。可以声明和任何其他变量相同的方式使用的功能。
由于函数可以像任何其他变量可以使用,你可以 -
- 创建一个函数,一个名字和名称与类型相关联。
- 它分配一个值。
- 执行该值的一些计算。
- 通过它作为参数传递给另一个函数或子例程。
- 返回的函数作为另一个函数的结果。
定义一个函数
功能通过使用let关键字定义。函数定义的语法如下 -
let [inline] function-name parameter-list [ : return-type ] = function-body
函数名是表示函数的标识符。
参数列表给出了用空格分隔参数列表。您还可以指定一个显式类型的每一个参数,如果没有指定编译器倾向于从函数体(如变量)推断出结论。
函数体由一个表达式,或者由若干表达式的化合物的表情。函数体中最后一个表达式返回值。
返回型是冒号后跟一个类型并且是可选的。如果没有指定返回类型,则编译器在函数体中最后一个表达式决定了它。
一个函数参数
你函数名之后列出的参数名称。可以指定参数的类型。参数类型应遵循由冒号分隔参数的名称。
如果没有指定参数类型,它是由编译器推断。
例如 -
let doubleIt (x : int) = 2 * x
调用一个函数
一个函数可以通过指定函数名称,后跟一个空格,然后用空格分隔任何参数调用。
例如 -
let vol = cylinderVolume 3.0 5.0
下面的程序演示的概念。
例1
以下程序计算时的半径和长度给定为参数的圆柱体的体积。
// the function calculates the volume of // a cylinder with radius and length as parameters let cylinderVolume radius length : float = // function body let pi = 3.14159 length * pi * radius * radius let vol = cylinderVolume 3.0 5.0 printfn " Volume: %g " vol
当你编译和执行程序,它产生以下输出 -
Volume: 141.372
例2
下列程序返回的两个给定参数的较大值 -
// the function returns the larger value between two // arguments let max num1 num2 : int32 = // function body if(num1>num2)then num1 else num2 let res = max 39 52 printfn " Max Value: %d " res
当你编译和执行程序,它产生以下输出 -
Max Value: 52
例3
let doubleIt (x : int) = 2 * x printfn "Double 19: %d" ( doubleIt(19))
当你编译和执行程序,它产生以下输出 -
Double 19: 38
递归函数
递归函数是自称的功能。
您可以定义使用let rec关键字组合递归。
语法定义递归函数是
//Recursive function definition let rec function-name parameter-list = recursive-function-body
例如 -
let rec fib n = if n < 2 then 1 else fib (n - 1) + fib (n - 2)
例1
以下程序返回Fibonacci 1到10
let rec fib n = if n < 2 then 1 else fib (n - 1) + fib (n - 2) for i = 1 to 10 do printfn "Fibonacci %d: %d" i (fib i)
当你编译和执行程序,它产生以下输出
Fibonacci 1: 1 Fibonacci 2: 2 Fibonacci 3: 3 Fibonacci 4: 5 Fibonacci 5: 8 Fibonacci 6: 13 Fibonacci 7: 21 Fibonacci 8: 34 Fibonacci 9: 55 Fibonacci 10: 89
例2
以下程序返回factorial 8
open System let rec fact x = if x < 1 then 1 else x * fact (x - 1) Console.WriteLine(fact 8)
当你编译和执行程序,它产生以下输出 -
40320
箭头符号
int -> string
数据类型读左到右。
让我们假设另外一个功能,它有两个int数据输入,并返回一个字符串。
let mydivfunction x y = (x / y).ToString();;
F#报告使用链式箭头符号作为数据类型 -
val mydivfunction : x:int -> y:int -> string
返回类型由链式箭头符号最右边的数据类型来表示。
更多的例子
符号 | 含义 |
---|---|
float → float → float | 该函数需要两个输入,返回另一个。 |
int → string → float | 该函数接受ainting astringinput,返回float。 |
Lambda表达式
lambda表达式是匿名函数。
让我们以两个函数作为例子
let applyFunction ( f: int -> int -> int) x y = f x y let mul x y = x * y let res = applyFunction mul 5 7 printfn "%d" res
当你编译和执行程序,它产生以下输出 -
35
现在在上面的例子中,而不是定义函数,我们可以使用lambda表达式
let applyFunction ( f: int -> int -> int) x y = f x y let res = applyFunction (fun x y -> x * y ) 5 7 printfn "%d" res
当你编译和执行程序,它产生以下输出 -
35
函数组合和流水线
在F#中,一个功能可以从其他的功能组成。
下面的示例显示了一个名为女,来自两个函数功能1和功能2功能组成 -
let function1 x = x + 1 let function2 x = x * 5 let f = function1 >> function2 let res = f 10 printfn "%d" res
当你编译和执行程序,它产生以下输出 -
55
F#还提供了一个叫做pipelining of functions的功能。流水线中,函数调用作为连续操作进行链接在一起。
下面的例子说明
let function1 x = x + 1 let function2 x = x * 5 let res = 10 |> function1 |> function2 printfn "%d" res
当你编译和执行程序,它产生以下输出
55
更多建议: