Edit first section of tutorial
This commit is contained in:
parent
84205ff9cb
commit
4df7c93ad1
|
@ -1,18 +1,18 @@
|
||||||
# Fundamental Data Types
|
# Fundamental Data Types
|
||||||
|
|
||||||
Most of the data that NumIdr operates on is stored in arrays, but there are a few other types and structures that are important to understand.
|
NumIdr exports a number of different datatypes. The most important type to be aware of is the _array_, but there are other useful types as well.
|
||||||
|
|
||||||
## Arrays
|
## Arrays
|
||||||
|
|
||||||
### What is an Array?
|
### What is an Array?
|
||||||
|
|
||||||
In most programming languages and libraries, the word "array" is used to mean a one-dimensional list of values that is contiguous in memory. A typical array of integers may be written in list form like this:
|
In most programming languages, the word "array" is used to mean a one-dimensional list of values that is contiguous in memory. A typical array of integers may be written in list form like this:
|
||||||
|
|
||||||
```
|
```
|
||||||
[1, 4, 10, 2, -5, 18]
|
[1, 4, 10, 2, -5, 18]
|
||||||
```
|
```
|
||||||
|
|
||||||
In a typical one-dimensional array, elements are indexed by a single integer, starting at zero and increasing from left to right.
|
In this kind of array, elements are indexed by a single integer, starting at zero and increasing from left to right.
|
||||||
|
|
||||||
NumIdr, however, uses the word a bit more generally: a NumIdr array is a multi-dimensional structure that can be indexed by any number of integers. NumIdr arrays are written as nested lists:
|
NumIdr, however, uses the word a bit more generally: a NumIdr array is a multi-dimensional structure that can be indexed by any number of integers. NumIdr arrays are written as nested lists:
|
||||||
|
|
||||||
|
@ -63,7 +63,7 @@ A scalar is a rank-0 array, meaning that it is indexed by 0 integers. Its alias
|
||||||
|
|
||||||
```idris
|
```idris
|
||||||
Scalar : (a : Type) -> Type
|
Scalar : (a : Type) -> Type
|
||||||
Scalar = Array []
|
Scalar a = Array [] a
|
||||||
```
|
```
|
||||||
|
|
||||||
A scalar has exactly one index, the empty list `[]`. This means that it is exactly the same as a single value and as such is largely pointless, but NumIdr still provides an alias for it just in case you need it.
|
A scalar has exactly one index, the empty list `[]`. This means that it is exactly the same as a single value and as such is largely pointless, but NumIdr still provides an alias for it just in case you need it.
|
||||||
|
@ -74,10 +74,10 @@ A vector is a rank-1 array:
|
||||||
|
|
||||||
```idris
|
```idris
|
||||||
Vector : (n : Nat) -> (a : Type) -> Type
|
Vector : (n : Nat) -> (a : Type) -> Type
|
||||||
Vector n = Array [n]
|
Vector n a = Array [n] a
|
||||||
```
|
```
|
||||||
|
|
||||||
A vector's type signature and stored data is effectively identical to that of the standard library type `Vect`, whose elements are confusingly also called "vectors"; we often refer to these as "vects" to differentiate.
|
A vector's type signature and stored data is effectively identical to that of the standard library type `Vect`, whose elements are confusingly also called "vectors"; we often refer to those as "vects" to differentiate.
|
||||||
|
|
||||||
Indices are typically written as lists of integers, but for vectors it is occasionally acceptable to write the single index number without putting it inside a list. This is mostly the case for indexing, where each indexing function has an alternate definition specifically for vectors.
|
Indices are typically written as lists of integers, but for vectors it is occasionally acceptable to write the single index number without putting it inside a list. This is mostly the case for indexing, where each indexing function has an alternate definition specifically for vectors.
|
||||||
|
|
||||||
|
@ -87,14 +87,14 @@ As mentioned before, a matrix is a rank-2 array:
|
||||||
|
|
||||||
```idris
|
```idris
|
||||||
Matrix : (m, n : Nat) -> (a : Type) -> Type
|
Matrix : (m, n : Nat) -> (a : Type) -> Type
|
||||||
Matrix m n = Array [m, n]
|
Matrix m n a = Array [m, n] a
|
||||||
```
|
```
|
||||||
|
|
||||||
There is also an alias `Matrix'` for square matrices.
|
There is also an alias `Matrix'` for square matrices.
|
||||||
|
|
||||||
```idris
|
```idris
|
||||||
Matrix' : (n : Nat) -> (a : Type) -> Type
|
Matrix' : (n : Nat) -> (a : Type) -> Type
|
||||||
Matrix' n = Array [n, n]
|
Matrix' n a = Array [n, n] a
|
||||||
```
|
```
|
||||||
|
|
||||||
As a linear algebra library, the majority of the operations in NumIdr revolve around matrices.
|
As a linear algebra library, the majority of the operations in NumIdr revolve around matrices.
|
||||||
|
@ -105,14 +105,14 @@ NumIdr also provides aliases for homogeneous matrices:
|
||||||
|
|
||||||
```idris
|
```idris
|
||||||
HMatrix : (m, n : Nat) -> (a : Type) -> Type
|
HMatrix : (m, n : Nat) -> (a : Type) -> Type
|
||||||
HMatrix m n = Array [S m, S n]
|
HMatrix m n a = Array [S m, S n] a
|
||||||
|
|
||||||
HMatrix' : (n : Nat) -> (a : Type) -> Type
|
HMatrix' : (n : Nat) -> (a : Type) -> Type
|
||||||
HMatrix' n = Array [S n, S n]
|
HMatrix' n a = Array [S n, S n] a
|
||||||
|
|
||||||
-- To use with homogeneous matrices
|
-- To use with homogeneous matrices
|
||||||
HVector : (n : Nat) -> (a : Type) -> Type
|
HVector : (n : Nat) -> (a : Type) -> Type
|
||||||
HVector n = Array [S n]
|
HVector n a = Array [S n] a
|
||||||
```
|
```
|
||||||
|
|
||||||
These are useful for clarity when working with both homogeneous and non-homogeneous matrices.
|
These are useful for clarity when working with both homogeneous and non-homogeneous matrices.
|
||||||
|
@ -130,16 +130,16 @@ Transform : (ty : TransType) -> (n : Nat) -> (a : Type) -> Type
|
||||||
The `TransType` parameter dictates what kind of transform it is. These eight options are currently available:
|
The `TransType` parameter dictates what kind of transform it is. These eight options are currently available:
|
||||||
|
|
||||||
**Linear Types:**
|
**Linear Types:**
|
||||||
- Trivial (always the identity transformation)
|
- `Trivial` (always the identity transformation)
|
||||||
- Rotation
|
- `Rotation`
|
||||||
- Orthonormal (rotation + reflection)
|
- `Orthonormal` (rotation + reflection)
|
||||||
- Linear
|
- `Linear`
|
||||||
|
|
||||||
**Affine Types:**
|
**Affine Types:**
|
||||||
- Translation
|
- `Translation`
|
||||||
- Rigid (rotation + translation)
|
- `Rigid` (rotation + translation)
|
||||||
- Isometry (rotation + reflection + translation)
|
- `Isometry` (rotation + reflection + translation)
|
||||||
- Affine
|
- `Affine`
|
||||||
|
|
||||||
The `TransType` value is obtained by prepending a capital T to these names. For example, an isometry may have the type `Isometry 3 Double`, which is an alias for `Transform TIsometry 3 Double`.
|
The `TransType` value is obtained by prepending a capital T to these names. For example, an isometry may have the type `Isometry 3 Double`, which is an alias for `Transform TIsometry 3 Double`.
|
||||||
|
|
||||||
|
@ -152,3 +152,5 @@ In order to properly apply these transforms, the `Point` type must be used, whic
|
||||||
### Permutations
|
### Permutations
|
||||||
|
|
||||||
The type `Permutation n` represents a permutation of `n` elements. Permutations are mostly used internally for various algorithms, but they are also an input in various operations, such as those that permute the axes of an array.
|
The type `Permutation n` represents a permutation of `n` elements. Permutations are mostly used internally for various algorithms, but they are also an input in various operations, such as those that permute the axes of an array.
|
||||||
|
|
||||||
|
[Contents](Intro.md) | [Next](Operations.md)
|
||||||
|
|
Loading…
Reference in a new issue