⛅ Coming soon: create Unison Cloud clusters in minutes on your own infrastructure. Learn more

Identifiers

Unison identifiers come in two flavors:

  1. Regular identifiers start with an alphabetic unicode character, emoji (which is any unicode character between 1F400 and 1FAFF inclusive), or underscore (''_''), followed by any number of alphanumeric characters, emoji, or the characters _, !, or \'. For example, foo, _bar4, qux', and set! are valid regular identifiers.
  2. Operators consist entirely of the characters !$%^&*-=+<>~\\/|:. For example, +, *, <>, and >>= are valid operators.

Namespace-qualified identifiers

The general reference for identifiers describes unqualified identifiers. An identifier can also be qualified. A qualified identifier consists of a qualifier or namespace, followed by a ., followed by either a regular identifier or an operator. The qualifier is one or more regular identifiers separated by . For example Foo.Bar.baz is a qualified identifier where Foo.Bar is the qualifier.

The qualifier is one or more regular

Absolutely qualified identifiers

Note that absolutely qualified identifiers are much less prevalent with the advent of Unison projects. They refer to a term from the root of the entire codebase, not the root of a particular project, so their usage is limited to legacy support of a pre-project era.

Namespace-qualified identifiers are relative to a “current” namespace, which the programmer can set (and defaults to the root of the current project). To ignore the current namespace, an identifier can have an absolute qualifier. An absolutely qualified name begins with a .. For example, the name .base.List always refers to the name .base.List, regardless of the current project or namespace, whereas the name base.List will refer to lib.base.List if the current namespace contains the base library in its lib namespace.

Hash-qualified identifiers

Any identifier, including a namespace-qualified one, can appear hash-qualified. A hash-qualified identifier has the form x#h where x is an identifier and #h is a hash literal. The hash disambiguates names that may refer to more than one thing.

Reserved words

The following names are reserved by Unison and cannot be used as identifiers: =, :, ->, ', do, |, !, `, if, then, else, forall, handle, unique, structural, where, use, &&, ||, true, false, type, ability, alias, let, namespace, cases, match, with, termLink, typeLink.

Reserved wordUsage contextExample
=Used in defining expressionsfoo = 42
:Used in type signatures to introduce the type of a termNat.increment : Nat -> Nat
->Represents a function in type signatures and lambdasNat.isEven : Nat -> Boolean
' doIntroduces a delayed computation blockmain = do printLine "hi!"
|Used in pattern matching and guards and in separating type constructorsmatch n with n | Nat.isEven n -> "even"
!Used to force a delayed computation!console.readLine
`Used in documentation to indicate a code snippet or example{{`anExample = "in a doc"`}}
if then elseUsed in conditional expressionsif x > 0 then "positive" else "negative"
forallUsed in polymorphic type signaturesforall a. a -> a
handleUsed in ability handlershandle resume() with h (acc ++ [e])
uniqueIntroduces a unique type in a type definitionunique type MyType = MyType Nat
structuralIntroduces a structural type in a type definitionstructural type ConsList a = Cons a | Nil
whereIntroduces the request constructors for an ability
structural ability Stream e where
  emit : e -> ()
useImports a term or type into the current scopeuse Nat +
&&Logical AND operatortrue && false
||Logical OR operatortrue || false
true falseBoolean literalstrue false
typeIntroduces a new type definition
type GUID
abilityIntroduces a new ability definitionability Console where ...
aliasIntroduces an alias for a term or type
letIntroduces a new indended codeblock inside a definition
List.map (cases (x, y) -> let
  x + y
) [(1,2)]
namespaceIn a file, specifies that the subsequent definitions should be prefixed with the given namespacenamespace myNamespace
casesAlternative syntax for pattern matchingcases foo -> "bar"
match withPattern matching syntaxmatch foo with
typeLinkCreates a link to a type definition, used primarily in creating Failures for exceptionsFailure (typeLink Generic) msg (Any a)
termLinkCreates a link to a term definition