gpt4 book ai didi

haskell - 在未装箱的向量上内存函数会导致其挂起

转载 作者:行者123 更新时间:2023-12-03 06:18:15 25 4
gpt4 key购买 nike

我正在使用一个相当简单的程序来处理向量和未装箱的向量。我正在枚举所有因数只有 2,3 和 5 的整数。

我想我应该尝试通过 Data.Vector 来内存它,这很有效,而且非常简单。所以我想我应该尝试Data.Vector.Unboxed。但是,当 z 为 [0..5] 时,它会挂起,但当 z 为 [0..4] 时,它不会挂起,我不确定为什么。两者的区别在于5涉及到相互递归调用。

这里出了什么问题?

import Data.Vector.Unboxed as UV

memoisingCandidateUV :: UV.Vector Bool
memoisingCandidateUV = UV.map isCandidateUV z

isCandidateUV :: Int -> Bool
isCandidateUV 0 = False
isCandidateUV n
| n2r == 0 = n2q == 1 || memoisingCandidateUV UV.! n2q
| n3r == 0 = n3q == 1 || memoisingCandidateUV UV.! n3q
| n5r == 0 = n5q == 1 || memoisingCandidateUV UV.! n5q
| otherwise = False
where
(n2q, n2r) = n `quotRem` 2
(n3q, n3r) = n `quotRem` 3
(n5q, n5r) = n `quotRem` 5

最佳答案

所有未装箱的容器都是深度严格的,这意味着您不能将它们用于惰性内存:在任何元素可作为内存进行访问之前,您必须所有这些 em> 评估。

至于为什么会这样:当你在 Haskell 中有一个普通的惰性重击时,它是一个盒子,它携带着关于该值的信息,现在尚未在 NF 中,但是以便您可以执行这段代码。完成之后,该框基本上只是指向结果的指针。
这在许多情况下都是一个很大的帮助,但它并不是为了释放内存或性能:这正是未装箱容器通过直接将结果信息存储在紧密数组中而消除的开销.

关于haskell - 在未装箱的向量上内存函数会导致其挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24530156/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com