haskell - 为什么 Haskell 的 "do nothing"函数 id 会消耗大量内存?

标签 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:内存不足。同样,解释器会说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/

相关文章:

haskell - 尝试简单的单例示例时出现模板 Haskell 错误

haskell - 约束约束

haskell - 如何使用 Scotty 设置 wai-handler-devel 以自动重新加载代码?

Haskell-(类型声明)什么是 "a"?

Haskell Records-使用字符串字段名设置/获取

multithreading - 在线程中调用 'yield' 有哪些好的用例?

haskell - ghc 7.10.2 类型系列扩展不起作用

haskell - 在 Haskell 中使用一元函数和柯里化(Currying)定义加法?

haskell - View 模式以不可预知的方式影响类型检查

haskell - 为什么 GHC.Types.Any 在这里?