Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

189
Vistas
Coincidencia de patrones en JS en un tipo de suma de productos de PureScript

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 ?

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

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.

Pero para completar, aquí está la respuesta:

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" false

Esto 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 " <> s

se 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".

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda