小编Mes*_*ers的帖子

Haskell 中的记忆

上下文

def fib(n):
    if n < 2: return 1
    return fib(n-1) + fib(n-2)
Run Code Online (Sandbox Code Playgroud)

可以通过记忆加速:

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]
Run Code Online (Sandbox Code Playgroud)

这种记忆化的实现技术在许多编程语言中被广泛使用,但它不能直接应用于 Haskell,因为 Haskell 是纯的,我们不想为了记忆一个函数而引入杂质。幸运的是,由于 Haskell 的惰性求值特性,可以在没有副作用的情况下记住一个函数。

以下memoize函数采用类型函数Int -> a 并返回同一函数的记忆版本。诀窍是将函数转换为值,因为在 Haskell 中,函数不会被记忆,但会被记忆。

问题:

  1. 函数式编程中的函数和值不是一样的吗?
  2. 缓存如何不被视为副作用(在纯函数的上下文中)

haskell functional-programming memoization lazy-evaluation pure-function

1
推荐指数
1
解决办法
179
查看次数