, ayırır bir işleve bağlamak için FFI kullanırken sahip olduğu uygun önlemek yabancı fonksiyonu için ayırır ve bazı değerini oluşturur zaman IO
kullanarak ve sadece işlev argümanları bağlı olduğu değer için ?Atanan yabancı bir işlevi alırken IO kullanmak gerekli midir? Haskell'de
/**
* 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);
aşağıdaki şekilde bu işlevi ithal etmek uygun olur:
aşağıdaki işlevi düşünün? ayırma gerçek dünya etkilese de
makeFoo :: CInt -> CString -> Maybe Foo
makeFoo x s =
let
ptr = foo_create x s
in
if ptr == nullPtr
then Nothing
else Just (Foo ptr)
ve olsun ya da olmasın bu başarılı da bağlıdır:
newtype Foo = Foo (Ptr Foo)
foreign import unsafe "foo.h foo_create"
foo_create :: CInt -> CString -> Ptr Foo
Bu düşük seviyeli bağlanma fonksiyonu daha sonra güzel bir API sağlamak için sarılabilir Gerçek dünya, tür olası sonuçları model yapar. Ayrıca, saf fonksiyonlar ve veriler bile Haskell çalışma zamanının tahsis edilmesine neden olabilir. Bu gibi durumlarda IO
monadından kaçınmak için mantıklı mıdır? foo_create
sadece x
ve name
değerlerine bağlı olan bir değer döndürürse, o zaman evet o IO
dışında ince dönüş değeri
Bu mantıklı. Arka görüşte bariz görünüyor! Şerefe. – frasertweedale