为什么Haskell的“无所事事”的function,ID,消耗大量的内存?
Haskell有一个标识函数,它返回的input不变。 定义很简单:
id :: a -> a id x = x
所以为了好玩,这应该输出8
:
f = id id id id id id id id id id id id id id id id id id id id id id id id id id id main = print $ f 8
几秒钟后(根据任务pipe理器大约2GB的内存),编译失败, ghc: out of memory
。 同样,口译员说ghci: out of memory
。
由于id
是一个非常简单的函数,我不希望它在运行时或编译时成为内存负担。 什么是所有使用的内存?
我们知道id
的types,
id :: a -> a
而当我们专注于id id
, 左边的id
副本的types是:
id :: (a -> a) -> (a -> a)
然后,当您再次为id id id
最左侧的id
专门化时,您将得到:
id :: ((a -> a) -> (a -> a)) -> ((a -> a) -> (a -> a))
所以你看到你添加的每个id
,最左边id
的types签名是两倍大。
请注意,在编译过程中types会被删除,所以这只会占用GHC中的内存。 它不会在你的程序中占用内存。