【发布时间】:2011-04-04 08:26:38
【问题描述】:
继续通过 Haskell 研究 CRC,我编写了以下代码来生成用于 CRC32 计算的表:
crc32Table = listArray (0, 255) $ map (tbl 0xEDB88320) [0..255]
tbl polynomial byte = (iterate f byte) !! 8
where f r = xor (shift r (-1)) ((r .&. 1) * polynomial)
这会正确生成表格。我想频繁访问此表,但 1) 不想将结果硬编码为代码,并且 2) 不想每次引用此表时都重新计算它。
如何在 Haskell 中记忆这个数组? Haskell 记忆页面没有给我任何线索。
【问题讨论】:
-
不确定你的问题是什么:crc32Table 已经是记忆化的 tbl 函数了。
-
真的吗?如何判断它是否已被记忆?
-
记忆是通过数据结构索引函数的参数的过程。数组已经是一种数据结构,所以记忆没有任何意义。
-
@Muchin - 除非 crc32Table 是一个函数或类似 Num a => Array a 的东西,否则你可以确定它只计算一次。
-
但是你不调用 crc32Table,你只是索引它。只要您可以引用它,顶层的任何内容都会持续存在。
标签: haskell memoization