2014-04-23 27 views
7

Voglio chiamare una funzione Haskell da C/C++. Ho già letto alcuni tutorial relativi a questo argomento, ma le chiamate di IO Monade non sono trattate in esse. In particolare, vorrei chiamare una funzione che utilizza la funzione interact (interact :: (String -> String) -> IO()).wrapper C/C++ per Haskell IO monad

  • Non capisco come utilizzare le funzioni in questo caso?
  • Come posso dichiarare la funzione in wrapper C/C++?
  • Come verrà trasferito il controllo di input/output standard tra C/C++ e Haskell (nel codice C/C++)?
+0

Vuoi chiamare Haskell da C o C da Haskell? – acomar

+0

@acomar Credo che l'OP voglia chiamare Haskell da C. – duplode

+0

@duplode Esattamente, mi piacerebbe chiamare Haskell da C/C++ – Simplex

risposta

2

Ho intenzione di mantenere questa risposta relativamente breve perché la maggior parte di questo è contemplata nello FFI documentation.

È possibile utilizzare le funzioni chiamandole per nome in C. Le funzioni devono essere dichiarate come foreign export e parallele alla sintassi foreign import per le funzioni di chiamata definite in un modulo C in Haskell. In C, devi dichiarare la funzione come extern e assegnargli una normale firma di tipo.

La vostra funzione interact non può essere dichiarato direttamente perché fa riferimento a tipi che non sono definiti in C. È possibile definire e scrivere una funzione correlata che chiama interact in Haskell:

interact_hs :: FunPtr (CString -> CString) -> IO() 

Questa funzione potrebbe quindi utilizzare il suo argomento (con il wrapping) per chiamare interact.

In C questa funzione, allora appare come:

extern void interact_hs(char*(*f)(char*)); 

o qualcosa di simile, la mia sintassi puntatore a funzione è arrugginito.

Per chiamare effettivamente questa funzione da C, è necessario inizializzare il runtime di Haskell (trattato nella documentazione), quindi chiamare la funzione, a quel punto il controllo dell'esecuzione passa ad Haskell. Una volta che la funzione completa e restituisce, il controllo di esecuzione passa di nuovo in C.

Altre risorse utili per lavorare con la FFI:

Sentiti libero di suggerire altri link utili!

+0

Grazie mille! Risolve questo problema! – Simplex