gpt4 book ai didi

haskell - 过滤器 foo [2..n] 的内存使用! 0

转载 作者:行者123 更新时间:2023-12-02 06:57:05 25 4
gpt4 key购买 nike

假设我有以下功能

small_div :: Int -> Int
small_div n = filter (\x -> n `rem` x == 0) [2..n] !! 0

这个函数占用的内存是多少?等效的 C 代码将是恒定的内存使用,我相信 Haskell 的惰性评估意味着它不会创建比找到第一个除数所需的更多的 [2..n] 元素,但是 ghc 足够聪明以进行跳跃像...

int small_div(int n) {
for (int x = 2; x <= n; x++) {
if (n % x == 0) {
return x;
}
}
}

最佳答案

GHC 7.10 和 7.8.4(我测试的版本)足够智能,可以跳转到您的优化示例。

我从互联网上查找了两个素数,15485863 和 67867967。当我使用 +RTS -s 标志编译并运行 main = print $ small_div 15485863 时,我的总数堆分配为 51 Kb。当我用 67867967 运行相同的程序时,我也得到了 51 Kb 的分配。这意味着没有为列表的生成和过滤分配单元格。

它很可能被所谓的foldr/build优化了融合(filterenumFromTo for Int -s 都参与这种融合)。

关于haskell - 过滤器 foo [2..n] 的内存使用! 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29270658/

25 4 0
文章推荐: perl - 仅从 fasta 文件中提取第一个序列
文章推荐: arrays - 矢量化- Matlab
文章推荐: php - 将 元素包装在