如何使用memoize重复序列

wol*_*olf 1 functional-programming

let memoize (sequence: seq<'a>) =
    let cache = Dictionary()
    seq {for i in sequence -> 
         match cache.TryGetValue i with
         | true, v -> printf "cached"
         | false,_ -> cache.Add(i ,i)
    }
Run Code Online (Sandbox Code Playgroud)

我将在此函数中调用memoize函数:

let isCached (input:seq<'a>) : seq<'a> = memoize input
Run Code Online (Sandbox Code Playgroud)

如果给定的序列项被缓存,则应该打印缓存,否则它将继续向缓存添加序列值.

现在我有类型的问题.

当我尝试像这样调用我的函数时:

let seq1 = seq { 1 .. 10 }
isCached seq1
Run Code Online (Sandbox Code Playgroud)

它抛出一个错误

"The type int does not match the type unit"
Run Code Online (Sandbox Code Playgroud)

即使我返回printfn,我希望我的函数能够工作.是否有可能实现这一目标?虽然向缓存添加值是否适合为元组赋予相同的值?

例如:

| false,_ -> cache.Add(i ,i)
Run Code Online (Sandbox Code Playgroud)

Tom*_*cek 5

我认为问题是你的memoize函数实际上并没有将源序列中的项作为返回序列的下一个元素返回.您的版本只将项添加到缓存中,但随后返回unit.你可以通过写:

let memoize (sequence: seq<'a>) =
    let cache = Dictionary()
    seq {for i in sequence do
           match cache.TryGetValue i with
           | true, v -> printf "cached"
           | false,_ -> cache.Add(i ,i)
           yield i }
Run Code Online (Sandbox Code Playgroud)

我使用显式yield而不是->因为我认为这使代码更具可读性.通过此更改,代码按预期运行.