上下文:
def fib(n): if n < 2: return 1 return fib(n-1) + fib(n-2)
可以通过记忆加速:
fib_memo = {} def fib(n): if n < 2: return 1 if not fib_memo.has_key(n): fib_memo[n] = fib(n-1) + fib(n-2) return fib_memo[n]
这种 memoization 的实现技术在许多编程语言中被广泛使用,但它不能直接应用于 Haskell,因为 Haskell 是纯粹的,我们不想仅仅为了 memoize 函数而引入杂质。幸运的是,由于 Haskell 的惰性求值特性,可以记住一个没有副作用的函数。
以下
memoize
函数采用类型函数Int -> a
并返回同一函数的记忆版本。诀窍是将函数转换为值,因为在 Haskell 中,函数不是被记忆的,但值是被记忆的。
问题:
- 函数式编程中的函数和值不一样吗?
- 缓存如何不被视为副作用(在纯函数的上下文中)