Ich schreibe einen Haskell-Wrapper für eine C ++ - Klasse. Ich entschied mich, es als Haskell Data-Struktur darzustellen, die einen Zeiger (Foreign.Ptr) auf die Klasseninstanz in C ++ enthält. So ähnlich.
In C ++:
%Vor%In Haskell:
%Vor%Das Problem ist, ich weiß nicht, wie MyClass-Löschung korrekt implementiert wird. Irgendwann wird der Haskell-Garbage Collector das MyClass-Objekt löschen, aber es wird nicht die Freigabe von MyClass * in C ++ ausgelöst. Wie repariere ich das?
Ich kenne ForeignPtr , aber es verwendet IO
monad, was nicht befriedigend ist, weil ich möchte, dass sich die umhüllte Datenstruktur genau wie eine normale Haskell-Datenstruktur verhält, ohne explizites Zuweisen / Freigeben von Speicher oder IO
-Monaden.
"es verwendet
IO
monad, was nicht zufriedenstellend ist, weil ich möchte, dass sich die umschlossene Datenstruktur genau wie eine normale Haskell-Datenstruktur verhält"
Sicher tun Sie das, aber leider ist das nicht wirklich möglich. Ausländische "Funktionen" können immer witzige Sachen machen, die in Haskell nicht möglich sein sollten; Das Typsystem hat keine Möglichkeit, dorthin zu schauen und es zu verhindern.
Dieses Dilemma ist der einzige (!) Grund, warum wir unsafePerformIO
haben, und in der Tat ist deins ein gutes Beispiel für eine gültige Anwendung für diese Sache.
Ich habe das selbst noch nicht gemacht, aber Ihr Code sollte etwa so aussehen:
%Vor% %Vor% Ich bin nicht ganz sicher über diese FunPtr
s, hoffentlich wird jemand etwas dazu kommentieren ...
Tags und Links haskell c++ garbage-collection ffi