【问题标题】:Memoizing a Haskell Array记忆一个 Haskell 数组
【发布时间】: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


【解决方案1】:

这个问题的讨论应该有助于解释发生了什么:When is memoization automatic in GHC Haskell?

正如人们在 cmets 中所说,crc32Table,如果它是单态类型,应该只计算一次并保留。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-11
    • 1970-01-01
    • 2011-07-29
    • 1970-01-01
    • 2020-10-25
    • 2011-03-13
    • 2018-09-08
    相关资源
    最近更新 更多