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
是一个非常简单的函数,我不希望它在运行时或编译时成为内存负担。什么是用于的所有内存?
答案 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中的内存。它不会占用程序中的内存。