Benutzer:Jsowieso/PureScript
Jsowieso/PureScript | |
---|---|
Paradigmen: | funktional, strikte Auswertung, modular, deklarativ |
Erscheinungsjahr: | 2013 |
Entwickler: | Phil Freeman, Gary Burgess und andere |
Aktuelle Version: | 0.14 () |
Typisierung: | statisch, stark, Typinferenz |
Beeinflusst von: | Haskell, JavaScript |
Betriebssystem: | plattformübergreifend |
Lizenz: | BSD |
purescript.org |
PureScript ist eine rein funktionale Programmiersprache die nach Javascript kompiliert. Syntax und Funktionsweise sind stark angelehnt an Haskell und die Implementierung selbst ist in Haskell geschrieben. Da die Sprache nach Javascript kompiliert ist sie überall da einsetzbar wo Javascript verwendet wird, hauptsächlich in Webanwendungen.
Entstehung und Geschichte
Erster Github-Eintrag, Changelog?, Ziele (bspw lesbares JS)
Merkmale
Da PureScript sehr stark von Haskell beeinflusst ist sollen hier nicht sämtliche Haskell-Eigenschaften wiederholt werden. Der größte Unterschied zur Haskell besteht darin dass PureScript strikt auswertet. Es lässt sich zwar mittels Lazy auch eingeschränkt nicht-strikter Code schreiben, vergleichbare Optimierungen wie in Haskell sind allerdings kaum möglich. Im Quellcode schlägt sich das größtenteils im Verwenden von Arrays statt Listen nieder.
Des weiteren wurden Klassenaufteilungen im Gegensatz zu Haskell etwas modernisiert und redundante Elemente entfernt, da keine Kompatibilität zu älteren Haskell-Versionen benötigt wurde. Es werden auch einige fortgeschrittene Erweiterungen Haskells standardmäßig implementiert (insb. Rank-N-Typpolymorphismus, Multi-Parameter-Typklassen, explizites forall).
Record-Syntax und Zeilen-Polymorphism
PureScript implementiert Javascripts Objekte (Schlüssel-Wert-Abbildungen) als Records. Jeder Record hat einen implizierten Typ. So ist bspw. der Typ von
{ x :: 3, y :: 4 }
gleich
{ x :: Number, y :: Number }
Für Funktionen die Records mit bestimmten Schlüsseln benötigen leitet der Compiler allerdings keinen konkreten Typ nur mit diesen Schlüsseln ab, sondern erlaubt sämtliche Records solange sie die benötigten Schlüssel enthalten. Der Typ bleibt also polymorph im Bezug auf die anderen Zeilen (Schlüssel-Wert-Paare).
showPoint p = "(" <> show p.x <> "," <> show p.y <> ")"
-- Typ von showPoint: forall r. { x :: Number, y :: Number | r } -> String
Mit expliziten Typannotation kann dieses Verhalten angepasst werden.
Einbinden von oder in Javascript
???
??? Die kleineren Abweichung zu Haskell sollten hier nicht von Relevanz sein, allerdings gibt es dann auch nichts mehr zu erwähnen… Vielleicht sollten doch die wesentlichen Eigenschaften von Haskell wiederholt werden.???
Codebeispiel
Ein minimales Hallo-Welt-Programm, welches auf die Browserkonsole ausgibt, sieht wie folgt aus:
module Main where
import Effect.Console (log)
main = log "Hallo Welt!"
Dieses kurze Beispiel verwendete keine Typannotationen, der Compiler hat sie eigenständig abgeleitet. Hier ist das obige Beispiel mit expliziten Typannotationen:
module Main where
import Prelude
import Effect (Effect)
import Effect.Console (log)
main :: Effect Unit
main = log "Hallo Welt!"
Bestandteile
REPL
PureScript enthält eine interaktive Codeausführungsumgebung namens PSCi (Pure Script Compiler interactive). Sie kann verwendet werden um kurze Codeschnipsel auf Funktionalität zu testen, insbesondere Typen von Funktionen und ihre Kompatibilität zueinander kann hier schnell überprüft werden.
Paketverwaltung
Eine eigene Paketverwaltung namens Spago, ansonsten NPM
Weblinks
Es gibt leider zur Zeit keinerlei deutschsprachige Literatur, die folgenden Verweise sind alle in englischer Sprache.
- Offizielle Website von PureScript
- Ausführliche Einführung in PureScript
- Online Editor
- Offizielles Dokumentationsverzeichnis
Aufgrund der großen Ähnlichkeit mit Haskell bietet es sich an zum Lernen auf Literatur zu Haskell zuzugreifen und später die Änderungen von PureScript zu lernen.
Einzelnachweise
Kategorie:Funktionale Programmiersprache
Kategorie:Freies Programmierwerkzeug