Bir C++ sınıfı için bir Haskell sarıcı yazıyorum. C++ sınıf örneğine bir işaretçi (Foreign.Ptr) içeren bir Haskell Veri yapısı olarak temsil etmeye karar verdim. Bunun gibi bir şey. C++Haskell'de nesne silme işleminde bir işlev çağırma
:
class MyClass {
public:
double my_method();
// ...
};
extern "C" MyClass* cpp_new_MyClass() {
return new MyClass();
}
extern "C" double cpp_my_method(MyClass *obj) {
return obj->my_method();
}
Haskell'de:
Data MyClass = MyClass (Ptr())
foreign import ccall "cpp_new_MyClass" cppNewMyClass :: Ptr()
foreign import ccall "cpp_my_method" cppMyMethod :: Ptr() -> Double
mkMyClass :: MyClass
mkMyClass = MyClass cppNewMyClass
myMethod :: MyClass -> Double
myMethod (MyClass ptr) = cppMyMethod ptr
sorun şu ki, doğru Sınıfım silinmesini nasıl uygulanacağı bilmiyorum. Bir noktada, Haskell çöp toplayıcı MyClass nesnesini silecektir, ancak C++'da MyClass * belleğini serbest bırakmayacaktır. Bunu nasıl düzeltirim?
Ben ForeignPtr farkında değilim, ama hafıza veya IO
monads azat/açık tahsisi için gerek kalmadan, ben sarılmış veri yapısı normal Haskell veri yapısı tam olarak davranmasını istedikleri için tatmin edici değildir IO
monad kullanır .
Sınıfınızın yan etkisi ücretsiz mi? Değilse, C++ 'da yaygın olduğu gibi,' IO 'monadını kullanmak için _have_ ya da _carve_ saf bir arayüze sahip olduğunuzdan emin olun. Haskell'deki ölümcül bir günah olan referanssal şeffaflığı kaybetmek ya da kaybetmek, özellikle programın davranışını tahmin etmek neredeyse imkansız hale geleceğinden, özellikle de en iyi duruma getirici kodunuzu yeniden yazarken. – chi
@chi Evet, bu yan etki ücretsizdir. – wrwt