Documentation
Guides
Functions

Functions

Basic Syntax

In Squiggle, function definitions are treated as values. There's no explicit return statement; the result of the last expression in the function body is returned. If you need to define local variables in functions, you can use blocks. The last expression in the block is the value of the block:

Anonymous Functions

In Squiggle, you can define anonymous functions using the {|...| ...} syntax. For example, myMultiply(x, y) = x * y and myMultiply = {|x, y| x * y} are equivalent.

Squiggle functions are first-class values, meaning you can assign them to variables, pass them as arguments to other functions, and return them from other functions.

Function Visualization

The Squiggle viewer can automatically visualize functions that take a single number as input and return either a number or a distribution, without the need for manual plots:

  1. (number) => number
  2. (number) => distribution

When Squiggle visualizes a function, it automatically selects a range of input values to use. The default range of input values is 0 to 10.

You can manually set the range in the following ways:

  • With Plot.numericFn or Plot.distFn plots, using the xScale parameter
  • Through the chart's settings in the UI (look for a gear icon next to the variable name)
  • With parameter annotations (explained below)

Unit Types

Like with variables, you can declare unit types for function parameters:

You can also declare the unit type of the function's return value:

If you pass a unit-typed variable to a function with no unit-type annotations, Squiggle will attempt to infer the unit type of the return value:

Unit type checking only works for statically defined functions. In the example code below, h cannot be unit-type checked.

Parameter Annotations

Function parameters can be annotated with domains to specify the range of valid input values.

Examples:

  • x: Number.rangeDomain(5, 10)
  • x: [5, 10] — shortcut for Number.rangeDomain(...)

Annotations help to document possible values that can be passed as a parameter's value.

Annotations will affect the parameter range used in the function's chart. For more control over function charts, you can use the Plot module API.

Domains are checked on function calls; f(x: [1,2]) = x; f(3) will fail.

We plan to support other kinds of domains in the future; for now, only numeric ranges are supported.

Annotation Reflection

Domains and parameter names can be accessed by the fn.parameters property.