gpt4 book ai didi

haskell - 如何确定 Haskell 中类型的大小?

转载 作者:行者123 更新时间:2023-12-03 22:23:59 26 4
gpt4 key购买 nike

假设我创建了一个类型如下:

data RequestAck = 
RequestAck { ackOK :: Word32, ackMsgCode :: Word32 }

我可以看到它有 2 * 4 字节大,并在某处使其成为常量。

唯一的问题是,一旦我向类型添加了一个字段,我就必须记住更新我的常量。

是否有一个函数可以为我提供给定类型的大小,例如 t -> Int ?

接近我想要的功能是
gsize :: Data a => a -> Int
在 Data.Generics.Schemes 模块中,但我不想让我的类型成为 Data 的实例.

有没有更通用的解决方案?

可以肯定的是,我正在寻找一个对静态类型进行操作的函数,例如,我不想传递实例,而是传递类型本身。

最佳答案

这实际上取决于您如何将其转换为字节。

作为 Word32 ,没有固定的大小。您所看到的 Word32可能是占用数百兆空间的未应用闭包。或者它可以是一个简单的盒装类型(大于 4 个字节)。或者它可能是某种内联标记类型(在这种情况下,它取决于平台)。或者它可以被省略(在这种情况下它不存在)。

只有当您转换为二进制时,您才能真正说出这样的大小。如果您这样做是为了与 FFI 交互,您可以使用 the sizeOf member of Foreign.Storable .当然,如果你只想申请 sizeOf,你需要为你的类型写一个 Storable 实例。直接到它。如果您通过 Data.Binary 进行序列化......好吧,只需序列化这个东西,真的。您通常不需要事先知道实际大小(如果您为大小 header 执行此操作,只需将要计算大小的主体序列化为临时惰性字节串,然后获取大小,然后写入大小和临时字节串)。

关于haskell - 如何确定 Haskell 中类型的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9492801/

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