PureScript

PureScript
Logo.
Dato for første versjon 2013
Paradigmer funksjonell
Forfatter Phil freeman
Siste versjon 0,14,0 (1 st mars 2021)
Skrive Sterk , statisk , type inferens
Påvirket av Elm , F # , Haskell , Koka , OCaml , Roy , Standard ML
Tillatelse Givende ( License_BSD_Modified )
Nettsted www.purescript.org
Filutvidelser .ren

PureScript er et sterkt skrevet , funksjonelt programmeringsspråk hvis kompilering produserer JavaScript- kode . Den kan brukes til å utvikle webapplikasjoner, serverapplikasjoner og også stasjonære applikasjoner takket være Electron- rammeverket . Syntaksen er i det vesentlige sammenlignbar med Haskells . Imidlertid introduserer språket en bestemt parameterisert polymorfisme relatert til utvidbare poster: polymorfe (en) poster . I tillegg til, i motsetning til Haskell, følger PureScript en streng gjennomgangsstrategi .  

Historisk

PureScript ble opprinnelig designet av Phil Freeman i 2013. Han begynte sitt arbeid på PureScript etter ulike utilfredsstillende forsøk på å kompilere Haskell til JavaScript, og bevarte semantikken (ved å bruke f.eks. Fay, Haste eller GHCJS).

Siden den gang har prosjektet blitt overtatt av samfunnet og blir utviklet på GitHub . Blant de ekstra viktige verktøyene som er utviklet av samfunnet, kan vi nevne det dedikerte samleverktøyet "Pulp", dokumentarsiden "Pursuit" og pakkelederen "Spago"

Kjennetegn

PureScript er basert på streng evaluering , vedvarende datastruktur og type inferens . De typer system PureScript deler mange egenskaper med det lignende funksjonelle språk som Haskell : Den algebraiske datatype og mønstergjenkjenning , de "høyere kinded typer"  (i) de "type klasser"  (i) og funksjonelle avhengigheter , og polymorfi " høyere rang "  (in) . Typene av PureScript-system gir også polymorfe poster  (in) og utvidbare registreringer . Imidlertid har PureScript ikke noen av de mer avanserte funksjonene som Haskell GADT og "families like"  (in) .

PureScript's kompilator har en tendens til å produsere lesbar JavaScript-kode så mye som mulig. Med et enkelt grensesnitt "FFI"  (in) muliggjør det integrering av eksisterende JavaScript-kode.

PureScript gir inkrementell kompilering , og distribusjonen inkluderer interaktiv utviklingsstøtte fra plugins for å installere i kildekodeditoren . Plugins finnes for et stort antall kjente redaktører, inkludert Vim , Emacs , Sublime Text , Atom og Visual Studio Code .

Eksempler på koder

Her er en "Hello world!" minimal i PureScript:

module Main where import Effect.Console (log) main = log "Hello World!"

Her blir typen program utledet og kontrollert av PureScript-kompilatoren. En mer detaljert versjon av det samme programmet kan eksplisitt inkludere typekommentarer:

module Main where import Prelude import Effect (Effect) import Effect.Console (log) main :: Effect Unit main = log "Hello World!"

PureScript-opptak

Modellen som ble valgt for å utvikle poster i PureScript tillot tilgang til visse funksjoner som fremdeles mangler fra Haskell, noe som gjør den til en av de viktigste egenskapene til språket.

Først og fremst bør det bemerkes at i PureScript har hver post en spesiell type reservert for denne bruken, som i seg selv presenteres i form av en post som består av et (uordnet) sett med tagpar: type '.

carré :: { côté :: Number, aire :: Number } carré = { côté: 3.0, aire: 9.0 }

og

disque :: { rayon :: Number, aire :: Number } disque = { rayon: 1.0, aire: 3.141592653589793 }

er to poster av forskjellige typer fordi, selv om antall og type verdier er de samme, er ikke etikettene det.

Polymorfe poster

Det er imidlertid mulig å definere en funksjon som kan brukes på hver av de forrige postene takket være det polymorfe opptakskonseptet:

aireDe :: forall r. { aire :: Number | r } -> Number aireDe = _.aire

der typen av argumentet kan leses som "typen av en hvilken som helst post som har en" areal "-etikett av typen" Number ", og som muligens har andre label (er)". Argumentet for denne funksjonen er derfor en polymorf rekord, og kompilatoren ville ha utledet

aireDe :: forall a b. { aire :: a | b } -> a

hvis kommentaren ikke hadde blitt spesifisert.

Utvidelse av prototyper

I virkeligheten er notasjonen {label1 :: Type1, Type2 :: label2} bare et syntaktisk sukker med en mer generell konstruksjon som letter utvidelse av typene poster , Recordi PureScript (utvidelse av usammenhengende fagforeninger som er merket er lik). Denne konstruksjonen utføres fra erklæringer, sidestillinger og applikasjoner av prototyper ( Row):

-- Prototypes (syntaxe commune aux enregistrements et aux variants): type NonConcrétisableA r = ( aire :: Number | r ) type NonConcrétisableBC r = ( boîte :: Boolean, côté :: Number | r ) type NonConcrétisableABC r = NonConcrétisableA (NonConcrétisableBC r)

Det er ikke direkte mulig å lage verdier som tilsvarer disse prototypene ( Row Typeog Typeer ikke i samme kategori ). For å gjøre dette bruker vi konstruktøren Record:

-- Type concret et ouvert (= paramétré): type Enregistrement r = Record (NonConcrétisableABC r)

Verdier kan deretter fylle ut denne typen:

-- Type concret et fermé (= non-paramétré): carré :: Enregistrement () carré = { côté: 2.0 , aire: 4.0 , boîte: false }

eller en av utvidelsene:

-- Type concret, étendu et fermé: cube :: Enregistrement (volume :: Number) cube = { côté: 2.0 , aire: 24.0 , volume: 8.0 , boîte: true }

Se også

Merknader og referanser

  1. "  purescript / purescript  " , på GitHub
  2. “  Hugs documentation  ” , på www.haskell.org
  3. "  Les PureScript etter eksempel | Leanpub  ” , på leanpub.com (åpnet 14. mars 2019 )
  4. "  PureScript på Github  "
  5. "  Pulp  " , PureScript Contrib (åpnet 14. mars 2019 ).
  6. "  Forfølgelse  "pursuit.purescript.org (åpnet 14. mars 2019 )
  7. "  ? PureScript pakkebehandling og byggverktøy drevet av Dhall og pakke-sett: spacchetti / spago  " , spacchetti,14. mars 2019(åpnet 14. mars 2019 )
  8. "  Dokumentasjon for PureScript-språket, kompilatoren og verktøyene.: Purescript / dokumentasjon  " , PureScript,14. mars 2019(åpnet 14. mars 2019 )
  9. "  pure ide: Editor og verktøystøtte for PureScript programmeringsspråk  " ,21. april 2019(åpnet 21. april 2019 )
  10. “  Utvidbar plate  ” , på wiki.haskell.org
  11. "  Variant " ,21. april 2019(åpnet 21. april 2019 )

Eksterne linker