import Data.List
test :: Int -> Int
test n = foldl' (+) 0 [1..n]
main :: IO ()
main = do
print $ test $ 10^8
Run Code Online (Sandbox Code Playgroud)
GHC优化了上面的代码,以至于垃圾收集器甚至不需要做任何事情:
$ ghc -rtsopts -O2 testInt && ./testInt +RTS -s
[1 of 1] Compiling Main ( testInt.hs, testInt.o )
Linking testInt ...
5000000050000000
51,752 bytes allocated in the heap
3,480 bytes copied during GC
44,384 bytes maximum residency (1 sample(s))
17,056 bytes maximum slop
1 MB total memory in use (0 MB lost due …Run Code Online (Sandbox Code Playgroud) 标题说明了一切.foldl1并且foldl'都是概括的Foldable,而foldl1'不是.这只是最近的疏忽吗?或者它是一个设计选择?
类型foldl1'是
foldl1' :: (a -> a -> a) -> [a] -> a
Run Code Online (Sandbox Code Playgroud)
我希望它的类型与foldl1:
foldl1 :: Foldable t => (a -> a -> a) -> t a -> a
Run Code Online (Sandbox Code Playgroud)
我也看到它foldl1'是出口Data.List但不是Data.Foldable.也许这是相关的?
运行Haskell程序时,+ RTS -s报告诸如"字节最大驻留时间"之类的信息.有没有办法从Haskell程序中访问这些信息?Hackage上有一个提供此功能的库吗?
如果没有,有没有办法访问当前使用的内存量?例如,终端命令"top"显示的数量?