为什么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中的内存。 它不会在你的程序中占用内存。