我有这样的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
感到不舒服。
答案 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