summ :: Num a => [a] -> a
summ [] = 0
summ (x:xs) = x + summ xs
summe :: [Int]->Int
summe (x:xs)= summel (x:xs) 0
summel :: [Int]->Int->Int
summel [] akk = akk
summel (x:xs) akk = summel xs (x+akk)
--sum2 :: Num a => [a] -> a -> a
--sum2 [] akk = akk
--sum2 (x:xs) akk = sum2 xs (akk+x)
length' :: [a] -> Int
length' [] = 0
length' (x:xs) = 1 + length' xs
--length2 :: [Int] -> Int -> Int
length1 :: [Int] -> Int
length1 (x:xs) = length2 (x:xs) 0
length2 :: Num a => [b] -> a -> a
length2 [] akk = akk
length2 (x:xs) akk = length2 xs (akk+1)
length3 :: [a] -> Int
length3 xs = len xs 0
where len xs akk = if (null xs) then akk else len (tail xs) (1+akk)
--fak :: Num a => a -> a
fak :: Integer -> Integer
fak 0 = 1
fak n = n * fak (n-1)
fakul :: Num a => a -> a -> a
fakul 1 a = a
fakul n a = fakul (n-1) (a*n)
--fac :: Int -> Int
--fac n = facakk n 1
-- where facakk n acc = if n == 0 then acc else facakk (n-1) (n*acc)
fac :: Num a => a -> a
fac n = facc n 1
facc 0 p = p
facc n p = facc (n-1) (n*p)
fib :: Int -> Int
fib 0 = 0
fib 1 = 1
fib n = fib (n-2) + fib (n-1)
fibnumbers = [ fib n | n <- [0..] ]
where fib n
| n == 0 = 0
| n == 1 = 1
| otherwise = fib (n-1) + fib (n-2)
fibakk = f (0,1) where f (a,b) = a : f (a+b,a)
-- >sum (take 20 fibakk)
--fibo a = fib 0 1 a
--fib v n 0 = v
--fib v n 1 = n
--fib v n a = fib n(v+n)a
rev' :: [a] -> [a]
rev' [] = []
rev' (x:xs) = rev' xs ++ [x]
reverse :: [a] -> [a]
reverse = revakk []
revakk akk [] = akk
revakk akk (x:xs) = revakk (x:akk) xs
--reverse :: [a] -> [a]
--reverse xs = aux xs []
-- where
-- aux [] ys = ys
-- aux (x:xs) ys = aux xs (x:ys)