【发布时间】:2017-11-03 15:31:41
【问题描述】:
例如,说这是我的功能:
let fib = n => {
switch (n) {
case 0: return 0
case 1: return 1
default: return fib(n - 1) + fib(n - 2)
}
}
然后我可以实现一个基本的记忆功能...
let memoize = fn => {
let cache = new Map // mutates!
return _ => {
if (!cache.has(_)) {
cache.set(_, fn(_))
}
return cache.get(_)
}
}
...并用它来实现一个记忆化的fib:
let fib2 = memoize(n => {
switch (n) {
case 0: return 0
case 1: return 1
default: return fib2(n - 1) + fib2(n - 2)
}
})
但是,memoize 函数在内部使用可变状态。我可以将memoize 重新实现为一个monad,所以每次我们调用fib 时它都会返回一个[value, fib] 的元组,其中fib 现在在缓存中有一些东西,而原始的fib 保持不变。
monad 方法的缺点是它不是惯用的 JavaScript,而且如果没有静态类型系统就很难使用。
是否有其他方法可以实现 memoize 函数,避免突变,而不求助于单子?
【问题讨论】:
-
考虑到给定的答案,如果 Javascript 有一个非严格的评估策略是可能的
标签: javascript types functional-programming computer-science monads