Sto creando un modulo FFI in una libreria in C che richiede una funzione 1-tempo e non-rientranti da chiamare prima di qualsiasi altra cosa. Questa chiamata è idempotente, ma statica, quindi potrei semplicemente chiamarla in ogni chiamata Haskell. Ma è lento e a causa della non-rientranza potrebbe causare conflitti.Inizializzazione della libreria unsafePerformIO e FFI
Quindi è questo il momento giusto per usare unsafePerformIO? Potrei avvolgere un Bool in un IORef o MVar non sicuro per rendere idenominate queste chiamate di inizializzazione ignorando le chiamate successive (chiamate in cui lo stato IORef nascosto e globale è False).
In caso contrario, qual è il modo giusto per farlo?
Un'alternativa che ha visto l'uso è il 'withX' wrapper principale. Questo non dà garanzie statiche, sto solo dicendo che c'è la precedenza (ad esempio 'withSocketsDo' dal pacchetto di rete). –
Ah si, buon punto. Più semplice del 'withToken $ \ t ->', ma nessuna garanzia. –
Ah, eccellente! Questa è una soluzione molto migliore. Ero preoccupato di come lo stato globale avrebbe interagito con il multithreading (è un thread MVar non sicuro locale, locale di runtime?). Questo rende anche l'errore di inizializzazione localizzabile nel runtime di Haskell invece che solo implicito e nascosto. –