我读过 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
而无需复制,但您必须确保不再使用该向量. 这可能很棘手,懒惰等等......)
那么,为什么不是 Vector 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]))
真的有意义吗? ?请记住,这些现在是指针,很可能会有所不同。
关于haskell - 如何戳一个向量(或获取一个指向它的数据的向量)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14125057/