Functions
Overview of functions in Squiggle
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:
(number) => number
(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
orPlot.distFn
plots, using thexScale
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 forNumber.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.