This articlerelies excessively onreferences toprimary sources. Please improve this article by addingsecondary or tertiary sources. Find sources: "PureScript" – news ·newspapers ·books ·scholar ·JSTOR(August 2019) (Learn how and when to remove this message) |
| PureScript | |
|---|---|
| Paradigm | functional |
| Family | Haskell |
| Designed by | Phil Freeman |
| First appeared | 2013; 13 years ago (2013) |
| Stable release | |
| Typing discipline | Inferred,static,strong |
| License | BSD 3-clause[1] |
| Filename extensions | .purs |
| Website | www |
| Influenced by | |
| Haskell,JavaScript | |
PureScript is astrongly typed,purely functionalprogramming language thattranspiles toJavaScript[2] and, with alternate backends, toC++11,[3]Erlang,[4] andGo.[5] It can be used to develop web applications, server side apps, and also desktop applications with use ofElectron or via C++11 and Go compilers with suitable libraries. Its syntax is mostly comparable to that ofHaskell. Also, it introducesrow polymorphism andextensible records.[6] Also, contrary to Haskell, the PureScript language is defined as having astrict evaluation strategy,[7] although there are non-conforming back-ends which implement alazy evaluation strategy.[8] It isfree and open-source software released under aBSD 3-clause license.
PureScript was initially designed by Phil Freeman in 2013. He began work on it because he was unsatisfied by other attempts to transpile Haskell to JavaScript (e.g., using Fay, Haste, or GHCJS).[9]
Since then it has been adopted by the community and is developed onGitHub. Further community-developed core tools include the dedicated build toolPulp,[10] the documentation directoryPursuit,[11] and the package managerSpago.[12]
PureScript featuresstrict evaluation,persistent data structures, andtype inference. Itsdata type system shares many features with those of similar functional languages likeHaskell:algebraic data types andpattern matching,higher kinded types,type classes,functional dependencies, andhigher-rank polymorphism. Its type system adds support forrow polymorphism and extensible records,[13] but does not support some of the more advanced features of Haskell such as thegeneralized algebraic data type (GADT) and thetype family.
The PureScript transpilers attempt to produce readable code, where possible. Through a simpleforeign function interface (FFI), it also allowscode reuse of extantsource code in JavaScript,[14] C++11,[15][16] and Go,[17] usually as anintermediate representation.
PureScript supportsincremental compilation, and the transpiler to JavaScript distribution supports buildingsource-code editorplug-ins for iterative development.[18] Editor plug-ins exist for many popular text editors, includingVim,Emacs,Sublime Text,Atom andVisual Studio Code.
PureScript supportstype-driven development via itstyped holes feature,[19] in which a program can be constructed with missing subexpressions. The JavaScript transpiler will subsequently attempt to infer the types of the missing subexpressions, and report those types to the user. This feature inspired similar work in theGlasgow Haskell Compiler (GHC).[20]
Here is a minimal"Hello, World!" program in PureScript:
moduleMainwhereimportEffect.Console(log)main=log"Hello World!"
Here, the type of the program is inferred and checked by the PureScript transpiler. A more verbose version of the same program might include explicit type annotations:
moduleMainwhereimportPreludeimportEffect(Effect)importEffect.Console(log)main::EffectUnitmain=log"Hello World!"