通过返回函数隐藏 System.Random 实例

Hiding a System.Random instance by returning a function

以下代码来自Stylish F# 6: Crafting Elegant Functional Code for .NET 6清单9-13:

let randomByte =
    let r = System.Random()
    fun () ->
        r.Next(0, 255) |> byte
// E.g. A3-52-31-D2-90-E6-6F-45-1C-3F-F2-9B-7F-58-34-44-
for _ in 0..15 do
    printf "%X-" (randomByte())
printfn ""

作者指出,“虽然我们多次调用 randomByte(),但只创建了一个 System.Random() 实例。”

我理解 randomByte returns 一个不创建 System.Random() 实例的函数,但在我看来每次都会创建多个 System.Random() 实例for-do-loop 无论如何。

如果能解释一下在这种情况下如何不创建 System.Random() 的多个实例,我将不胜感激。

关键是 randomByte 不是函数 。它是一个具有一些复杂初始化逻辑的值。例如,我可以写:

let x = 5

或者我可以这样写:

let x =
  let fourtyTwo = 42
  let thirtySeven = 37
  fourtyTwo - thirtySeven

这些是等价的。两者都声明了一个名为 x 且等于 5 的值。我希望你能看到表达式 fourtyTwo - thirtySeven 是如何只计算一次的,而不是每次有人得到 x.

的值时

所以它也适用于 randomByte:它是一个具有 non-trivial 初始化逻辑的值。在那个值的初始化过程中,首先它创建了一个 System.Random 的实例,然后它创建了一个关闭该实例的匿名函数,这个匿名函数成为 randomByte.

的值。