FSharp无参数函数缓存,它总是缓存吗?



根据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()时执行。

最新更新