Allocating arrays

If you have been struggling with Motoko Arrays and the examples provided in the documentation, you are not alone! I tried the following example from the documentation:

let array1 : [Nat] = [1, 2, 3, 4, 6, 7, 8] ;
let array2 : [Nat] = Array_tabulate<Nat>(7, func(i:Nat) : Nat {
               if ( i == 2 or i == 5 ) { array1[i] * i } // change 3rd and 6th entries
               else { array1[i] } // no change to other entries
             }) ;

Calling the Array _tabulate function didnt’t work for me, even though it was stated that it’s in the compiler Prelude and doesn’t need additional imports.

What you need to do instead is the following:

import Array "mo:stdlib/array.mo";

let array1 : [Nat] = [1, 2, 3, 4, 6, 7, 8] ;
let array2 : [Nat] = Array.tabulate<Nat>(7, func(i:Nat) : Nat {
               if ( i == 2 or i == 5 ) { array1[i] * i } // change 3rd and 6th entries
               else { array1[i] } // no change to other entries
             }) ;

The same goes for Array_init which you would call the following way:

import Array "mo:stdlib/array.mo";

let x : [var Bool] = Array.init<Bool>(5,false);

This gives you an array the size of 5 holding the initial value false for each entry.

Looking at programs implemented by the team is a big help, i can only recommend to check out Linkedup and @enzo 's GitHub together with Sample Code from the documentation.

4 Likes

@hansl @alexa.smith why can’t i directly use Array_tabulate? Is this an error in the documentation or am I missing something?

The standard library is being re-organized to provide more structure and the documentation is lagging behind. Sorry about the confusion!

5 Likes

thanks for clearing things up :slight_smile: and welcome to the community :smiley:

Thank you for the update on the standard library @claudio