问题 可存储的类型类在Haskell中做了什么


我一直在阅读有关Haskell的C FFI的一些文档。我刚刚遇到一个名为的类型类 Storable,我不太了解。

是这个类型类的实例,这些类型在与C代码连接时应该有一个“指针”吗?

个人的功能也是什么 sizeOfalignmentpeekpoke 做?它似乎 peek 和 poke 用于从数据库读取数据或将数据写入指向的内存中的位置 Ptr a。这是正确的吗?

但我不知道是什么 sizeOf 和 alignment 意思是说。有人可举例说明其用途吗?


2614
2017-09-10 00:54


起源



答案:


Haskell以与C非常不兼容的方式将值存储在内存中。因此,无法从haskell调用C函数并直接传递给它haskell值。相反,你必须创建一个值的副本,但不是一个精确的副本,而是一个C理解的格式。那是什么 Storable 确实。因此,它基本上提供了将haskell值序列化为C友好格式的方法(例如,思考C结构)。它还支持相反的操作,它可以反序列化值。当从haskell调用C函数并返回复数(即非原始)值时,这很有用。

序列化/反序列化在...的帮助下发生 poke/peeksizeOf 返回值的C表示的字节大小。请注意,此机制仅适用于具有固定大小的C表示的值(例如,结构)。它不支持像C字符串这样的东西,它们会得到处理 不同。至于 alignment,它用于确保在haskell土地上完成的内存分配满足平台的对齐要求。


10
2017-09-10 01:01



@smilingbuddha是的,我修好了。在某种程度上,谈论值的haskell表示的大小是没有意义的,因为该表示对于用户来说是非常不透明的。您无法检查haskell如何存储其值。 - redneb
谢谢!你能解释一下吗? alignment 功能更深入一些?假设我有 data MyData = MyData { intarray :: [Int], dbarray::[Double], length::Int} 我将如何编写实现 alignment? - smilingbuddha
对于对齐,通常复制C的对齐方式 int 类型。你可以这样做: alignment _ = alignment (undefined :: CInt)。 - redneb
如果你有 MyData 输入,然后写一个 Storable 它的实例并没有多大意义,因为你不能用固定的大小来表示那种类型的值。 - Reid Barton


答案:


Haskell以与C非常不兼容的方式将值存储在内存中。因此,无法从haskell调用C函数并直接传递给它haskell值。相反,你必须创建一个值的副本,但不是一个精确的副本,而是一个C理解的格式。那是什么 Storable 确实。因此,它基本上提供了将haskell值序列化为C友好格式的方法(例如,思考C结构)。它还支持相反的操作,它可以反序列化值。当从haskell调用C函数并返回复数(即非原始)值时,这很有用。

序列化/反序列化在...的帮助下发生 poke/peeksizeOf 返回值的C表示的字节大小。请注意,此机制仅适用于具有固定大小的C表示的值(例如,结构)。它不支持像C字符串这样的东西,它们会得到处理 不同。至于 alignment,它用于确保在haskell土地上完成的内存分配满足平台的对齐要求。


10
2017-09-10 01:01



@smilingbuddha是的,我修好了。在某种程度上,谈论值的haskell表示的大小是没有意义的,因为该表示对于用户来说是非常不透明的。您无法检查haskell如何存储其值。 - redneb
谢谢!你能解释一下吗? alignment 功能更深入一些?假设我有 data MyData = MyData { intarray :: [Int], dbarray::[Double], length::Int} 我将如何编写实现 alignment? - smilingbuddha
对于对齐,通常复制C的对齐方式 int 类型。你可以这样做: alignment _ = alignment (undefined :: CInt)。 - redneb
如果你有 MyData 输入,然后写一个 Storable 它的实例并没有多大意义,因为你不能用固定的大小来表示那种类型的值。 - Reid Barton