如何戳向量(或获取Ptr向量的数据)?

arr*_*owd 6 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端访问它的元素?

gsp*_*spr 4

如果您不从 C 更改内存,则可以使用unsafeWith. 如果确实需要从C端进行更改,可以先复制向量,或者在C端复制一份。(如果你确实需要从C进行更改,但不再需要Haskell端的数据,你也可以unsafeWith不复制地使用,但你必须确保向量不再被使用。这可以变得狡猾,懒惰等等……)

那么,为什么没有一个when isVector a的实例呢?好吧,首先:向量​​应该是什么?回想一下,即使该函数具有签名,文档也说“未使用该参数”。希望了解内部结构的人过来并给出权威答案,但据我所知,所有实例都是“固定大小”类型。StorableasizeOf(Storable a) => a -> IntStorable

附录:您请求的函数签名实际上没有意义。假设你有一个foo :: Vector a -> Ptr (Vector a),这真的有意义吗foo (fromList [1,2]) == foo (init (fromList [1,2,3]))?请记住,这些现在是指针,并且很可能会有所不同。