W moim programie Haskell Mam ADT z wielu konstruktorów:Jak ustalić konstruktor danych z obcego kodu?
data MyData = Con1 |
Con2 |
...
Con20
Mam foreign export ccall
funkcję, która otacza [MyData]
na tablicy StablePtr's
. Po wywołaniu muszę ustalić, który konstruktor został użyty do skonstruowania każdego elementu.
To może być rozwiązany w ten sposób
foreign export ccall getType :: StablePtr MyData -> IO CInt
getType (Con1) = return 1
getType (Con2) = return 2
...
ale wtedy musiałby ręcznie zdefiniować te stałe w C cel. Jest to podatne na błędy, więc zastanawiam się, czy istnieje sposób, aby GHC wykonał dla mnie tę pracę.
Niestety, nie udało się. Skąd mam wiedzieć, do którego konstruktora odwołuje się jakiś znacznik? – arrowd
Nie robisz tego - wynika to z porządkowania wyliczenia. Ale i tak straciłeś już wszystkie informacje na stronie C, więc musisz polegać na niebezpiecznym mapowaniu. –
Więc nie jest możliwe automatyczne wygenerowanie tego mapowania? – arrowd