# PureScript

PureScript és un llenguatge de programació funcional de codi obert basat en el llenguatge Haskell adaptat a un substrat JavaScript amb especificitats de Node.js, del qual pren els tipus bàsics, l'avaluació estricta per defecte, amb una sintaxi lleugerament diferent al Haskell estàndard, i unes classes numèriques amb pedigrí matemàtic (L'equivalent de Num del Haskell és Ring, denotant l'estructura d'anell, el de Fractional és Field, el nom anglosaxó per al Cos, l'equivalent de Integral és EuclideanRing, anell euclidià).
En no comprometre's amb l'estàndard de Haskell, pot prescindir del RunTimeSystem que GHCJS emula oferint un resultat més lleuger i, a més a més, humanament llegible, incorporant extres com registres extensibles i efectes col·laterals més desgranats distingint els diferents efectes que el Haskell engloba dins IO (variables globals, accés als fitxers, excepcions), afegint-n'hi de nous. Això ha canviat a la versió 12, amb l'eliminació de Eff basada en registres i substitució per la mònada Effect.
Se'n pot fer ús per aplicacions a consola, en pàgines web i també en aplicacions de servidor basades en Node.js.
Després de l'èxit d'Elm en el desenvolupament d'interfícies d'usuari, PureScript apareix com una base més potent tècnicament, donat que Elm ha seguit un camí reduccionista per simplificar-ne l'ús evitant els predicats en els paràmetres de tipus (ús d'interfícies).
L'utilitzen comercialment per la creació d'entorns de desenvolupament d'interfícies d'usuari en pàgines web, com es detalla tot seguit.

## Metodologies per generar interfícies d'usuari

Utilitzen la programació reactiva per generar pàgines web automodificables, amb arquitectures en llenguatge PureScript basats en la funcionalitat aportada per ReactJS i la interacció amb servidors web de dades JSON, HTML o bé XML:
* PureScript Pux és una arquitectura PureScript basada en el sistema ReactJS que segueix l'arquitectura TEA de Elm. Proposa separació de components per mòduls amb tractament manual de la combinació d'estats i accions en un únic component ReactJS.
* Thermite és una realització de Phil Freeman (l'autor de PureScript) que permet definir i combinar components ReactJS segons l'arquitectura MVC, basat en biblioteques PureScript que embolcallen la funcionalitat ReactJS en JavaScript. Permet la combinació de components com a semigrup i el seu adreçament amb lents sobre l'estat conjunt (tipus producte dels estats individuals) i prismes (lents sobre tipus suma (unió discriminada) de les accions individuals). També permet l'arranjament de components en llista, on les accions vindran parametritzades per l'índex. Disposa d'una guia interactiva oficial.
* Halogen hi introdueix el patró observador per facilitar la comunicació entre components pares i fills. També és de codi obert, desenvolupat per la companyia Slamdata.
   * Permet definir encaixos (definit: slot) per a components, en una gramàtica específica (DSL) per descriure la presentació. La definició d'un encaix vindrà parametritzat per l'acció del subcomponent per comunicar-li que cal redibuixar-lo (paràmetre input); i també (paràmetre output) pel constructor de l'acció per tractar, al comp. pare, els missatges que el subcomponent envia cap amunt (verb raise).
   * El component pare pot enviar, al component de l'encaix, accions de consulta d'estat o bé de mutació que el controlador del component de l'encaix haurà de tractar.
* Optic UI és un marc de desenvolupament d'interfícies d'usuari basat en lents.

## Entorn de desenvolupament

Disposa de compilador, intèrpret i avaluador en-línia.
Requereix el gestor de Node.js "npm", i l'eina "pulp".
Hi ha dos gestors de paquets de biblioteques:
* bower permet especificar versions exactes o mínimes de les dependències.
* psc-package es basa en rebostos de conjunts de biblioteques compatibles (compilació assegurada).
El rebost general oficial de biblioteques és el rebost Pursuit que també conté un cercador de l'API.

## Rerefons de compilació

* sortida per defecte a JavaScript en mòduls de Node.js integrable en pàgines web o en aplicacions de servidor.
* sortida a C++.
* sortida a codi intermedi del compilador d'Erlang.

## Especificitats del llenguatge

Vegeu ref.
Algunes construccions esbiaixades cap al JavaScript i diferents del Haskell:
Les dades (data ...) estan completament avaluades, a diferència del Haskell estàndard on se'n retarda l'avaluació.
L'avaluació tardana de les expressions s'hi fa retardant l'avaluació amb una funció de Unit (Unit -> a), bé amb el mòdul Control.Lazy del paquet purescript-control, o bé amb el tipus Lazy de Data.Lazy definit al paquet purescript-lazy.
Hi ha llistes d'avaluació estricta (a Data.List) i d'avaluació tardana (a Data.List.Lazy), així com versions no-buides afegint .NonEmpty als corresponents noms de mòdul.
Les conversions entre Number i Int no són al Prelude sinó al mòdul Data.Int de purescript-integers.

### Efectes col·laterals

Els efectes col·laterals hi son més desgranats que al llenguatge Haskell, i es tracten amb un tipus extensible
* amb la mònada Eff.
** CONSOLE: entrada/sortida a consola.
** FS: accessos al sistema de fitxers per als programes de servidor Node.js.
** DOM: interacció amb document web en una finestra del Navegador.
** TIMER: temporitzadors de JavaScript.
** EXCEPTION: excepcions. Les excepcions es construeixen amb "error" i es disparen amb "throwException" i es cacen amb "catchException". throw strErr construeix i dispara.
* amb la mònada Aff per als efectes asíncrons.
** Ajax.
** sol·licituds HTTP multiplataforma {NodeJs, Navegador, altre} a la xarxa.
Això ha canviat a la versió 12 amb l'eliminació de Eff basada en registres (row-types) i conversió a Effect.

### Depuració

* La pila de traces de crida en cas d'excepció, hi ve incorporada (contràriament al compilador GHC de Haskell que requereix el RunTimeSystem d'ajustatge).

