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

Caching FSharp无参数函数缓存,它总是缓存吗?,caching,f#,Caching,F#,据 F#自动缓存任何不带 参数 那么,这是为什么 let random() = System.Random().Next() 随机单位->整数 我希望每次调用random()时,输出值都被缓存并返回相同的int。F#3.0规范没有这样说 纯函数式语言可以进行这种“替换”(通常称为“引用透明”),因为在纯函数式语言中,函数只不过是它的单个参数和单个返回值。不用说,F#不是一种纯粹的函数式语言 然而,无论如何,这不是这里的问题random不是一个没有参数的函数。它接受单个参数(类型为unit),并

F#自动缓存任何不带 参数

那么,这是为什么

let random() = System.Random().Next()
随机单位->整数 我希望每次调用random()时,输出值都被缓存并返回相同的int。

F#3.0规范没有这样说

纯函数式语言可以进行这种“替换”(通常称为“引用透明”),因为在纯函数式语言中,函数只不过是它的单个参数和单个返回值。不用说,F#不是一种纯粹的函数式语言

然而,无论如何,这不是这里的问题
random
不是一个没有参数的函数。它接受单个参数(类型为
unit
),并返回一个整数。正如您所指出的,random的签名是
unit->int
——这与没有参数的函数完全不同,后者的签名是
int
;换言之,是一个当地人


当函数获取或返回
unit
(或
void
)时,不应将其记忆-这是该方法具有副作用的明显迹象。这不是一个固定的规则,但是…

似乎正确的编码方法是

let good = 
    let r = System.Random()
    fun () -> r.Next()
这有签名(单位->整数)。行let r=System.Random()将只执行一次,即使good()可能会被多次调用

这是不好的

let bad() =       
    let r = System.Random()   
    r.Next()

这有签名单位->整数。类似于问题中的一行。在这里,每次调用bad()时,都会执行行let r=System.Random()。

Random()
获取参数
()
,即
单位。您混淆了函数和变量
let random=System.random().Next()
初始化一个变量
random
,该变量将在多次调用时返回相同的值。
FSharp应该自动缓存任何不带参数的函数的值。
[需要引用](不,不是F#上的权威源)为什么你认为F#应该自动缓存函数结果?(我不想嘲笑你-我真的想知道你是从哪里得到这封信的,以便尝试摆脱这封信中的信息)@Luaan我添加了一条引文,这样你就可以看出我在哪里感到困惑了。我承认我是V.B.你已经注意到这是一个需要单位的函数,所以它不是无参数的,但我现在感到困惑,F#缓存无参数函数吗?如果有无参数函数,你指的是值,那么是的。。。如果您是指从
()
到no@Luaan ... 我认为我们不应该称之为回忆录——我想你说的是here@Carsten好吧,这稍微严格一点,但我想它更合适。@HedgeHogFace您仍然处于启动时的混乱状态-无参数函数是一个值。每次执行
let i=3
,都会创建一个新的无参数函数,返回
3
。如果你不研究这背后的代数,我可以看出这是多么令人困惑——将无参数函数等同于简单值是一种合理的简化,如果你不想深入研究数学的话,你可以采用这种简化。