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)
我认为问题是你的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而不是->因为我认为这使代码更具可读性.通过此更改,代码按预期运行.