In Haskell, quando si utilizza il FFI di legarsi a una funzione che alloca, è opportuno evitare utilizzando IO
quando la funzione estere alloca e costruisce un certo valore, e tale valore solo dipende dagli argomenti della funzione ?È necessario utilizzare l'I/O quando si importa una funzione esterna che assegna?
Si consideri la seguente funzione:
/**
* The foo_create contract: if allocation succeeds, the
* return value points to a value that depends only on 'x'
* and 'name', otherwise a null pointer is returned.
*/
foo_t *foo_create(int x, const char *name);
sarebbe opportuno importare questa funzione nel modo seguente? funzione di legante
newtype Foo = Foo (Ptr Foo)
foreign import unsafe "foo.h foo_create"
foo_create :: CInt -> CString -> Ptr Foo
Questo basso livello può quindi essere avvolto per fornire API migliore:
makeFoo :: CInt -> CString -> Maybe Foo
makeFoo x s =
let
ptr = foo_create x s
in
if ptr == nullPtr
then Nothing
else Just (Foo ptr)
Benché la dotazione colpisce il mondo reale, e se non riesce è anche dipendente dalla nel mondo reale, il tipo modella i risultati possibili di . Inoltre, anche le funzioni e i dati puri possono causare l'allocazione del runtime di Haskell a . Quindi, è ragionevole evitare la monade IO
in situazioni come queste?
Questo ha senso. Sembra ovvio col senno di poi! Saluti. – frasertweedale