Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Caching 缓存函数结果f#_Caching_F# - Fatal编程技术网

Caching 缓存函数结果f#

Caching 缓存函数结果f#,caching,f#,Caching,F#,例如,我有一个函数,它的参数是常量 let is_prime x = (test) 但是它相当大而且很慢。因此,我希望它的结果只被计算一次,而我可以随时调用它 我试着用非函数式语言的方式来实现: let _is_prime x = (test) let mutable _is_prime_primes = [] let mutable _is_prime_tested = [] let is_prime x = if List.exists (fun el -> el = x

例如,我有一个函数,它的参数是常量

let is_prime x = (test)
但是它相当大而且很慢。因此,我希望它的结果只被计算一次,而我可以随时调用它

我试着用非函数式语言的方式来实现:

let _is_prime x = (test)

let mutable _is_prime_primes = []
let mutable _is_prime_tested = []

let is_prime x =
    if List.exists (fun el -> el = x) _is_prime_primes then
        true
    else
        if List.exists (fun el -> el = x) _is_prime_tested then
        false
    else 
        let result = _is_prime x
        if result then _is_prime_primes <- x :: _is_prime_primes
        _is_prime_tested <- x :: _is_prime_tested
        result
let_是_素数x=(测试)
设可变_为_素数_素数=[]
设可变_为_质数_测试=[]
设为_素数x=
如果List.exists(fun el->el=x)\u是素数\u素数,那么
真的
其他的
如果List.exists(fun el->el=x)\u被测试
假的
其他的
设result=_为_素数x

如果结果是_是_prime _primes这里是链接。

我在FSI中测试这一点有困难,但在正常的F#项目中应该可以


调用
fast 1
会在您第一次调用它时导致第二次睡眠。每次使用相同参数的连续调用都会立即返回值。

噢,延迟初始化。非常感谢。这不是一个函数,而是数据,这是关键point@ebb真遗憾:(立即删除答案。@从2021年开始,指向cs.hubbs.net的第一个链接似乎重定向到一个意图可疑的网页。您可能想删除它,只保留存档链接。@Grupyrodriguez感谢您的报告,删除了链接。谢谢!实际上我创建了一个序列并将其放入|>Seq.cache。您的函数是什么也很好,谢谢,我会用它来做其他的事情。请看关于备忘录的回答:
let cache f =
    let dict = new Dictionary<_,_>()
    fun n ->
        if dict.ContainsKey(n) then dict.[n]
        else
            let r = f n
            dict.[n] <- r
            r
let slow n = // 'a -> 'a
    System.Threading.Thread.Sleep(1000)
    n

let fast = cache slow // 'a -> 'a