我认为@kvb给出了一个很好的解释,说明了代码是如何评估的。该代码以一种非常令人困惑的方式结合了嵌套函数和阴影:-)。我认为分开看这两个概念很有用。
阴影允许您通过声明中的新值或构造let
中的值绑定来隐藏值。match
这意味着您将无法再访问原始值。这是一个更简单的例子:
let foo num =
let num = num + 20 // Line 2
let num = num * 2 // Line 3
num
在这里,我们声明一个函数,它接受一个名为 的参数num
。假设我们以 1 作为参数调用函数。在第二行,我们声明了一个同名的新值——初始化为1 + 20即21。第三行再次声明一个新值并将其初始化为21 * 2(因为它看到最后声明的num符号,其值为21)。在第 4 行,我们再次访问最后声明的num符号并返回42。
这主要是有用的,当你有一些计算来计算一些应该被所有后续计算使用的新值时。阴影允许您隐藏以前的值,因此不会有意外使用原始值的危险。
当您需要使用外部函数的参数进行一些局部效用计算时,嵌套函数非常有用。例如:
let times x nums =
let timesUtil y = y * x
for n in nums do
printfn "%d" (timesUtil n)
在这里,我们声明了一个实用程序嵌套函数timesUtil
,它将任意数字乘以值x
(这是times
函数的参数)。然后我们可以稍后(在最后一行)使用它来执行操作,而无需x
再次将值作为参数传递。因此,嵌套函数的主要有趣之处在于它们可以访问由外部函数声明的值。