En mi programa Haskell Tengo un ADT con muchos constructores:¿Cómo se determina el constructor de datos a partir del código externo?
data MyData = Con1 |
Con2 |
...
Con20
que tienen una función foreign export ccall
, que se envuelve en una matriz de [MyData]
StablePtr's
. Después de llamarlo, necesito determinar qué constructor se ha utilizado para construir cada elemento.
Se podría resolverse de esta manera
foreign export ccall getType :: StablePtr MyData -> IO CInt
getType (Con1) = return 1
getType (Con2) = return 2
...
pero entonces tendría que definir manualmente estas constantes en la cabecera C. Esto es propenso a errores, así que me pregunto si hay una manera de hacer que GHC haga este trabajo por mí.
Lo sentimos, no lo consiguió. ¿Cómo sé a qué constructor refiere alguna etiqueta? – arrowd
No lo hace, está dado por el orden de enumeración. Pero ya ha perdido toda esa información en el lado C, por lo que debe confiar en un mapeo inseguro. –
Entonces, ¿no es posible generar automáticamente esa asignación? – arrowd