Tho*_*enz 14 byte haskell types
假设我创建了一个类型如下:
data RequestAck =
RequestAck { ackOK :: Word32, ackMsgCode :: Word32 }
Run Code Online (Sandbox Code Playgroud)
我可以看到它是2*4字节大,并使其在某处保持不变.
唯一的问题是,一旦我在类型中添加了一个字段,我就必须记得更新我的常量.
是否有一个功能可以为我提供给定类型的大小,例如t -> Int
?
接近我想要的功能是
gsize :: Data a => a -> Int
在Data.Generics.Schemes模块中,但我不想让我的类型成为一个实例Data
.
那里有更通用的解决方案吗?
可以肯定的是,我正在寻找一个对静态类型进行操作的函数,例如,我不想传递实例,而是传递类型本身.
bdo*_*lan 12
这实际上取决于你如何将其转换为字节.
作为a Word32
,没有固定的大小.你所看到的Word32
可能是一个未应用的闭包占用了数百兆的空间.或者它可以是一个简单的盒装类型(大于4个字节).或者它可能是某种内联标记类型(在这种情况下,它取决于平台).或者可以省略(在这种情况下它不存在).
只有当你转换为二进制时才能真正说出这样的大小.如果你这样做是为了与FFI接口,你可以使用.的sizeOf
成员Foreign.Storable
.当然,如果您想sizeOf
直接应用它,则需要为您的类型编写一个Storable实例.如果你是通过Data.Binary进行序列化......那么,只需序列化这个东西,真的.你通常不需要事先知道实际的大小(如果你做一个大小的标题,只需序列化你正在计算的大小为一个临时的懒字节字符串,然后取大小,然后写大小和临时字节字符串).