如何戳两个向量?

时间:2017-12-15 17:54:38

标签: haskell ffi

我有这样的C函数:

double* f(double* input, size_t n, double* result){
  for(int i=0; i<n; i++){
    result[i] = ***something***
  }
  return result;
}

我在Haskell中导入它(感谢@Zeta):

{-# LANGUAGE ForeignFunctionInterface #-}
import qualified Data.Vector.Storable         as V
import           Foreign
import           Foreign.C.Types

foreign import ccall unsafe "f" c_f :: Ptr CDouble -> CSize -> Ptr CDouble -> IO (Ptr CDouble)

f :: V.Vector CDouble -> IO (V.Vector CDouble)
f input = do
    fptr <- mallocForeignPtrArray n
    V.unsafeWith input $
      \v -> withForeignPtr fptr $ c_f v (fromIntegral n)
    return $ V.unsafeFromForeignPtr0 fptr n
  where n = V.length input

非常好。

但是现在我有一个函数以两个指针作为输入:

double* f(double* input1, double* input2, size_t n, double* result){
  for(int i=0; i<n; i++){
    result[i] = ***something***
  }
  return result;
}

如何将其导入f :: V.Vector CDouble -> V.Vector CDouble -> IO (V.Vector CDouble)

也许这很容易,但我仍然对withForeignPtr感到不舒服。

1 个答案:

答案 0 :(得分:1)

简单地:

f :: V.Vector CDouble -> V.Vector CDouble -> IO (V.Vector CDouble)
f input1 input2 = do
    fptr <- mallocForeignPtrArray n
    V.unsafeWith input1 $ 
      \v1 -> V.unsafeWith input2 $
        \v2 -> withForeignPtr fptr $ c_f v1 v2 (fromIntegral n)
    return $ V.unsafeFromForeignPtr0 fptr n
  where n = V.length input
相关问题