PureScript
![]() | |
Paradigm | functional |
---|---|
Family | Haskell |
Designed by | Phil Freeman |
First appeared | 2013 |
Stable release | |
Typing discipline | Inferred, static, strong |
License | BSD 3-clause[1] |
Filename extensions | .purs |
Website | www |
Influenced by | |
Haskell, JavaScript |
PureScript is a strongly-typed, purely-functional programming language that transpiles to JavaScript,[2] C++11,[3] Erlang,[4] and Go.[5] It can be used to develop web applications, server side apps, and also desktop applications with use of Electron or via C++11 and Go compilers with suitable libraries. Its syntax is mostly comparable to that of Haskell. Also, it introduces row polymorphism and extensible records.[6] Also, contrary to Haskell, the PureScript language is defined as having a strict evaluation strategy,[7] although there are non-conforming back-ends which implement a lazy evaluation strategy.[8] It is free and open-source software released under a BSD 3-clause license.
History
[edit]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 on GitHub. Further community-developed core tools include the dedicated build tool Pulp,[10] the documentation directory Pursuit,[11] and the package manager Spago[12]
Features
[edit]PureScript features strict evaluation, persistent data structures and type inference. The PureScript data type system shares many features with those of similar functional languages like Haskell: algebraic data types and pattern matching, higher kinded types, type classes and functional dependencies, and higher-rank polymorphism. PureScript's type system adds support for row polymorphism and extensible records.[13] However, PureScript lacks support for some of the more advanced features of Haskell such as the generalized algebraic data type (GADT) and the type family.
The PureScript transpilers attempt to produce readable code, where possible. Through a simple foreign function interface (FFI), it also allows code reuse of extant source code in JavaScript,[14] C++11,[15][16] and Go.[17]
PureScript supports incremental compilation, and the transpiler to JavaScript distribution includes support for building source code editor plugins for iterative development.[18] Editor plugins exist for many popular text editors, including Vim, Emacs, Sublime Text, Atom and Visual Studio Code.
PureScript supports type-driven development via its typed 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 has inspired similar work in the Glasgow Haskell Compiler (GHC).[20]
Examples
[edit]Here is a minimal "Hello, World!" program in PureScript:
module Main where import Effect.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:
module Main where import Prelude import Effect (Effect) import Effect.Console (log) main :: Effect Unit main = log "Hello World!"
See also
[edit]- Elm (programming language) – Functional programming language
- Reason (programming language) – Syntax extension and toolchain for OCaml
- JS++ – Web programming language
- TypeScript – Programming language and superset of JavaScript
References
[edit]- ^ "purescript/purescript". GitHub. 3 June 2022.
- ^ "PureScript to JavaScript transpiler". GitHub. Retrieved 2023-01-22.
- ^ "PureScript to C++11 transpiler". GitHub. Retrieved 2023-01-22.
- ^ purerl - the PureScript Erlang backend, purerl, 2023-09-04, retrieved 2023-09-05
- ^ "PureScript to Go transpiler". GitHub. Retrieved 2023-01-22.
- ^ "PureScript". purescript.org. Retrieved 2019-03-14.
- ^ "purescript/documentation". PureScript. 2023-02-19. Retrieved 2023-02-20.
- ^ Alternative backends, PureScript, 2023-02-19, retrieved 2023-02-20
- ^ "Read PureScript by Example". Leanpub.com. Retrieved 2019-03-14.
- ^ A build tool for PureScript projects, PureScript Contrib, 2019-03-08, retrieved 2019-03-14
- ^ "Pursuit". pursuit.purescript.org. Retrieved 2019-03-14.
- ^ PureScript package manager and build tool powered by Dhall and package-sets: spacchetti/spago, spacchetti, 2019-03-14, retrieved 2019-03-14
- ^ "Documentation for the PureScript language, compiler, and tools: purescript/documentation". PureScript. 2019-03-14. Retrieved 2019-03-14.
- ^ "The Foreign Function Interface". PureScript. 2015-07-15. Retrieved 2023-01-22.
- ^ "FFI". PureScript. 2019-07-26. Retrieved 2023-01-22.
- ^ C++ foreign export implementations for the standard library, PureScript, 2019-07-26, retrieved 2023-01-22
- ^ "Go foreign export implementations for the standard library". PureScript. 2020-12-13. Retrieved 2023-01-22.
- ^ purs ide: Editor and tooling support for the PureScript programming language, 2019-04-21, retrieved 2019-04-21
- ^ Implementing type directed search for PureScript, 2016-10-27
- ^ Gissurarson, Matthías Páll (2018-09-27). "Suggesting Valid Hole Fits for Typed-Holes (Experience Report)". ACM SIGPLAN Notices. 53 (7): 179–185. doi:10.1145/3299711.3242760. S2CID 218480974.