PureScript | ||
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 .
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"
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 .
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!"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 '.
Så
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.
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 = _.aireder 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 } -> ahvis kommentaren ikke hadde blitt spesifisert.
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 }