如何戳两个向量?

How to poke two vectors?

我有这样一个 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 感到不舒服。

简单:

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