===== Idris syntax ===== | [[Idris]] $\blacktriangleright$ Idris syntax $\blacktriangleright$ [[...]] | ==== Note ==== I'll try to take all the primitive notions and write down one example with them, respectively. This list largely overlaps with [[Haskell]]. == Defining types == data Beagle = Bigtime | Burger | Bouncer | Baggy | Bankjob | Bugle | Babyface data Kid = Tick | Trick | Track data Parent = Donald | Dasy data Grandparent = Dagobert data Singleton = Point == Prelude types == my_number : Int my_number = 7 my_string : String my_string = "a string" my_char : Char my_char = 'a' my_bool : Bool my_bool = False == Defining functions, explicitly == favorite_parent : Kid -> Parent favorite_parent Trick = Dasy favorite_parent k = Donald -- k is any term of the Kid type toPoint : Int -> Singleton toPoint n = Point toPointLambda : Int -> Singleton toPointLambda = \n => Point kid_identity : Kid -> Kid identity k = k == Defining types 2, inductively by defining functions == data Nat_ = Z_ | S_ Nat_ -- Z_ : Nat_ -- S_ : Nat_ -> Nat_ data List_ a = End_ | Cons_ a (List_ a) -- here 'a' may be any type -- List_ : Type -> Type -- End_ : List_ a -- '[]' is the empty list -- Cons_ : a -> List_ a -> List_ a -- '::' is usually used for Cons_ == Defining functions, patter maching == plus : Nat_ -> Nat_ -> Nat_ plus Z_ y = y plus (S_ k) y = S_ (plus k y) -- uses 'plus' again == Defining functions, dependent type == mkSingle : (x : Bool) -> natOrList x mkSingle True = 0 mkSingle False = [] natOrList : Bool -> Type natOrList True = Nat natOrList False = List Nat >todo: check this identity : (t : Type) -> t -> t identity t = \x => x == Prelude functions == >todo: >=> (==) : Eq ty => ty -> ty -> Bool (*) : Num ty => ty -> ty -> ty (+) : Num ty => ty -> ty -> ty == type, where == data Vect : Nat -> Type -> Type where Nil : Vect Z a (::) : a -> Vect k a -> Vect (S k) a == functions, where == reverse : List a -> List a reverse xs = revAcc [] xs where revAcc : List a -> List a -> List a -- Indentation is significant here revAcc acc [] = acc revAcc acc (x :: xs) = revAcc (x :: acc) xs == case == case_fun : Int -> Int case_fun x = case isLT of Yes => x + 100 No => x + 10 where data MyLT = Yes | No isLT : MyLT isLT = if x < 20 then Yes else No == if == AorB : Bool -> String AorB b = if b then "A" else "B" -- if-construction == For infix definitions == Here one may use those symbols in combinations -- :+-*\/=.?|&> except to form those predefined ones -- : => -> <- = ?= | ** ==> \ % ~ ? ! === Discussion === === Reference === ----- === Related === [[Haskell]], [[Haskell type system]] === Requirements === [[Idris]]