【发布时间】:2011-07-02 03:25:49
【问题描述】:
我最近遇到了一个有趣但令人讨厌的 F Sharp 行为。根据 [1],“F# 会自动缓存任何不带参数的函数的值。”这似乎是个好主意,但是当我尝试提出一个包装函数来生成随机数时,它给我带来了问题。
例如,我在这个问题末尾的代码中有两个不同的函数。第一个函数“getRand”没有参数,但不幸的是它总是返回相同的数字。第二个函数“getRand2”的工作原理和我期望的一样,每次调用它时都会生成一个新的随机数,但令人讨厌的是它需要一个无用且被忽略的额外参数。
如果可能的话,我希望拥有 getRand2 的功能,但同时拥有 getRand 的便利性。是否有我可以应用到 getRand 的编译器指令或特殊关键字来关闭其函数缓存功能,从而使其行为类似于 getRand2?
感谢,
肖恩
注意:如果答案已经出现在 [1] 中,请原谅,我只是现在没有看到它。
[1] - http://en.wikibooks.org/wiki/F_Sharp_Programming/Caching
(* Always returns the same number *)
let getRand =
let seed = int32(System.DateTime.Now.Ticks)
let randGen = new System.Random(seed)
randGen.Next()
(* Works as expected except I need an annoying extra parameter *)
let getRand2 dummyParam =
let seed = int32(System.DateTime.Now.Ticks)
let randGen = new System.Random(seed)
randGen.Next()
(* Outputs three "identical" numbers to console *)
System.Console.WriteLine(
"Parameterless getRand always outputs same number.")
System.Console.WriteLine(getRand)
System.Threading.Thread.Sleep(100)
System.Console.WriteLine(getRand)
System.Threading.Thread.Sleep(100)
System.Console.WriteLine(getRand)
System.Console.WriteLine()
(* Outputs three "different" numbers to console *)
System.Console.WriteLine(
"GetRand2 works as expected even though second dummy param is always the same.")
System.Console.WriteLine(getRand2 0)
System.Threading.Thread.Sleep(100)
System.Console.WriteLine(getRand2 0)
System.Threading.Thread.Sleep(100)
System.Console.WriteLine(getRand2 0)
System.Console.WriteLine()
【问题讨论】:
标签: f# memoization