This blog post gives a brief high-level explanation of Facebook’s new programming language, ReasonML.
Blog posts in this series
Last updated: 2018-01-15.
- What is ReasonML [this blog post]
- Getting started with ReasonML
- What is planned for ReasonML?
- Basic values and types
let bindings and scopes
- Pattern matching: destructuring,
- Basic modules
- Variant types
- Polymorphic variant types
- Lists and arrays
What is ReasonML?
This is what ReasonML code looks like (example taken from ReasonML’s online playground).
type tree = Leaf | Node(int, tree, tree);
let rec sum =
| Leaf => 0
| Node(value, left, right) => value + sum(left) + sum(right);
let myTree =
Node(2, Node(4, Leaf, Leaf), Node(6, Leaf, Leaf)),
Node(3, Node(5, Leaf, Leaf), Node(7, Leaf, Leaf))
sum(myTree) |> Js.log;
The benefits of OCaml
ReasonML’s foundation, OCaml, brings the following benefits:
- It is an established language (created in 1996) that has proven itself in many projects. Facebook itself is using it in several projects (e.g. Flow).
- Its core is a functional programming language with a full-featured type system. But it also supports object-orientation and mutable state.
Full rebuild of the Reason part of the codebase is ~2s (a few hundreds of files), incremental build (the norm) is <100ms on average. The BuckleScript author estimates that the build system should scale to a few hundred thousands files in the current condition.
The ReasonML team also aims to improve the OCaml ecosystem:
- Better tooling (testing, documentation, editor support, etc.).
- Better standard library (there is a fair amount of competition in this space in OCaml, without a clear winner). Here, the goal is also to use camel-cased names (
createResource). OCaml uses snake-casing for lowercase names (
create_resource) and camel-casing for uppercase names (
OCaml’s pragmatism means that you don’t get some of the more fancy functional features (that, e.g., Haskell has), but it also leads to fast compilation, efficient code and decent error messages.