如何保存功能的结果?

时间:2017-06-10 18:07:54

标签: function haskell

只是一个普遍的问题:

我对Haskell很新(以及一般的编程),我想知道如何保存函数的结果,无论函数的执行频率如何。当我执行我的函数时,我希望将结果保存在某个地方,这样无论我多久调用具有不同参数的函数,我都可以访问以前的所有结果。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:2)

我想你要问的是,如何记忆一个功能。记忆意味着当一个(可能是昂贵的)函数曾经用一些参数x,y,z进行评估并且稍后再次使用完全相同的参数进行评估时,处理器实际上不再需要再次执行所有计算但只是在某种表格中查找结果。

这样做有简单的库。使用MemoTrie

import Data.MemoTrie

f :: Int -> Int
f x = ... -- some expensive computation

fm :: Int -> Int
fm = memo f

现在,如果你连续两次致电f 0,它将花费很长时间才能完成。 OTOH,fm 0只会在第一次使用很长时间,第二次它会立即给出结果。

如果您知道只想使用f备忘录,您也可以立即以这种方式定义:

f :: Int -> Int
f = memo $ \x -> ...

Int -> Int只是一个示例签名。这样一个函数的结果可以有你想要的任何类型,参数也可以是任何“离散”类型(任何整数,元组,字符串......)。

与大多数此类库一样,

MemoTrie只会将结果存储在RAM中。因此,当你的程序存在并且你把它全新启动时,记忆结果将会消失,毕竟需要重新计算。持续存储持久的结果更为复杂。我不知道有任何库以自动方式执行此操作。有点问题的是,已经尝试过哪些参数的状态实际上并不是Haskell语义的一部分。

我最近涉及一个项目,它做了一些非常相关的事情。

https://github.com/leftaroundabout/lazy-hash