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:内存不足
。同样,解释器会说ghci:内存不足
。
由于 id
是一个非常简单的函数,因此我不希望它在运行时或编译时成为内存负担。所有内存都用来做什么?
最佳答案
我们知道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 中的内存。它不会占用您的程序内存。
关于haskell - 为什么 Haskell 的 "do nothing"函数 id 会消耗大量内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23746852/