Se si utilizza la libreria Data.Vector, è possibile utilizzare Data.Vector.Storable per le proprie esigenze. Quindi è possibile utilizzare funzioni come unsafeToForeignPtr o unsafeWith per accedere al puntatore esterno sottostante. Ciò consente di chiamare il codice C senza effettuare alcuna copia o marshalling.
Se si desidera creare un vettore da un array C, è possibile utilizzare unsafeFromForeignPtr.
Per i vostri esempi che è possibile utilizzare (ammesso c_foo non modificarlo di argomenti)
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)
questo può essere essere giocato a golf a:
haskellFoo sv = unsafePerformIO $
SV.unsafeWith sv (return . c_foo)
Nota che se il C-funzione modifica i dati , quindi non si dovrebbe fare questo, invece si dovrebbe fare una copia dei dati per non rompere la trasparenza referenziale.
Se si desidera utilizzare il tipo di array standard, è possibile utilizzare withStorableArray
da Data.Array.Storable
allo stesso modo.
Sede [ 'Foreign.Marshal.Array'] (http://hackage.haskell.org/ pacchetto/base-4.7.0.0/docs/estero-maresciallo-Array.html). – MasterMastic