Arrays
Futhark arrays are written as values enclosed in square brackets.
def arr = [1,2,3]
The type of arr
is []i32
(or [3]i32
to be pedantic). The
element type of an array can be another array:
def marr = [[1,2,3], [4,5,6]]
The type of marr
is [][]i32
. Arrays must be regular, meaning
that all elements must have the same shape. An array such as
[[1,2], [3]
is illegal.
Arrays can be indexed from zero:
def first = arr[0]
And sliced:
def tail = arr[1:]
We can even slice or index only some dimensions:
def innermost = marr[:,1:2]
This produces [[2], [5]]
. Slices are inclusive in the starting
position and exclusive in the ending position as Dijkstra wills
it.
Strides are also supported. Generally, The expression a[i:j:s]
returns a slice of the array a
from index i
(inclusive) to j
(exclusive) with a stride of s
. If the stride is positive, then
i <= j
must hold, and if the stride is negative, then j <= i
must hold. For example, we can reverse an array like this:
def arr_reversed = arr[::-1]
Some syntactic sugar is provided for concisely specifying arrays of
intervals of integers. The expression x...y
produces an array
of the integers from x
to y
, both inclusive. The upper
bound can be made exclusive by writing x..<y
. For example:
def arr_range = 1...3
It is usually necessary to enclose a range expression in
parentheses, because they bind very loosely. A stride can be
provided by writing x..y...z
, with the interpretation “first
x
, then y
, up to z
”. For example:
def strided = 1..3...7
Now strided
contains [1, 3, 5, 7]
.
See also
Reference manual: slicing.