我试图理解“按需调用”背后的定理。我确实理解定义,但我有点困惑。我想看一个简单的例子,它展示了按需调用的工作原理。
在阅读了一些以前的线程后,我发现 Haskell 使用这种评估。是否有任何其他编程语言支持此功能?
我阅读了 Scala 的按名称调用,我确实理解按名称调用和按需要调用是相似的,但由于按需要调用将保留评估值这一事实而有所不同。但我真的很想看到一个真实的例子(它不必在 Haskell 中),它显示了按需调用。
最佳答案
功能
say_hello numbers = putStrLn "Hello!"
忽略其
numbers
争论。下 call-by-value语义,即使参数被忽略,函数调用位置的参数也可能需要被评估,这可能是因为程序的其余部分所依赖的副作用。在 Haskell 中,我们可以调用
say_hello
作为say_hello [1..]
哪里
[1..]
是自然数的无限列表。在按值调用语义下,CPU 会试图构建一个无限列表并且永远不会到达 say_hello
根本!Haskell 只是输出
$ runghc cbn.hs
Hello!
对于不太戏剧化的例子,前十个自然数是
ghci> take 10 [1..]
[1,2,3,4,5,6,7,8,9,10]
前十个赔率是
ghci> take 10 $ filter odd [1..]
[1,3,5,7,9,11,13,15,17,19]
下 call-by-need语义上,每个值——即使是上面例子中概念上无限的值——仅在需要的范围内进行评估,仅此而已。
关于r - 按需调用的简单示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54261834/