Docs / Language Manual / Mutation

You are currently looking at the v8.0.0 docs (Reason v3.6 syntax edition). You can find the latest manual page here.


ReScript has great traditional imperative & mutative programming capabilities. You should use these features sparingly, but sometimes they allow your code to be more performant and written in a more familiar pattern.

Mutate Let-binding

Let-bindings are immutable, but you can wrap it with a ref, exposed as a record with a single mutable field in the standard library:

Reason (Old Syntax)ML (Older Syntax)JS Output
let myValue = ref(5);


You can get the actual value of a ref box through accessing its contents field:

Reason (Old Syntax)ML (Older Syntax)JS Output
let five = myValue.contents; // 5

We provide a syntax shortcut for myValue.contents: myValue^. Though we no longer encourage it.

Assign a new value to myValue like so:

Reason (Old Syntax)ML (Older Syntax)JS Output
myValue.contents = 6;

We provide a syntax sugar for this:

Reason (Old Syntax)ML (Older Syntax)JS Output
myValue := 6;

Note that the previous binding five stays 5, since it got the underlying item on the ref box, not the ref itself.

Note: you might see in the JS output tabs above that ref allocates an object. Worry not; local, non-exported refs allocations are optimized away.

Tip & Tricks

Before reaching for ref, know that you can achieve lightweight, local "mutations" through overriding let bindings.