codecamp

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

箭头符号

F#使用链式箭头符号报告函数和值中的数据类型。 让我们以一个函数为例,输入int,并返回一个字符串。在代码里,它被写成 
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
F#循环
F#字符串
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }