Tengo R1 y R2 tipos de registro y necesito pasar R1 o R2 a una función externa (puede manejar la estructura de registro r1 o r2) si es posible para hacer esto (pensé que tal vez a través de la conversión a un objeto extraño)?

¿O necesito declarar dos importaciones extranjeras diferentes (con firmas de tipo diferente para pasar R1 y R2) apuntando a la misma función js?

Otra forma que encontré usando unsafeCoerce para la conversión de tipos:

foreign import data R1orR2 ∷ Type

fromR1 :: R1 -> R1orR2
fromR1 = unsafeCoerce

fromR2 :: R2 -> R1orR2
fromR2 = unsafeCoerce

Entonces, tal vez haya otras formas.

1
WHITECOLOR 22 ene. 2021 a las 02:57

1 respuesta

La mejor respuesta

Al escribir enlaces FFI, unsafeCoerce está bastante bien: después de todo, foreign import ya tiene los mismos inconvenientes, por lo que realmente no estás perdiendo nada.

Y sí, lo que se le ocurrió, R1orR2, es el enfoque correcto que se usa con bastante frecuencia en los enlaces FFI.

También puede consultar undefined-is-not-a-problem. y bibliotecas untagged-union. Ofrecen algunas técnicas más avanzadas y generalizadas en esta área.

3
Fyodor Soikin 22 ene. 2021 a las 00:48