a id x = x 所以为了好玩,这应该输出 8: f = id id id id id id id id id -6ren">
gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 04:40:25 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com