我刚开始学习 Haskell,了解到它基本上是一种纯函数式语言,这有一个优点,即函数的结果在多次计算中不会改变。鉴于此,我对为什么不能轻松地标记一个函数,以便它记住其第一次计算的结果,并且每次需要其值时不必重新计算感到困惑。
例如,在 Mathematica 中,有一个简单的习惯用法可以实现这个功能:
但是在Haskell中,我发现最接近的东西类似于某些东西。
这是从这个问题中发展而来的,其中缺乏这个功能导致了可怕的性能问题。
例如,在 Mathematica 中,有一个简单的习惯用法可以实现这个功能:
f[x_]:=f[x]= ...
但是在Haskell中,我发现最接近的东西类似于某些东西。
f' = (map f [0 ..] !!)
where f 0 = ...
f n = f' ...
除了不太清晰(并且显然仅限于Int
参数?),它似乎不能在交互会话中保留结果。
必须承认(并且很明显),我不完全理解这里发生了什么;但是天真地说,Haskel似乎应该有一种方法,在函数定义级别利用其函数的“函数性质”,一旦计算出结果就跳过其结果的重新计算,并以简单干净的方式表达对此的愿望。
- 有没有办法在Haskell中实现这一点?我有点明白Haskell不能将评估结果存储为“状态”,但是为什么它不能简单地(实际上)重新定义已评估的函数为它们的计算值呢?
这是从这个问题中发展而来的,其中缺乏这个功能导致了可怕的性能问题。