Si utiliza la biblioteca Data.Vector puede usar Data.Vector.Storable para sus necesidades. Luego puede usar funciones como insafeToForeignPtr o insafeWith para acceder al puntero externo subyacente. Esto le permite llamar al código C sin que tenga lugar ninguna copia o clasificación.
Si desea crear un vector a partir de una matriz C, puede utilizar inseguroFromForeignPtr.
Para sus ejemplos que puede utilizar (suponiendo c_foo no modifica sus argumentos)
import Foreign.Ptr
import Foreign.C.Types
import System.IO.Unsafe (unsafePerformIO)
import qualified Data.Vector.Storable as SV
foreign import ccall unsafe "foo" c_foo :: Ptr CInt -> CInt
haskellFoo :: SV.Vector CInt -> CInt
haskellFoo sv = unsafePerformIO $
SV.unsafeWith sv $ \ptr -> return (c_foo ptr)
Esto puede ser golfed a:
haskellFoo sv = unsafePerformIO $
SV.unsafeWith sv (return . c_foo)
Tenga en cuenta que si su C-función modifica los datos , entonces no debe hacer esto, en su lugar debe hacer una copia de los datos para no romper la transparencia referencial.
Si desea utilizar el tipo de matriz estándar, puede usar withStorableArray
desde Data.Array.Storable
de la misma manera.
Ver [ 'Foreign.Marshal.Array'] (http://hackage.haskell.org/ paquete/base-4.7.0.0/docs/Foreign-Marshal-Array.html). – MasterMastic