Tengo un tipo de suma de productos algebraica en PureScript:
data IO = Menu (Word8 -> Effect IO) | LongMessage (Array String) (Effect IO) | ShortMessage String (Effect IO) | End initialize :: Effect IO Me gustaría llamar a initialize desde JavaScript y luego consumir su resultado. Si ejecuto Main.initialize() desde JavaScript, obtengo un Object JS que se imprime de la siguiente manera en la consola:
LongMessage3 {value0: Array(15), value1: ƒ} value0: (1) ['foo'] value1: ƒ __do() [[Prototype]]: Object ¿Cómo se vería el código JavaScript que reconoce este objeto como un valor correspondiente al constructor LongMessage ?
Primero, para responder preguntas como esta, puede mirar el código JS compilado usted mismo. Se encuentra en ./output/My.Module.Name/index.js . Solo ábrelo y echa un vistazo.
La versión actual de PureScript (0.15.2 a partir de este escrito) compila ADT en un conjunto de objetos JS con prototipos únicos.
Voy a usar un ejemplo más pequeño, porque el tuyo es demasiado grande para ser legible. Digamos que mi ADT se ve así:
data X = Y Int | Z String Boolean a = Y 42 b = Z "foo" falseEsto produciría aproximadamente el siguiente JS (digo "aproximadamente" porque es un poco más elaborado, pero la esencia es la misma):
function Y(value0) { this.value0 = value0 } function Z(value0, value1) { this.value0 = value0 this.value1 = value1 } var a = new Y(42) var b = new Z("foo", false) Cuando se construye de esta manera, los valores del tipo se pueden probar para el constructor en particular al verificar el prototipo a través de instanceof . Así, por ejemplo, lo siguiente:
c = case a of Y _ -> "It's a Y" Z s _ -> "It's a Z with " <> sse traduciría aproximadamente a:
var c = (() => { if (a instanceof Y) { return "It's a Y" } if (a instanceof Z) { return "It's a Z with " + a.value0 } throw new Error("Invalid pattern match") })() Una nota al pie: en su ejemplo, el constructor parece llamarse LogMessage3 en lugar de LogMessage . Esto me dice que probablemente esté ejecutando un paquete. Durante la agrupación, las funciones pueden cambiar de nombre para evitar conflictos de nombres; de ahí proviene el "3".