Haskell 在顶层,结果将保留在内存中

Haskell 在顶层,结果将保留在内存中,haskell,Haskell,我正在翻阅这本书,目前,我正在努力理解这本回忆录 它显示以下记忆功能: fib_mem :: Int -> Integer fib_mem = (map fib [0..] !!) where fib 0 = 1 fib 1 = 1 fib n = fib_mem (n-2) + fib_mem (n-1) 书中说: 因此,如果在顶层定义fib_mem,结果将持续存在 在程序本身的整个生命周期中都有内存 “在顶层定义”是什么意思?顶层是源代码文件的同义词,或者

我正在翻阅这本书,目前,我正在努力理解这本回忆录

它显示以下记忆功能:

fib_mem :: Int -> Integer
fib_mem = (map fib [0..] !!)
where fib 0 = 1
      fib 1 = 1
      fib n = fib_mem (n-2) + fib_mem (n-1)  
书中说:

因此,如果在顶层定义fib_mem,结果将持续存在 在程序本身的整个生命周期中都有内存


“在顶层定义”是什么意思?

顶层是源代码文件的同义词,或者如果使用源代码文件,它是其最外层的作用域-它是全局作用域

传统上,在Lisp中,加载源代码文件就像通过在REPL中逐个键入顶级语句来执行它的顶级语句一样


另请参见:

顶级是源代码文件的同义词,或者如果使用源代码文件,则它是其最外部的作用域-它是全局作用域

传统上,在Lisp中,加载源代码文件就像通过在REPL中逐个键入顶级语句来执行它的顶级语句一样


另请参见:

我相信这意味着它在全局范围内,而不是在let或where子句或类似的局部表达式内。我相信这意味着它在全局范围内,而不是在let或where子句或类似的局部表达式内。fwiw我相信,要将fib_mem记录下来,除了作为顶级声明外,它还必须是CAF。因此,这本书并不像它本可以做到的那样精确@莱恩里奇:你完全正确。有了这些看起来几乎是自己出版的书,这永远是一场赌博。-我相信,它也必须有一个单一的类型,正如我链接IIRC的条目中所讨论的。Packt基本上是一个书厂。FWIW我相信,对于fib_mem的记忆,它必须是一个CAF,除了是一个顶级声明之外。因此,这本书并不像它本可以做到的那样精确@莱恩里奇:你完全正确。有了这些看起来几乎是自己出版的书,这永远是一场赌博。-我相信,它也必须有一种单模态类型,正如我链接IIRC的条目中所讨论的。Packt基本上是一个书厂。