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!
Vuoi chiamare Haskell da C o C da Haskell? – acomar
@acomar Credo che l'OP voglia chiamare Haskell da C. – duplode
@duplode Esattamente, mi piacerebbe chiamare Haskell da C/C++ – Simplex