|
@@ -0,0 +1,99 @@
|
|
|
+module Haskell1 where
|
|
|
+
|
|
|
+ones = 1 : ones
|
|
|
+
|
|
|
+fib = 1 : 1 : [a+b | (a,b) <- zip fib (tail fib)]
|
|
|
+
|
|
|
+mytake 0 _ = []
|
|
|
+mytake _ [] = []
|
|
|
+mytake n (x:xs) = x : mytake (n-1) xs
|
|
|
+
|
|
|
+myfoldl f z [] = z
|
|
|
+myfoldl f z (x:xs) = myfoldl f (f x z) xs
|
|
|
+
|
|
|
+instance Show (a -> b) where
|
|
|
+ show f = "<< a function>>"
|
|
|
+
|
|
|
+-- define my-lenght
|
|
|
+mylenght :: [a] -> Int
|
|
|
+mylenght [] = 0
|
|
|
+mylenght (x:xs) = 1 + mylenght xs
|
|
|
+
|
|
|
+myrange :: Int -> Int -> [Int]
|
|
|
+myrange a b = if a > b
|
|
|
+ then error "Low > High"
|
|
|
+ else if a < b
|
|
|
+ then a : myrange (a +1) b
|
|
|
+ else [a]
|
|
|
+
|
|
|
+data TrafficLight = Red | Yellow | Green
|
|
|
+
|
|
|
+data Answer = Yes | No
|
|
|
+
|
|
|
+data Tree a = EmptyTree | Node a (Tree a) (Tree a)
|
|
|
+
|
|
|
+data Person = Person { firstname :: String
|
|
|
+ , lastname :: String
|
|
|
+ , age :: Int
|
|
|
+ , height :: Float
|
|
|
+ , phonenumber :: String
|
|
|
+ }
|
|
|
+
|
|
|
+mymap :: (a -> b) -> [a] -> [b]
|
|
|
+mymap _ [] = []
|
|
|
+mymap f (x:xs) = f x : mymap f xs
|
|
|
+
|
|
|
+-- Re-write the myrange with boolean guards
|
|
|
+
|
|
|
+myrange2 :: Int -> Int -> [Int]
|
|
|
+myrange2 a b
|
|
|
+ | a > b = error "low > high"
|
|
|
+ | a == b = [b]
|
|
|
+ | a < b = a : myrange2 (a + 1) b
|
|
|
+
|
|
|
+-- define myrange with only one input parameter
|
|
|
+
|
|
|
+myrange3 :: Int -> [Int]
|
|
|
+myrange3 a = a : myrange3 (a + 1)
|
|
|
+
|
|
|
+--describe the type of a list
|
|
|
+
|
|
|
+describelist :: [a] -> String
|
|
|
+describelist xs = "The list is " ++ case xs of
|
|
|
+ [] -> "Empty List"
|
|
|
+ [x] -> "One element / Singleton"
|
|
|
+ xs -> "Multiple Elements"
|
|
|
+
|
|
|
+
|
|
|
+--definition of confitional take from list
|
|
|
+
|
|
|
+myTakeWhile :: (a -> Bool) -> [a] -> [a]
|
|
|
+myTakeWhile _ [] = []
|
|
|
+myTakeWhile f (x:xs)
|
|
|
+ | f x = x : myTakeWhile f xs
|
|
|
+ | otherwise = []
|
|
|
+
|
|
|
+myFilter :: (a -> Bool) -> [a] -> [a]
|
|
|
+myFilter _ [] = []
|
|
|
+myFilter c (x:xs)
|
|
|
+ | c x = x : myFilter c xs
|
|
|
+ | otherwise = myFilter c xs
|
|
|
+
|
|
|
+--define myReverse
|
|
|
+
|
|
|
+myReverse :: [a] -> [a]
|
|
|
+myReverse = foldl (\acc x -> x:acc) []
|
|
|
+
|
|
|
+--define mySum, a function that sums all the elements of a list
|
|
|
+
|
|
|
+mySum :: [Int] -> Int
|
|
|
+mySum [] = 0
|
|
|
+mySum (x:xs) = x + mySum xs
|
|
|
+
|
|
|
+mySum2 :: (Num a)=>[a] -> a
|
|
|
+mySum2 = foldl (\acc x -> acc + x) 0
|
|
|
+
|
|
|
+--define myFilter2 using foldr
|
|
|
+
|
|
|
+myFilter2 :: (a -> Bool) -> [a] -> [a]
|
|
|
+myFilter2 f = foldr (\x acc -> if f x then x:acc else acc) []
|