Haskell有一个标识函数,它返回输入不变.定义很简单:
id :: a -> a
id x = x
Run Code Online (Sandbox Code Playgroud)
所以为了好玩,这应该输出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
Run Code Online (Sandbox Code Playgroud)
几秒钟后(根据任务管理器大约2 GB的内存),编译失败了ghc: out of memory.同样,翻译说ghci: out of memory.
由于它id是一个非常简单的函数,我不希望它在运行时或编译时成为内存负担.什么是用于的内存?
Die*_*Epp 134
我们知道的类型id,
id :: a -> a
Run Code Online (Sandbox Code Playgroud)
当我们将其专门化时,has类型id id的左侧副本id:
id :: (a -> a) -> (a -> a)
Run Code Online (Sandbox Code Playgroud)
然后当你再次专注于最左边id的时候id id id,你得到:
id :: ((a -> a) -> (a -> a)) -> ((a -> a) -> (a -> a))
Run Code Online (Sandbox Code Playgroud)
所以你看到id你添加的每一个,最左边的类型签名id是两倍大.
请注意,在编译期间会删除类型,因此这只会占用GHC中的内存.它不会占用程序中的内存.