Functions

Functions are written with an arrow (->). The inputs go on the left side of the arrow, and the output goes on the right:

add : a b -> a + b
sum : add 1 2
show sum
3

Functions are also just values, so they can be assigned to variables as shown above, or they can be used inline:

sum : (a b -> a + b) 1 2
show sum
3

If you want to have multiple statements in a function, you can use a do block:

debug-sum : a b -> do { -- don't forget `do`!
    show "called `debug-sum`"
    a + b
}

show (debug-sum 1 2)
called `debug-sum`
3

Let’s build a function that takes a block and runs it twice:

twice : block -> do {
    do block
    do block
}

twice {
    show "Hello, world!"
}
Hello, world!
Hello, world!

We just defined our own control flow!

Finally, you can use text values as functions — if you put underscore (_) placeholders in the text and provide values afterward, you can do string interpolation:

greet : name -> "Greetings, _!" name
show (greet "everyone")
Greetings, everyone!