idris-is-awesome.github.io

Code snippets to quickly getting started with Idris programming language

Index page Videos View on GitHub

Quick sort

quicksort : Ord elem => List elem -> List elem
quicksort [] = []
quicksort (x :: xs) =
  let lesser = filter (< x) xs
      greater = filter(>= x) xs in
        (quicksort lesser) ++ [x] ++ (quicksort greater)

WARN: function is not total

Insertion sort

import Data.Vect

insert : Ord elem =>
         (x : elem) -> (xsSorted : Vect len elem) -> Vect (S len) elem
insert x [] = [x]
insert x (y :: xs) = case x < y of
                          True => x :: y :: xs
                          False => y :: insert x xs

insSort : Ord elem => Vect n elem -> Vect n elem
insSort [] = []
insSort (x :: xs) = let xsSorted = insSort xs in
                        insert x xsSorted

Transpose a matrix

This is the implementation similar to the one from Data.Vect

import Data.Vect

transposeMat : Vect m (Vect n elem) -> Vect n (Vect m elem)
transposeMat [] = replicate _ []
transposeMat (x :: xs) = let xsTrans = transposeMat xs in
                         zipWith (::) x xsTrans

Slightly more verbose version

import Data.Vect

createEmpties : Vect n (Vect 0 elem)
createEmpties = replicate _ []

transposeHelper : (x : Vect n elem) ->
                  (xsTrans : Vect n (Vect k elem)) ->
                  Vect n (Vect (S k) elem)
transposeHelper [] [] = []
transposeHelper (x :: xs) (y :: ys) = (x :: y) :: transposeHelper xs ys

transposeMat : Vect m (Vect n elem) -> Vect n (Vect m elem)
transposeMat [] = createEmpties
transposeMat (x :: xs) = let xsTrans = transposeMat xs in
                         transposeHelper x xsTrans

Multiply matrices

import Data.Vect

dotProduct : Num elem =>
             Vect n elem -> Vect n elem -> elem
dotProduct [] [] = 0
dotProduct (x :: xs) (y :: ys) = x*y + dotProduct xs ys

multiplyMat : Num elem =>
              Vect n (Vect m elem) ->
              Vect m (Vect p elem) ->
              Vect n (Vect p elem)
multiplyMat [] _ = []
multiplyMat (x :: xs) ys = let ysTrans = transpose ys in
                           map (dotProduct x) ysTrans :: multiplyMat xs ys
import Data.Vect

Matrix : Nat -> Nat -> Type -> Type
Matrix n m elem = Vect n (Vect m elem)

multiplyMat : Num t => Matrix n m t -> Matrix m p t -> Matrix n p t
multiplyMat x y = multiplyMat' x (transpose y)
  where
        dot : Num t => Vect n t -> Vect n t -> t
        dot xs ys = sum $ zipWith (*) xs ys

        multiplyMat' : Num t => Matrix n m t -> Matrix p m t -> Matrix n p t
        multiplyMat' (x :: xs) ys = map (dot x) ys :: multiplyMat' xs ys
        multiplyMat' [] _ = []