In meinem Haskell Programm ich habe eine ADT mit vielen Konstrukteuren:Wie ermitteln Sie den Konstruktor der Daten aus Fremdcode?
data MyData = Con1 |
Con2 |
...
Con20
Ich habe eine foreign export ccall
Funktion, die [MyData]
in einem Array von StablePtr's
wickelt. Nach dem Aufruf muss ich feststellen, welcher Konstruktor zum Aufbau jedes Elements verwendet wurde.
Es könnte auf diese Weise
foreign export ccall getType :: StablePtr MyData -> IO CInt
getType (Con1) = return 1
getType (Con2) = return 2
...
gelöst werden, aber dann würde ich manuell diese Konstanten in C-Header definieren müssen. Das ist fehleranfällig, also frage ich mich, ob es einen Weg gibt, GHC dazu zu bringen, diesen Job für mich zu erledigen.
Sorry, habe es nicht verstanden. Woher weiß ich, auf welchen Konstruktor ein Tag verweist? – arrowd
Sie nicht - es ist durch die Aufzählung Reihenfolge gegeben. Aber Sie haben sowieso alle Informationen auf der C-Seite verloren, also müssen Sie sich auf ein unsicheres Mapping verlassen. –
Es ist also nicht möglich, diese Zuordnung automatisch zu generieren? – arrowd