gpt4 book ai didi

haskell - 我们可以在 Haskell 中编写一个函数来测量 n 个字符的字符串占用的字节数吗?

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

假设我有字符串

"abc"

我想计算它在内存中占用的字节数。

我可以:
import Data.Bits
finiteBitSize ("abc" :: [Char])

但这会中断,因为 [Char]不是函数支持的类型。 (也是位而不是字节,但重点是描绘我正在寻找的内容)。

我的问题是: 我们可以在 Haskell 中编写一个函数来测量 n 个字符的字符串占用的字节数吗?

最佳答案

情况很复杂。

让我们谈谈GHC,还有关于String具体来说,让我们假设这个东西已经被完全评估,所以我们没有以对 GC 友好的方式迭代使用它,我们没有延迟评估并存储一个代表巨大数据结构的微小 thunk。

在做出所有这些简化的假设之后,我们需要知道一些定义。

type String = [Char]
data [a] = [] | a : [a] -- pseudosyntax
data Char = C# Char# -- I'm guessing, couldn't find a canonical source

现在我们将使用一些经验法则。首先:未装箱的东西(如 Char# )通常存储在机器字中。我们生活在 64 位机器的世界中,所以 Char#可能是 8 个字节,即使它可能只使用它的底部 4 个字节。第二:数据构造器是一个词来说明哪个构造器,加上一个词来指向每个字段。

现在我们准备好了。

空字符串是 [] , 构造函数一个字,字段没有字,所以一共一个字。

非空字符串是 c : cs , 所以一个词是 :构造函数,一个词指向 c ,一字指 cs ,一字为 C#构造函数,一个词就是 Char# .这是 5 个单词加上我们需要的数量 cs .

所以对于 String长度为 n,我们有 5*n 个词来表示 String 的主体和一个额外的终止 [] .实际上,每个字符 40 个字节!哎呀。

现在你知道为什么打包表示像 Text (或者,在适当的时候, ByteString )是如此重要。

关于haskell - 我们可以在 Haskell 中编写一个函数来测量 n 个字符的字符串占用的字节数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57739123/

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