如何确定Haskell中是否正在记忆函数?

Chr*_*ski 6 haskell memoization

我有一个Haskell程序执行非线性性能(更差O(n)).

我正在尝试调查是否在函数上进行了memoization,我可以验证这个吗?我熟悉GHC分析 - 但我不太确定我应该关注哪些值?

解决方法也只是插入一些值并观察执行时间 - 但这并不理想.

Tho*_*ler 1

据我所知,Haskell 中没有自动记忆功能。

也就是说,GHC 中似乎有一个优化,可以缓存无参数函数的值,如下所示

rightTriangles = [ (a,b,c) | 
    c <- [1..], 
    b <- [1..c], 
    a <- [1..b], 
    a^2 + b^2 == c^2]
Run Code Online (Sandbox Code Playgroud)

如果您在 GHCi 中尝试以下两次,您会发现第二次调用要快得多:

ghci > take 500 rightTriangles
Run Code Online (Sandbox Code Playgroud)

  • Haskell 中不存在“无参数函数”这样的东西。`rightTriangles` 只是一个列表。惰性意味着列表中的各个“值”仅根据需要计算。当您第一次调用“take 500 rightTriangles”时,必须实际计算前 500 个值(以便实际显示这些值)。对于第二次调用,前 500 个值当然仍在内存中。 (7认同)