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

时间:2015-09-01 13:50:06

标签: caching f#

根据http://en.wikibooks.org/wiki/F_Sharp_Programming/Caching

  

F#自动缓存任何不需要的函数的值   参数

那为什么会这样呢?

let random() = System.Random().Next()

随机是单位 - > INT 我希望每次调用random()时都会缓存输出值并返回相同的int。

2 个答案:

答案 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()行。