### Seqüències definides recursivament

Per exemple: següents x = x : següents (x+1) Per ser un llenguatge estricte, el càlcul provoca l'avaluació immediata del paràmetre recursiu i la consegüent petada de la pila.
Podem evitar-ho utilitzant l'expressió de la definició de Data.List.Lazy.cons que posterga, amb Data.Lazy.defer, l'avaluació del segon paràmetre.
Segons l'article.

## Referències

* ↑ About the author(anglès)
* ↑ GitHub - Phil Freeman(anglès)
* 1 2 3 Purescript - Diferències amb Haskell(anglès)
* ↑ edicions(anglès)
* ↑ taylor.fausak.me - El Perquè de PureScript(anglès)
* 1 2 Why did PureScript go from Eff to Effect?(anglès)
* ↑ reasonablypolymorphic.com - Elm is wrong(anglès)
* 1 2 reactjs.org
* ↑ Youtube - Claudia Doppioslash - Building a Graphical IDE with Elm/Purescript(anglès)
* ↑ purescript-pux.org(anglès)
* ↑ Nesting component events Arxivat 2018-04-01 a Wayback Machine.(anglès)
* ↑ Guia a codeburst.io - Write React Components in PureScript with Pux
* ↑ purescript-thermite(anglès)
* ↑ Guia a functorial.com - Building a Task List Application with Thermite(anglès)
* ↑ Guia interactiva del Thermite
* ↑ Slamdata - purescript-halogen(anglès)
* ↑ Guia sobre Halogen a parsonsmatt.org(anglès)
* ↑ purescript-optic-ui(anglès)
* ↑ Guia a zrho.me - User Interfaces with Optics Arxivat 2016-07-13 a Wayback Machine.(anglès)
* ↑ PureScript - Getting started(anglès)
* ↑ Bower - A package manager for the web
* ↑ bower.io
* ↑ github.com - psc-package
* ↑ github.com - psc-package sets
* ↑ Purescript's c++ backend Arxivat 2018-03-12 a Wayback Machine.(anglès)
* ↑ Introducing PureScript Erlang backend(anglès)
* ↑ El paquet purescript-control(anglès)
* ↑ El paquet purescript-lazy(anglès)
* ↑ El paquet purescript-lists(anglès)
* ↑ El paquet purescript-integers(anglès)
* ↑ purescript-eff(anglès)
* ↑ purescript-console(anglès)
* ↑ purescript-node-fs(anglès)
* ↑ purescript-dom(anglès)
* ↑ purescript-js-timers(anglès)
* ↑ Mòdul Control.Monad.Eff.Exception(anglès)
* ↑ purescript-aff(anglès)
* ↑ purescript-affjax(anglès)
* ↑ purescript-requests(anglès)
* ↑ SchoolOfHaskell.org Building Lazy Lists in PureScript from recursive definitions(anglès)

## Enllaços externs

* Pàgina oficial de PureScript(anglès)