2012-03-24 19 views
7

C'è un modo per collegare una funzione Haskell di tipoPlug nuovo metodo FFI in GHC

myFFI :: (C a) => String -> IO a 

(dove C è una certa typeclass descrivere i tipi di variabili che posso importazione) in GHC come uno schema di FFI in modo che posso scrivere nel mio roba programma Haskell come

foreign import myFFI "foo" foo :: T1 -> T2 

che viene compilato in una chiamata a foo = unsafePerformIO $ myFFI "foo" :: T1 -> T2?

Immagino che questo possa essere fatto modificando GHC, ma c'è un modo per farlo tramite un plugin che posso scrivere senza toccare correttamente il codice di codici GHC?

+0

I tipi non sembrano corrispondere. Penso che dovresti '(T1 -> T2)' == 'IO a', e questo non corrisponde al typecheck. – Tener

+1

@Tener, 'unsafePerformIO' eseguirà l'operazione IO (non uniforme, pari), che consentirà all'espressione di essere qualsiasi tipo' a', in questo caso in modo che 'a ~ (T1 -> T2)'. – dflemstr

+0

Ho capito che dovrebbe essere facile ottenere qualcosa di buono usando TH. Così ora ho '[myFFI | Whatever.x :: T1 -> T2 |]' che compila in 'x = unsafePerformIO $ myFFI" Whatever.x ":: T1 -> T2'. C'è un modo per far funzionare questi 'unsafePerformIO all'avvio anziché pigramente? – Cactus

risposta

1

Per rispondere alla domanda nei commenti (poiché alla domanda principale viene data risposta con "usa TH"), puoi anche utilizzare TH per raccogliere un elenco di tutti i nomi che hai così associato. Quindi, all'avvio, una chiamata init può attraversarla e forzarla.

0

Non è necessario che il secondo argomento sia nella monade IO in primo luogo.

foreign import ccall sin :: Double -> Double 

è perfettamente legittimo, ma conduce a comportamenti indefiniti se il peccato è impuro.

+0

Penso che tu abbia frainteso la mia domanda ... Devo fare IO per caricare la mia funzione per nome. Questa è la parte che mi piacerebbe fare in fase di compilazione. Questo è completamente indipendente dal fatto che la funzione che carico (il 'a') sia pura o meno. – Cactus

Problemi correlati