相关疑难解决方法(0)

Data.MemoCombinators如何工作?

我一直在寻找Data.MemoCombinators的来源,但我无法真正看到它的核心位置.

请向我解释所有这些组合器背后的逻辑以及它们如何在实际编程中加速您的程序实际工作的机制.

我正在寻找这个实现的细节,并可选择与其他Haskell方法进行比较/对比来进行memoization.我理解什么是memoization,而不是在寻找它的工作原理.

haskell combinators memoization

38
推荐指数
3
解决办法
2911
查看次数

关于改进Has​​kell在Fibonacci微基准测试中与C相比的性能

我遇到了这个问题,它比较了各种编译器在计算斐波那契数字时的表现.

我尝试用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)

performance haskell ghc micro-optimization microbenchmark

14
推荐指数
3
解决办法
2703
查看次数

Scala中的call-by-name与Haskell中的懒惰评估?

Haskell的懒惰评估永远不会比急切的评估采取更多的评估步骤.

另一方面,Scala的逐个名称评估可能需要比按值调用更多的评估步骤(如果短路效益大于由重复计算的成本抵消).

我认为按名称呼叫大致相当于懒惰的评估.为什么那么时间上的这种差异保证了?

我猜测也许Haskell语言指定在评估期间必须使用memoization; 但在那种情况下,为什么Scala不这样做呢?

evaluation haskell scala lazy-evaluation

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

在Haskell中多次(不必要地)评估共享值

我读了这个答案,这听起来像评估共享值时,只评估一次,然后存储结果.例如:

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每次引用时都会进行评估.

haskell

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