2008/04/09

一百萬

突然想測試一下 Haskell 跑得有多快(或是有多慢),所以進 GHCi:

Prelude> [1..] !! 1000000
*** Exception: stack overflow
啥?XD 為了確定不是 interpreter 太嫩,我用 ghc 編譯了我的第一份 native code:
main = putStr (show ([1..] !! 1000000))
執行結果是
Stack space overflow: current size 8388608 bytes.
Use `+RTS -Ksize' to increase it.
所以還真的滿出來了!(!!) 的正常定義應該是
(!!) : [a] -> Int -> a
(x : xs) !! 0       = x
(x : xs) !! (1 + n) = xs !! n
看起來是 tail recursion 呀,為什麼會 stack overflow 勒?是 [1..] 的關係?

--
ghc -C 產出來的 C code 看不懂 XD。

Labels:

Blogger Thundermyth O.4/09/2008 2:03 pm 說:

看到標題我還以為你解出RSA拿到一百萬美金的獎金咧

XD

 
Anonymous Anonymous4/22/2008 3:24 am 說:

可能是type inference得到的type是Integer,記憶體過大
幾個實驗如下

([1..]::[Integer])!!1000000
*** Exception: stack overflow

([1..]::[Int])!!1000000
1000001

-- 1e9 可能要花一兩分吧
([1..]::[Int])!!1000000000
1000000001

 
Blogger Josh Ko4/22/2008 10:44 am 說:

喔,看起來很合理!謝謝解惑 :)。

 

<< 回到主頁