根据http://en.wikibooks.org/wiki/F_Sharp_Programming/Caching
f#自动缓存任何带no参数的函数的值参数
为什么会这样呢?
let random() = System.Random().Next()
random是unit -> int我希望输出值被缓存,并在每次调用random()时返回相同的int。
f# 3.0规范没有这样的规定。
一个纯粹的函数式语言将被允许做这种"替换"(通常称为"引用透明性"),因为在一个纯粹的函数式语言中,函数只是它的一个参数和一个返回值。不用说,f#是而不是一种纯粹的函数式语言。
然而,这不是这里的问题。random
是而不是一个没有参数的函数。它接受一个参数(类型为unit
),并返回一个整数。正如你所注意到的,随机函数的签名是unit -> int
——这与没有参数的函数完全不同,没有参数的函数的签名是int
;也就是说,一个本地的。
当一个函数接受或返回unit
(或void
)时,它不应该被记忆——这是一个明显的迹象,表明该方法有副作用。这不是一个固定的规则,但是…
看起来正确的方法来编码我的问题中的一行是
let good =
let r = System.Random()
fun () -> r.Next()
具有签名(unit -> int)。let r = System.Random()一行只执行一次,尽管good()可能被调用多次。
下面这个是不好的
let bad() =
let r = System.Random()
r.Next()
具有签名unit -> int。类似于问题中的一行。这里的let r = System.Random()将在每次调用bad()时执行。