Nel mio programma Haskell Ho un ADT con molti costruttori:Come determinare il costruttore di dati da un codice esterno?
data MyData = Con1 |
Con2 |
...
Con20
devo una funzione foreign export ccall
, che avvolge [MyData]
in una matrice di StablePtr's
. Dopo averlo chiamato ho bisogno di determinare quale costruttore è stato usato per costruire ogni elemento.
Potrebbe essere risolto questo modo
foreign export ccall getType :: StablePtr MyData -> IO CInt
getType (Con1) = return 1
getType (Con2) = return 2
...
ma poi ho dovrebbe definire manualmente queste costanti nell'intestazione C. Questo è soggetto a errori, quindi mi chiedo se c'è un modo per fare in modo che GHC faccia questo lavoro per me.
Siamo spiacenti, non capisco. Come faccio a sapere a quale costruttore si riferisce qualche tag? – arrowd
Non lo fai - è dato dall'ordinazione dell'enumerazione. Ma hai già perso tutte le informazioni sul lato C, quindi devi fare affidamento su una mappatura non sicura. –
Quindi, non è possibile generare automaticamente quella mappatura? – arrowd