====== Haskell Lecture 6 ======
types, definitions of functions, pattern matching, lists, basic built-in functions and operators: :load, :type (:t)
fact :: Integer -> Integer
fact n = if n == 0 then 1 else n*(fact (n-1))
fact1 n | n==0 = 1
| otherwise = n*(fact1 (n-1))
fact'' 0 = 1
fact'' n = n*(fact'' (n-1))
data MyColor = Red | Green | Blue
-- some sort of list of MyColor
data MyListColor = CCons MyColor MyListColor | EmptyListColor
data MyList a = Cons a (MyList a) | EmptyList
[1..100] -- list of numbers from 1 to 100 with step 1.
[1,3..100] -- list of odd numbers from 1 to 100 (with step 2)
[2,4..100] -- list of even numbers from 2 to 100 (with step 2)
[1..] -- list of all numbers from 1 with step 1
[1,3..] -- list of all odd numbers from 1 (with step 2)
-- QuickSort in Haskell:
quicksort [] = []
quicksort (e:ls) = (quicksort [x|x<-ls,x=e])
====== Haskell Lecture 7 ======
lambda terms, curryfication, graphical syntax, @, let, where, type classes (class, instance, deriving), basic built-in type classes (Eq, Ord, Num, Show), :info (:i), lazy evaluation
-- Example of lambda term
Main> map (\ x -> -x) [1..10]
[-1,-2,-3,-4,-5,-6,-7,-8,-9,-10]
-- Example of curryfication of -
Main> map ((-) 0) [1..10]
[-1,-2,-3,-4,-5,-6,-7,-8,-9,-10]
-- Example of curryfication of infix -
Main> map (0-) [1..10]
[-1,-2,-3,-4,-5,-6,-7,-8,-9,-10]
-- Example of let
Main> let minus = (0-) in map minus [1..10]
[-1,-2,-3,-4,-5,-6,-7,-8,-9,-10]
-- Example of let
Main> let {minus = (0-); ls = [1..10]} in map minus ls
[-1,-2,-3,-4,-5,-6,-7,-8,-9,-10]
-- Example of where
Main> map minus ls where {minus = (0-); ls = [1..10]}
[-1,-2,-3,-4,-5,-6,-7,-8,-9,-10]
msort [] = []
msort [x] = [x]
msort ls = merge sas sbs where
(xs,ys) = split ls where
split [] = ([],[])
split [x] = ([x],[])
split (x:y:ls) = ((x:xs),(y:ys)) where
(xs,ys) = split ls
sas = msort xs
sbs = msort ys
merge [] ls = ls
merge ls [] = ls
merge ws@(x:xs) zs@(y:ys) | (x<=y) = (x : merge xs zs)
| otherwise = merge zs ws
-- Example:
Main> :t msort
msort :: Ord a => [a] -> [a]
Main> msort [6,4,1,3]
[1,3,4,6]
-- automated instantiation of Eq, Ord, and Show class for NTree type using: deriving
data NaryTree a = NaryNode a [NaryTree a] | NaryLeaf a deriving (Eq,Ord,Show)
-- Example:
Main> :t NaryNode 1 [NaryLeaf 2]
NaryNode 1 [NaryLeaf 2] :: Num a => NaryTree a
Main> NaryNode 2 [NaryLeaf 2] == NaryNode 1 [NaryLeaf 2]
False
Main> NaryNode 2 [NaryNode 2] <= NaryNode 1 [NaryLeaf 2]
False
Main> NaryNode 1 [NaryLeaf 2]
NaryNode 1 [NaryLeaf 2]
data NaryTree a = NaryNode a [NaryTree a] | NaryLeaf a
numberLeafs (NaryLeaf _) = 1
numberLeafs (NaryNode _ ls) = sum [numberLeafs x| x <- ls]
-- custom instantiation of Eq, Ord, and Show class for NaryTree type using: instance
instance (Eq a) => Eq (NaryTree a) where
x == y = numberLeafs x == numberLeafs y
instance (Ord a) => Ord (NaryTree a) where
x <= y = numberLeafs x <= numberLeafs y
instance (Show a) => Show (NaryTree a) where
show (NaryLeaf x) = "<" ++ (show x) ++ ">"
show (NaryNode x ls) = "{" ++ (show x) ++ ":" ++ (show ls) ++ "}"
-- Example:
Main> :t NaryNode 1 [NaryLeaf 2]
NaryNode 1 [NaryLeaf 2] :: Num a => NaryTree a
Main> NaryNode 2 [NaryLeaf 2] == NaryNode 1 [NaryLeaf 2]
True
Main> NaryNode 2 [NaryNode 2] <= NaryNode 1 [NaryLeaf 2]]
True
Main> NaryNode 1 [NaryLeaf 2]
{1:[<2>]}
-- custom definition of some class W with one function w
class W a where
w :: a -> Bool
-- instantiation of class W for type NTree a
instance W (NaryTree a) where
w (NaryLeaf _) = True
w _ = False