我一直在寻找Data.MemoCombinators的来源,但我无法真正看到它的核心位置.
请向我解释所有这些组合器背后的逻辑以及它们如何在实际编程中加速您的程序实际工作的机制.
我正在寻找这个实现的细节,并可选择与其他Haskell方法进行比较/对比来进行memoization.我理解什么是memoization,而不是在寻找它的工作原理.
我遇到了这个问题,它比较了各种编译器在计算斐波那契数字时的表现.
我尝试用Haskell做这个,看看它与C的比较.
C代码:
#include <stdio.h>
#include <stdlib.h>
int fib (int n) {
if (n < 2) return 1;
return fib (n-1) + fib (n-2);
}
int main (int argc, char* argv[]) {
printf ("%i\n", fib (atoi(argv[1])));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
结果:
> gcc -O3 main.c -o fib
> time ./fib 40
165580141
real 0m0.421s
user 0m0.420s
sys 0m0.000s
Run Code Online (Sandbox Code Playgroud)
哈斯克尔:
module Main where
import System.Environment (getArgs)
fib :: Int -> Int
fib n | n < 2 = 1
| …Run Code Online (Sandbox Code Playgroud) 我读了这个答案,这听起来像评估共享值时,只评估一次,然后存储结果.例如:
x = 2 + 2
y = 2 + x
z = 3 + x
Run Code Online (Sandbox Code Playgroud)
在这里,x被评估一次,然后存储为4,并且永远不会再次评估?至少这是我的假设.我的代码有一个值,每次引用时都会重新计算.这是纯粹的价值.什么时候会发生这种情况,我怎样才能强制Haskell在计算出值后记住它?
例:
x = [1, 1, 2]
count = fst $ getCounts x
Run Code Online (Sandbox Code Playgroud)
在这里,count每次引用时都会进行评估.