마지막 요소를 찾는 것이 문제입니다. 그것은 잘 작동 정수 유형. 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' 가져 오기 시도 - Intlude는 Prelude에 없습니다. 또한 Integer (Prelude!에 있음)를 사용하면 오버플로가 발생하지 않습니다. 저는 GHCi에서'getNum 200000'이'4480327901140333639941336854183943340032000000000'과 같습니다 :-) – yatima2975
예,'Integer'를 사용하면 좋은 기본값입니다. Integer가 병목으로 판명되면 다른 유형으로 만 이동하십시오. – augustss
downvotes에 대한 특별한 이유가 있습니까? 질문자가 문제가 무엇인지에 대해 착각하고 있다고 생각하지 않거나 강한 영어 명령을 지키지 않으면 downvotes가 보증됩니다. – gatoatigrado