为什么Haskell"什么都不做"功能,身份,消耗大量内存?

时间:2014-05-19 20:41:56

标签: haskell ghc

Haskell有一个标识函数,它返回输入不变。定义很简单:

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

几秒钟后(根据任务管理器大约2 GB内存),编译失败并显示ghc: out of memory。同样,口译员说ghci: out of memory

由于id是一个非常简单的函数,我不希望它在运行时或编译时成为内存负担。什么是用于的所有内存?

1 个答案:

答案 0 :(得分:132)

我们知道id的类型,

id :: a -> a

当我们将此专门用于id id时,id副本的类型为:

id :: (a -> a) -> (a -> a)

然后当你再次专注于id中最左边的id id id时,你会得到:

id :: ((a -> a) -> (a -> a)) -> ((a -> a) -> (a -> a))

所以你看到你添加的每个id,最左边的id的类型签名是两倍。

请注意,在编译期间会删除类型,因此这只会占用GHC中的内存。它不会占用程序中的内存。