我已经读过Data.Vector.Storable将它的元素存储在连续的内存区域中.我一直在期待这Vector
将是一个实例,Foreign.Storable
或者至少会有一个函数:: Vector a -> Ptr (Vector a)
,但只有unsafeToForeignPtr0 :: Storable a => Vector a -> (ForeignPtr a, Int)
.
我的Haskell代码生成一个列表,Foreign.Storable
我想从C代码访问此列表.这是Vector.Storable
正确的数据类型,如果是 - 我应该如何从C端访问它的元素?
如果您不从 C 更改内存,则可以使用unsafeWith
. 如果确实需要从C端进行更改,可以先复制向量,或者在C端复制一份。(如果你确实需要从C进行更改,但不再需要Haskell端的数据,你也可以unsafeWith
不复制地使用,但你必须确保向量不再被使用。这可以变得狡猾,懒惰等等……)
那么,为什么没有一个when isVector a
的实例呢?好吧,首先:向量应该是什么?回想一下,即使该函数具有签名,文档也说“未使用该参数”。希望了解内部结构的人过来并给出权威答案,但据我所知,所有实例都是“固定大小”类型。Storable
a
sizeOf
(Storable a) => a -> Int
Storable
附录:您请求的函数签名实际上没有意义。假设你有一个foo :: Vector a -> Ptr (Vector a)
,这真的有意义吗foo (fromList [1,2]) == foo (init (fromList [1,2,3]))
?请记住,这些现在是指针,并且很可能会有所不同。