# QLinear

QLinear is type safe library for linear algebra based on `"macro-constructors"`

## Constructors:
 * matrix
    > ```[matrix| a b ; c d |]``` builds matrix __2x2__  `[ [a, b], [c, d] ]`  
    
    Example: 
    ```haskell
    [matrix| 1 2; 3 4 |] ~+~ [matrix| 2 3; 4 5 |] == [matrix| 3 5; 7 9 |] 
    ```   
    > Also you can't, for example, add two matrix with different size. 
    ```haskell
   [matrix| 1 2; 3 4 |] ~+~ [matrix| 1 2 3; 4 5 6; 7 8 9 |] -- will not be compiled
    ```

  * vector
    > ```[vector| a b c d |]``` builds matrix __4x1__ `[ [a], [b], [c], [d] ]`  
 * operator
    > ```[operator| (x, y) => (y, x) |]``` builds matrix __2x2__ of operator `[ [0, 1], [1, 0] ]` that swaps coodrinates  
    > ```[operator| (x, y) => (2 * x, y) |]``` builds matrix __2x2__ of operator `[ [2, 0], [0, 1] ]` that doubles `x` coordinate  
   
   Example: 
    ```haskell
    [operator| (x, y) => (3 * y, x / 2) |] ~*~ [vector| 2 8 |] == [vector| 24 1 |]
    ```
## Syntax:
   * matrix: `val11 val12 .. val1n; val21 val22 .. val2n; ..; valm1 valm2 .. valmn `
   * vector: `val1 val2 .. valn`
   * operator: `(var1, var2, .., varn) =>  (exp1, exp2, .., expn)`  
     where 
     * `val` is `number literal`, `variable` or `any Haskell expression` between `(` and `)`
     * `var` is Haskell variable   
     * `exp` is any Haskell expression
  ---
Also there are basic operations as determinant, transposition, etc.