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

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进行序列化......那么,只需序列化这个东西,真的.你通常不需要事先知道实际的大小(如果你做一个大小的标题,只需序列化你正在计算的大小为一个临时的懒字节字符串,然后取大小,然后写大小和临时字节字符串).

  • 根据你的建议来测量实际的ByteString大小,我改变了我的服务器/客户端协议,为每个二进制消息添加一个单词,其中包含后面的ByteString的大小(我事先测量).谢谢你的洞察力. (2认同)