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