haskell - 如何戳一个向量(或获取一个指向它的数据的向量)?

标签 haskell ffi

我读过 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/

相关文章:

c - 如何在 C 和 gprolog 之间进行接口(interface)?

haskell - 访问 haskell 自定义数据类型中的值

C 符号类型和不相交的 union 类型?

haskell - haskell 的foldr 总是采用两个参数的lambda 吗?

haskell - FFI:如何声明 `size_t`

smalltalk - Squeak : Singleton ExternalLibrary vs. 类方法中的 FFI 与 ExternalStructures 中的方法?

python - Python FFI 中的 Haskell 函数

c - 在 Haskell 和 C 之间交换结构化数据

haskell - yesod 中带有自定义验证的文件上传字段

performance - 为什么严格长度函数的执行速度明显更快?