Ich versuche, mit der Verwendung des "Call-Haskell-to-nichts" -Paket mit diesem Code eigene Typen zu C# exportieren:Haskell: keine Instanz für eigene Art
{-# LANGUAGE ForeignFunctionInterface #-}
{-# LANGUAGE TemplateHaskell #-}
module RectangleMover where
import Foreign.C
import FFI.Anything.TypeUncurry.Msgpack
data Point = Point Int Int
movePoint :: Point -> Int -> Int -> Point
movePoint (Point x y) dx dy = Point (x + dx) (y + dy)
data Rectangle = Rectangle { corner :: Point, width :: Int, height :: Int }
move :: Rectangle -> Int -> Int -> Rectangle
move [email protected](Rectangle {corner=c}) dx dy = r { corner = movePoint c dx dy }
foreign export ccall move_export :: CString -> IO CString
move_export :: CString -> IO CString
move_export = export move
Wenn ich versuche, dies zu kompilieren Datei erhalte ich die Fehlermeldung:
[1 of 1] Compiling RectangleMover (test.hs, test.o)
test.hs:19:15:
No instance for (Data.MessagePack.Object.MessagePack Rectangle)
arising from a use of ‘export’
In the expression: export move
In an equation for ‘move_export’: move_export = export move
Also ich glaube, ich habe eine „Instanz“ für die „Rechteck“ Art zu schreiben. Aber was ist die korrekte Syntax dafür? Ich habe bereits versucht, hinzuzufügen:
instance Rectangle where
bekam aber diese Fehlermeldung:
test.hs:13:10:
Expected a constraint, but ‘Rectangle’ has kind ‘*’
In the instance declaration for ‘Rectangle’
ich mit der Bibliothek vertraut bin, aber es sollte so etwas wie 'Beispiel Data.MessagePack.Object.MessagePack Rechteck, wo sein .....'. – chi
Ich habe das versucht, jetzt bekomme ich: 'test.hs: 13: 10: Nicht im Bereich: Typ Konstruktor oder Klasse 'Data.MessagePack.Object.MessagePack'' – ManzMoody
Sie müssen wahrscheinlich' Data.MessagePack.Object importieren 'und benutze' instance MessagePack Rectangle where' – chi