F# - 函数声明

F# - 函数声明 首页 / F#入门教程 / 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

以下程序说明了这些概念。

以下程序在给出半径和长度作为参数时计算圆柱体的体积

无涯教程网

//这是单行注释
//以半径和长度为参数的圆柱体

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

编译并执行程序时,将产生以下输出-

链接:https://www.learnfk.comhttps://www.learnfk.com/fsharp/fsharp-functions.html

来源:LearnFk无涯教程网

Volume: 141.372

以下程序返回两个给定参数的较大值-

//该函数返回两个之间较大的值
//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

编译并执行程序时,将产生以下输出-

链接:https://www.learnfk.comhttps://www.learnfk.com/fsharp/fsharp-functions.html

来源:LearnFk无涯教程网

Max Value: 52
let doubleIt (x : int) = 2 * x
printfn "Double 19: %d" ( doubleIt(19))

编译并执行程序时,将产生以下输出-

链接:https://www.learnfk.comhttps://www.learnfk.com/fsharp/fsharp-functions.html

来源:LearnFk无涯教程网

Double 19: 38

递归函数

您可以使用 let rec 关键字组合定义一个递归。

定义递归函数的语法是-

//递归函数定义
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返回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)

编译并执行程序时,将产生以下输出-

链接:https://www.learnfk.comhttps://www.learnfk.com/fsharp/fsharp-functions.html

来源:LearnFk无涯教程网

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

以下程序返回阶乘8-

open System
let rec fact x =
   if x < 1 then 1
   else x * fact (x - 1)
Console.WriteLine(fact 8)

编译并执行程序时,将产生以下输出-

链接:https://www.learnfk.comhttps://www.learnfk.com/fsharp/fsharp-functions.html

来源:LearnFk无涯教程网

40320

箭头符号

F#使用链接的箭头符号报告有关函数和值中的数据类型的信息,以一个接受一个 int 输入并返回一个字符串的函数为示例。

int -> string

从左到右读取数据类型。

让无涯教程采用另一个假设函数,该函数接受两个int数据输入并返回一个字符串。

let mydivfunction x y=(x/y).ToString();;

F#使用链接的箭头符号将数据类型报告为-

val mydivfunction : x:int -> y:int -> string

返回类型由最右边的数据类型以链接箭头表示。

一些更多的示例-

符号含义
float→float→float该函数接受两个 float 输入,返回另一个 float 。
int→strig→float该函数接受一个 int 和一个 string 输入,返回一个 float 。

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

编译并执行程序时,将产生以下输出-

链接:https://www.learnfk.comhttps://www.learnfk.com/fsharp/fsharp-functions.html

来源:LearnFk无涯教程网

35

现在在上面的示例中,如果不用定义函数 mul ,无涯教程可以将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

编译并执行程序时,将产生以下输出-

链接:https://www.learnfk.comhttps://www.learnfk.com/fsharp/fsharp-functions.html

来源:LearnFk无涯教程网

35

函数组成

以下示例显示了由两个函数function1和function2组成的名为f的函数-

let function1 x = x + 1
let function2 x = x * 5

let f = function1 >> function2
let res = f 10
printfn "%d" res

编译并执行程序时,将产生以下输出-

链接:https://www.learnfk.comhttps://www.learnfk.com/fsharp/fsharp-functions.html

来源:LearnFk无涯教程网

55

以下示例显示-

let function1 x = x + 1
let function2 x = x * 5

let res = 10 |> function1 |> function2
printfn "%d" res

编译并执行程序时,将产生以下输出-

链接:https://www.learnfk.comhttps://www.learnfk.com/fsharp/fsharp-functions.html

来源:LearnFk无涯教程网

55

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

Linux实战技能100讲 -〔尹会生〕

编译原理之美 -〔宫文学〕

雷蓓蓓的项目管理实战课 -〔雷蓓蓓〕

小马哥讲Spring核心编程思想 -〔小马哥〕

视觉笔记入门课 -〔高伟〕

Linux内核技术实战课 -〔邵亚方〕

超级访谈:对话张雪峰 -〔张雪峰〕

郭东白的架构课 -〔郭东白〕

云时代的JVM原理与实战 -〔康杨〕

好记忆不如烂笔头。留下您的足迹吧 :)