2015-03-18 17 views
5

, 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

cevap

8

bu. Dediğiniz gibi, Haskell içinde yeni değerler oluşturmak tahsise neden olur ve IO'da olması gerekmez, çünkü IO dışında tahsis edilen belirli bellek adreslerini gözlemlemek imkansızdır ve ayrıca bir tahsinin başarılı olup olmadığını gözlemlemek imkansızdır. IO dışında (programın bellek yetersiz olup olmadığı). Bununla birlikte, "başarılı olmanın da gerçek dünyaya da bağlı olup olmadığı" diyorsunuz. Bu durumda, hayır, IO numaralı bir dönüş türüne sahip olması gereken etkili bir işlemdir. Bir tip makeFoo :: CInt -> CString -> Maybe Foo ile Haskell işlevi Maybe Foo olup olmadığını Nothing veya Just _CInt ve CString değerlerine sadece bağlı gerektiğini söyledi. Bu, Just içindeki değerin yalnızca argümanlara bağlı olması kadar önemlidir.

Aynı argümanlara sahip bir işlevi çağırmak ve gerçek dünyanın durumuna bağlı olarak farklı sonuçlar almak mümkün ise, o zaman bu bir işlev değildir ve bir IO eylemi olmalıdır.

+0

Bu mantıklı. Arka görüşte bariz görünüyor! Şerefe. – frasertweedale

İlgili konular