Functional programming 如何在序列上使用memoize
它抛出了一个错误Functional programming 如何在序列上使用memoize,functional-programming,Functional Programming,它抛出了一个错误 let seq1 = seq { 1 .. 10 } isCached seq1 即使返回printfn,我也希望我的函数能正常工作。有可能做到这一点吗?在向缓存中添加值时,给tuple赋予相同的值是否合适 例如: 我认为问题在于memoize函数实际上没有将源序列中的项作为返回序列的下一个元素返回。您的版本仅将项目添加到缓存中,但随后将返回unit。您可以通过以下方式解决此问题: | false,_ -> cache.Add(i ,i) let memoize(se
let seq1 = seq { 1 .. 10 }
isCached seq1
即使返回printfn,我也希望我的函数能正常工作。有可能做到这一点吗?在向缓存中添加值时,给tuple赋予相同的值是否合适
例如:
我认为问题在于
memoize
函数实际上没有将源序列中的项作为返回序列的下一个元素返回。您的版本仅将项目添加到缓存中,但随后将返回unit
。您可以通过以下方式解决此问题:
| false,_ -> cache.Add(i ,i)
let memoize(sequence:seq我认为问题在于memoize
函数实际上并没有将源序列中的项作为返回序列的下一个元素返回。您的版本只将项添加到缓存中,然后返回unit
。您可以通过编写以下命令来解决此问题:
| false,_ -> cache.Add(i ,i)
let memoize(sequence:seqTomas p击败了我,但我还是会把它贴出来,以防万一有用
我不太确定你想在这里实现什么,但我会说一些我认为可能有用的事情
首先是类型错误。您的isCached
函数定义为获取类型为'a的seq,并返回类型为'a的seq。如您在问题中所述,现在它获取类型为'a的seq,并返回类型单位序列。如果您尝试将输出规范修改为seq)=
让缓存=字典()
因为我按顺序做
将cache.TryGetValue i与
|true,v->printf“缓存”
|false,->cache.Add(i,i)
隐藏物
让isCached(输入:seq=记忆输入
尽管如此,如果您希望多次迭代相同的序列,那么最好只使用库函数
最后,关于使用值作为字典中的键…没有什么可以阻止你这样做,但这实际上是毫无意义的。如果你已经有了值,那么你不需要在字典中查找它。如果你只是想记住序列,那么就使用给定元素的索引作为键。或者使用特定的输入作为键,使用该输入的输出作为值。Tomas p击败了我,但我还是会发布这个,以防万一
我不太确定你想在这里实现什么,但我会说一些我认为可能有用的事情
首先是类型错误。您的isCached
函数定义为获取类型为'a的seq,并返回类型为'a的seq。如您在问题中所述,现在它获取类型为'a的seq,并返回类型单位序列。如果您尝试将输出规范修改为seq)=
让缓存=字典()
因为我按顺序做
将cache.TryGetValue i与
|true,v->printf“缓存”
|false,->cache.Add(i,i)
隐藏物
让isCached(输入:seq=记忆输入
尽管如此,如果您希望多次迭代相同的序列,那么最好只使用库函数
最后,关于使用值作为字典中的键…没有什么可以阻止你这样做,但这实际上是毫无意义的。如果你已经有了值,那么你不需要在字典中查找它。如果你只是想记住序列,那么就使用给定元素的索引作为键。或者使用特定输入作为键,该输入的输出作为值。您需要显示
isCached
的主体,它应该类似于:let isCached(输入:seq=memoize inputAlso编辑我的问题您需要显示isCached
的主体,它应该类似于:let isCached(输入:seq=备忘录化输入以便编辑我的问题
"The type int does not match the type unit"
| false,_ -> cache.Add(i ,i)
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 }
let memoize (sequence: seq<'a>) =
let cache = Dictionary()
for i in sequence do
match cache.TryGetValue i with
| true, v -> printf "cached"
| false,_ -> cache.Add(i ,i)
cache
let isCached (input:seq<'a>) : seq<'b> = memoize input