問題は最後の要素を見つけることです。それはよく動作しますInteger型。 Int型でオーバーフローしますが、Int64を試してみるとガベージコレクタが機能しなくなっているようです。Int64を使用したhaskellでのメモリ消費
module Main (main) where
import Data.Int
import System.Environment
getNum :: Int -> Int64
merge [] s2 = s2
merge s1 [] = s1
merge (s1:s1s) (s2:s2s)
| s1 < s2 = s1 : (merge s1s (s2:s2s))
| s1 > s2 = s2 : (merge (s1:s1s) s2s)
| otherwise = s1 : (merge s1s s2s)
scaleStreams scale = map $ (*) scale
getNum n = s_3_56!!n
where s_3_56 = 1:(merge (scaleStreams 2 s_3_56)
(merge (scaleStreams 3 s_3_56)
(scaleStreams 5 s_3_56)))
main = do
snum:_ <- getArgs
putStrLn $ show $ getNum (read snum)
UPD。欠落したインポートData.Int。 100,000,000要素が必要です。 Int64を使用しているときは、応答を停止するか、プロセッサーの使用を停止するだけです。
多分私はghcのための鍵が必要なので、必要のない要素をクリーンアップすることができます。
これらはすべてベンチマークに関するものなので、私はIntegerというより明確なものが必要です。
どのようなエラーが表示されますか? 'Data.Int'をインポートしてみてください。 - Int64はPreludeにありません。また、Integer(Prelude!にあります)を使用すると、オーバーフローすることはありません。 GHCiでは、 'getNum 200000'が' 4480327901140333639941336854183943340032000000000'に等しいとすぐに計算することができます:-) – yatima2975
はい、「Integer」を使うのはよいでしょう。 'Integer'がボトルネックであることが判明した場合にのみ、他の型のために行ってください。 – augustss
ダウンボートの特別な理由はありますか?私は質問者が問題が何であるかについて間違っているとは思わないし、英語の強い戒めを持っていないと、下降声明を正当化しなければならない。... – gatoatigrado