根据http://en.wikibooks.org/wiki/F_Sharp_Programming/Caching
F#自动缓存任何不需要的函数的值 参数
那为什么会这样呢?
let random() = System.Random().Next()
随机是单位 - > INT 我希望每次调用random()时都会缓存输出值并返回相同的int。
答案 0 :(得分:7)
F#3.0规范说没有这样的事情。
允许使用纯粹的功能性语言"替换" (通常称为"引用透明度"),因为在纯函数式语言中,函数只是它的单个参数和它的单个返回值。毋庸置疑,F#不是纯粹的功能语言。
然而,无论如何这不是问题。 random
不是没有参数的函数。它需要一个参数(类型为unit
),并返回一个整数。如你所知,随机签名是unit -> int
- 这与没有参数的函数完全不同,函数的签名为int
;换句话说,一个本地人。
当函数接受或返回unit
(或void
)时,它不应该被记忆化 - 这是该方法具有副作用的明显迹象。它不是一个固定的规则,但是......
答案 1 :(得分:1)
看起来在问题中编码我的一个班轮的正确方法是
let good =
let r = System.Random()
fun () -> r.Next()
这有签名(unit - > int)。行让r = System.Random()只会被执行一次,即使 good()可能被多次调用。
以下情况并不好。
let bad() =
let r = System.Random()
r.Next()
这有签名单位 - > INT 即可。类似于问题中的一个班轮。每次调用 bad()时,都会执行 let r = System.Random()行。