小编csc*_*atz的帖子

部分应用与模式匹配:为什么这些 Haskell 函数的行为不同?

我试图了解有关 Haskell 函数的一些内容。

首先,这是一个以典型的“慢”方式定义的斐波那契函数(即没有记忆的递归,也没有无限列表技巧)

slowfib :: Int -> Integer
slowfib 0 = 0
slowfib 1 = 1
slowfib n = slowfib (n-2) + slowfib (n-1)
Run Code Online (Sandbox Code Playgroud)

接下来,相同的规范记忆版本。(仅与教程/书籍/等中的典型示例略有不同,因为我更喜欢!!运算符的前缀版本。)

memfib = (!!) (map fib [0..])
  where
    fib 0 = 0
    fib 1 = 1
    fib k = memfib(k-2) + memfib(k-1)
Run Code Online (Sandbox Code Playgroud)

上面的解决方案使用了!!运算符的部分应用,这是有道理的:我们希望memfib最终成为一个带参数的函数,并且我们正在定义它而不在定义中包含参数。

到现在为止还挺好。现在,我想我可以编写一个等效的记忆函数,在定义包含一个参数,所以我这样做了:

memfib_wparam n = ((!!) (map fib [0..])) n
  where
    fib 0 = 0
    fib 1 = 1
    fib k = memfib_wparam(k-2) + memfib_wparam(k-1) …
Run Code Online (Sandbox Code Playgroud)

haskell functional-programming memoization partial-application fibonacci

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