3.1.2.2 嵌套函数声明(NESTED FUNCTION DECLARATIONS)

728 篇文章 1 订阅
349 篇文章 0 订阅

3.1.2.2 嵌套函数声明(NESTEDFUNCTION DECLARATIONS)

 

我们现在再看一个稍微复杂的函数声明,清单 3.3 演示了 let 绑定的另一个重要方面:嵌套。

 

清单 3.3 嵌套的 let 绑定 (F# Interactive)

 

> let printSquares message num1 num2 =

let printSquareUtility num =                         |

let squared = num * num                [3]  | [2] |

printfn "%s %d: %d" message num squared  [4]  |    | [1]

printSquareUtility(num1)                            |

printSquareUtility(num2)                            |

;;

val printSquares : string -> int ->int –> unit

 

> printSquares "Square of" 1427;;

Square of 14: 196

Square of 27: 729

 

清单 3.3 实现的函数名为 printSquares,可以看到,其签名为(string -> int -> int -> unit),这个函数的第一个参数值(message)为字符串,后面两个参数(num1和 num2)为数字;函数打印后两个参数的平方,用第一个参数设置输出格式;函数不返回任何值,因此,类型为空(unit)。

printSquares 的函数体[1]包含嵌套声明的printSquareUtility 函数。这个工具函数取数字作为参数,计算其平方,连同原来的数字一起输出。为使代码更具可读性,函数体包含了另一个嵌套的 let 绑定,声明一个普通值squared[3],其值为参数的平方。工具函数最后调用 printfn,输出message、原始的数字,和这个数的平方,第一个参数指定参数的格式和类型(%s 代表字符串,%d 代表整数)。

这个示例还说明了嵌套声明的另一个更重要方面。我们曾经提到过,函数参数的作用域(意思是它可以被访问)在函数体内的任意位置。例如,参数 message 可以在范围[1]内的任意位置使用,也就是说,可以用在嵌套的函数声明中,而这正是我们在printSquareUtility 中所做的,在第四行[4]我们使用 message 值输出数字。当然,嵌套声明只在声明它们的作用域内才可以访问,因此,不能直接从程序的其他地方使用 printSquareUtility。正确作用域还保证了 message 参数总是会有值。

在 F# 中,值声明的最后一个方面是能够声明可变值。虽然,我们在函数程序中通常使用不可变值,但有时能够创建可变值,也很有用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值