62 lines
1.5 KiB
Markdown
62 lines
1.5 KiB
Markdown
# Arrays
|
||
|
||
The `Array` type implements a *dynamic* (aka growable) array.
|
||
It is defined as
|
||
```lean
|
||
# namespace hidden
|
||
structure Array (α : Type u) where
|
||
data : List α
|
||
# end hidden
|
||
```
|
||
but its execution time representation is optimized, and it is similar to C++ `std::vector<T>` and Rust `Vec<T>`.
|
||
The Lean type checker has no special support for reducing `Array`s.
|
||
|
||
You can create arrays in several ways. You can create a small array by listing consecutive values between
|
||
`#[` and `]` and separated by commas, as shown in the following examples.
|
||
|
||
```lean
|
||
#check #[1, 2, 3] -- Array Nat
|
||
|
||
#check #[] -- Array ?m
|
||
```
|
||
|
||
The type of the array elements is inferred from the literals used and must be consistent.
|
||
```lean
|
||
#check #["hello", "world"] -- Array String
|
||
|
||
-- The following is not valid
|
||
#check_failure #[10, "hello"]
|
||
```
|
||
Recall that the command `#check_failure <term>` only succeeds when the given term is not type correct.
|
||
|
||
To create an array of size `n` in which all the elements are initialized to some value `a`, use `mkArray`.
|
||
```lean
|
||
#eval mkArray 5 'a'
|
||
-- #['a', 'a', 'a', 'a', 'a']
|
||
```
|
||
|
||
## Accessing elements
|
||
|
||
You can access array elements by using brackets (`[` and `]`).
|
||
```lean
|
||
#eval #['a', 'b', 'c'][1]
|
||
-- 'b'
|
||
|
||
def getThird (xs : Array Nat) : Nat :=
|
||
xs[2]
|
||
|
||
#eval getThird #[10, 20, 30, 40]
|
||
-- 30
|
||
```
|
||
The bracket operator is whitespace sensitive.
|
||
```lean
|
||
def f (xs : List Nat) : List Nat :=
|
||
xs ++ xs
|
||
|
||
def as : Array Nat :=
|
||
#[1, 2, 3, 4]
|
||
|
||
#eval f [1, 2, 3] -- This is a function application
|
||
|
||
#eval as[2] -- This is an array access
|
||
```
|