W Haskell, przy korzystaniu z FFI do wiązania się z funkcji, która przydziela, jest to stosowne unikać użyciu IO
gdy funkcja zagranicznych przydziela dla i konstruuje pewną wartość, a wartość tylko zależy od argumentów funkcji ?Czy konieczne jest użycie operacji we/wy podczas importowania obcej funkcji, która przydziela?
Rozważmy następującą funkcję:
/**
* 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);
byłoby właściwe, aby zaimportować tę funkcję w następujący sposób? Funkcja wiązania
newtype Foo = Foo (Ptr Foo)
foreign import unsafe "foo.h foo_create"
foo_create :: CInt -> CString -> Ptr Foo
Ten niski poziom może być owinięty w celu zapewnienia ładniejszy API
makeFoo :: CInt -> CString -> Maybe Foo
makeFoo x s =
let
ptr = foo_create x s
in
if ptr == nullPtr
then Nothing
else Just (Foo ptr)
Chociaż przydział wpływa realnym świecie, czy uda się również od w realnym świecie, model ten umożliwia uzyskanie możliwych rezultatów. Co więcej, nawet czyste funkcje i dane mogą powodować przydzielanie środowiska wykonawczego Haskell. Czy jest zatem rozsądne, aby uniknąć monady w takich sytuacjach?
To ma sens. Wydaje się oczywiste z perspektywy czasu! Twoje zdrowie. – frasertweedale