【发布时间】:2010-07-08 17:43:27
【问题描述】:
我定义了以下函数:
ex 1 x = 1
ex 0 x = 0
ex b x = b ** x
然后,当我执行以下操作时:
1 `ex` (sum [1..])
它尝试计算无限序列的总和,而不是偷懒返回1。为什么?
编辑:经过进一步调查,我发现如果我在文件中定义 ex 函数会发生惰性,但如果我在 GHCI 中定义它则不会:
$ ghci
GHCi, version 6.8.2: http://www.haskell.org/ghc/ :? for help
Loading package base ... linking ... done.
Prelude> let ex 1 x = 1
Prelude> let ex b x = b ** x
Prelude> ex 1 (sum [1..])
<interactive>: out of memory (requested 1048576 bytes)
如果我将 ex 定义拉入文件(在本例中为 test.hs):
$ ghci
GHCi, version 6.8.2: http://www.haskell.org/ghc/ :? for help
Loading package base ... linking ... done.
Prelude> :load test.hs
[1 of 1] Compiling Main ( test.hs, interpreted )
Ok, modules loaded: Main.
*Main> ex 1 (sum [1..])
1.0
那么,新的问题是为什么?
【问题讨论】:
-
不,1
ex(sum [1..]) 在我的电脑上返回 1.0。什么版本的 ghc 等?你得到与 ex 1 (sum [1..]) 相同的结果吗? -
@ShreevatsaR:好点,见我上面的更新。
标签: haskell lazy-evaluation ghci