Fork me on GitHub
Source file: inplace.fut

In-place updates

Futhark supports a mechanism for changing the contents of an array without copying the entire array.

def update (A: *[]i32) (i: i32) (v: i32) =
  A with [i] = v
> update [1,2,3] 0 42
[42, 2, 3]

The * annotation for the A parameter indicates that the update function consumes the array, meaning the argument value may not be used again by the caller. This is checked through Futhark’s in-place update system.

We can also create a variant of update that does not consume the array, at the cost of always copying it.

def update_copy (A: []i32) (i: i32) (v: i32) =
  copy A with [i] = v

This is observably equivalent to update.

> update_copy [1,2,3] 0 42
[42, 2, 3]

See also

Swapping two elements of an array.