Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

186
Views
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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!