这个Haskell函数是否会记忆?

时间:2016-07-03 05:41:23

标签: haskell memoization

我想预先计算一些在我需要进一步查找时使用的值。我想出了以下内容:

let lc = lcgen "some sentence with a lot of words"
lc 0 0 -- == 4
lc 0 1 -- == 13

该函数实质上返回两个单词之间使用的字符数。我用它如下:

lengths

在此实现中,for colour in colours: print("{}:\t {}".format(colour, quantities[colour])) 向量是否会被记忆化?此外,我如何知道和/或确认这一点?

2 个答案:

答案 0 :(得分:1)

在这种情况下,lengths显然无法被记忆,因为它取决于外部函数的参数,这就是每次调用该函数时重新生成它的原因。

如果没有这种依赖,它本可以被记忆。要检查是否发生了这种情况,您可以使用评论中建议的方法之一。为了确保记忆确实发生,您可以使用标准方法使用NOINLINE编译指示将所需的部分提取到顶级。如,

{-# NOINLINE lengths #-}
lengths :: Vector Int
lengths =
  error "define me"

答案 1 :(得分:1)

如果您向lengths添加trace,请执行以下操作:

lengths = trace "building list..." $ V.fromList ...

每次计算lengths值时,您都会看到输出

因为它只应按lc = lcgen s

评估/构建一次