Skip to content

unisonweb/unison

Folders and files

NameName
Last commit message
Last commit date
Apr 8, 2025
Jul 9, 2024
Apr 2, 2025
Sep 26, 2024
May 24, 2020
Mar 4, 2025
Aug 22, 2024
Feb 20, 2025
Mar 12, 2025
Apr 25, 2025
Apr 15, 2025
Jan 9, 2025
Nov 26, 2024
Oct 23, 2024
Apr 25, 2025
Apr 23, 2025
Aug 29, 2024
Mar 20, 2025
Apr 23, 2025
Mar 20, 2025
Mar 12, 2025
Apr 25, 2025
Apr 16, 2025
Jan 14, 2025
Jul 22, 2024
Mar 1, 2022
Jan 15, 2025
Jun 7, 2021
Nov 5, 2024
Jul 19, 2024
Dec 31, 2024
Aug 25, 2024
Jan 22, 2024
Feb 25, 2024
Mar 30, 2025
Oct 6, 2016
Mar 14, 2025
Aug 20, 2024
Apr 2, 2025
Jun 28, 2024
Mar 12, 2025
Jan 15, 2025
Aug 29, 2024
Oct 23, 2024
Aug 30, 2024
May 7, 2021

Repository files navigation

The Unison language

CI Status Pre-Release Status

Alt

Overview

Unison is a statically-typed functional language with type inference, an effect system, and advanced tooling. It is based around a big idea of content-addressed code, in which function are identified by a hash of their implementation rather than by name, and code is stored as its AST in a database. This provides a number of benefits:

  • No builds. Unison has perfect incremental compilation, with a shared compilation cache that is part of the codebase format. Despite the strong static typing, you are almost never waiting for code to compile.
  • Instant, non-breaking renaming of definitions.
  • Perfect caching of tests, only rerunning determinstic tests if dependencies changed.
  • Semantically-aware version control, avoiding spurious merge conflicts from things like order of imports, whitespace or code formatting differences, and so on.

Unison can be used like any other general-purpose language, or you can use it in conjunction with Unison Cloud for building distributed systems.

Here is some sample code:

-- A comment!
-- Function signatures appear before the definition
factorial : Nat -> Nat
factorial n = product (range 0 (n + 1))

-- Signatures can left off; they will be inferred
List.map f as =
  go acc rem = match rem with
    [] -> acc
    a +: as -> go (acc :+ f a) as
  go [] as

> List.map (x -> x * 10) (range 0 10)
= [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]

> List.map factorial [1,2,3,4]
= [1, 2, 6, 24]

Functions arguments are separated by spaces instead of parens and commas. Loops are written using recursion (above the helper function go defines a loop). The language supports pattern matching via match <expr> with <cases>, which works for lists and also user-defined data types.

Other resources:

Building using Stack

If these instructions don't work for you or are incomplete, please file an issue.

The build uses Stack. If you don't already have it installed, follow the install instructions for your platform. (Hint: brew update && brew install stack)

$ git clone https://github.com/unisonweb/unison.git
$ cd unison
$ stack --version # we'll want to know this version if you run into trouble
$ stack build --fast --test && stack exec unison

To run the Unison Local UI while building from source, you can use the /dev-ui-install.sh script. It will download the latest release of unison-local-ui and put it in the expected location for the unison executable created by stack build. When you start unison, you'll see a url where Unison Local UI is running.

See development.markdown for a list of build commands you'll likely use during development.

Language Server Protocol (LSP)

View Language Server setup instructions here.

Codebase Server

When ucm starts it starts a Codebase web server that is used by the Unison Local UI. It selects a random port and a unique token that must be used when starting the UI to correctly connect to the server.

The port, host and token can all be configured by providing environment variables when starting ucm: UCM_PORT, UCM_HOST, and UCM_TOKEN.

Configuration

See the documentation for configuration here