haskell5.hs 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. <<<<<<< HEAD
  2. import Control.Applicative
  3. import Control.Monad
  4. import Control.Monad.State
  5. -- Logger
  6. type Log = [String]
  7. newtype Logger a = Logger {runLogger :: (a, Log)}
  8. --Let's define Log an instance of Show
  9. instance (Show a) => Show (Logger a ) where
  10. show (Logger a) = show a
  11. --Define an instance of Functor for Logger
  12. loggerMap :: (a -> b) -> Logger a -> Logger b
  13. loggerMap f lg =
  14. let (v, l) = runLogger lg
  15. n = f v
  16. in Logger (n, l)
  17. instance Functor Logger where
  18. fmap = loggerMap
  19. loggerApp :: Logger (a -> b) -> Logger a -> Logger b
  20. loggerApp lf lg =
  21. let (f, s) = runLogger lf
  22. nl = loggerMap f lg
  23. (n, l) = runLogger nl
  24. in Logger (n, l ++ s)
  25. instance Applicative Logger where
  26. pure x = Logger (x, [])
  27. (<*>) = loggerApp
  28. --Define the Logger Monad
  29. instance Monad Logger where
  30. m >>= f = let (a, w) = runLogger m
  31. n = f a
  32. (b, x) = runLogger n
  33. in Logger (b, w ++ x)
  34. --Define a function that takes a number, add one and log the operation
  35. logPlusOne :: (Num a) => a -> Logger a
  36. logPlusOne a = Logger (a+1, ["added one"])
  37. --Define a function that takes a number, doubles it and log the operation
  38. logMultiplyTwo :: (Num a) => a -> Logger a
  39. logMultiplyTwo a = Logger (a*2, ["Multiplied by two"])
  40. --Define a function that takes a logger, adds one, double the value and logs all the operations
  41. logOps :: (Num a) => a -> Logger a
  42. logOps a = pure a >>= logPlusOne >>= logMultiplyTwo
  43. logOps' :: (Num a) => Logger a -> Logger a
  44. logOps' a = do
  45. v <- a
  46. s1 <- logPlusOne v
  47. p2 <- logMultiplyTwo s1
  48. return p2
  49. --Define a record function to record things in the logPlusOne
  50. record :: String -> Logger ()
  51. record s = Logger ((), [s])
  52. --Define a binary Tree
  53. data Tree a = EmptyTree | Node a (Tree a) (Tree a) deriving (Show, Eq, Read)
  54. treeFoldr :: (b -> a -> a) -> a -> Tree b -> a
  55. treeFoldr f acc EmptyTree = acc
  56. treeFoldr f acc (Node a left right) = treeFoldr f (f a (treeFoldr f acc right)) left
  57. singletonM :: (Show a) => a -> Logger (Tree a)
  58. singletonM x = do
  59. record ("Created singleton" ++ show x)
  60. return (Node x EmptyTree EmptyTree)
  61. treeInsertM :: (Ord a, Show a) => Tree a -> a -> Logger (Tree a)
  62. treeInsertM EmptyTree x = singletonM x
  63. treeInsertM (Node a left right) x
  64. | x == a = do
  65. record("Inserted " ++ show x)
  66. return (Node x left right)
  67. | x < a = do
  68. l <- treeInsertM left x
  69. return (Node a l right)
  70. | x > a = do
  71. r <- treeInsertM right x
  72. return (Node a left r)
  73. treeSumM :: (Num a) => Logger (Tree a) -> Logger a
  74. treeSumM t = fmap (treeFoldr (+) 0) t
  75. andM :: Logger Bool -> Logger Bool -> Logger Bool
  76. andM log1 log2 = do
  77. c1 <- log1
  78. c2 <- log2
  79. return (c1 && c2)
  80. treeBalancedM :: Tree a -> Logger Bool
  81. treeBalancedM EmptyTree = do
  82. record "an empty tree is always balanced"
  83. return True
  84. treeBalancedM (Node _ EmptyTree EmptyTree) = do
  85. record "A single node tree is always balanced"
  86. return True
  87. treeBalancedM (Node _ EmptyTree _) = do
  88. record "Unbalanced"
  89. return False
  90. treeBalancedM (Node _ _ EmptyTree) = do
  91. record "Unbalanced"
  92. return False
  93. treeBalancedM (Node _ left right) = andM (treeBalancedM left) (treeBalancedM right)
  94. type Stack = [Int]
  95. --Define the pop function
  96. pop :: Stack -> (Int, Stack)
  97. pop (x:xs) = (x, xs)
  98. --Define the push function
  99. push :: Int -> Stack -> ((), Stack)
  100. push x xs = ((), x:xs)
  101. stackManip :: Stack -> (Int, Stack)
  102. stackManip stack = let
  103. (a, stack1) = pop stack
  104. (b, stack2) = pop stack1
  105. ((), stack3) = push 100 stack2
  106. (c, stack4) = pop stack3
  107. in pop stack4
  108. popM :: State Stack Int
  109. popM = do
  110. x:xs <- get
  111. put xs
  112. return x
  113. =======
  114. module EsHs4 where
  115. import Control.Applicative
  116. import Control.Monad
  117. --Logger
  118. type Log = [String]
  119. newtype Logger a = Logger { runLogger :: (a, Log) }
  120. --Define an instance of Show for Logger
  121. instance Show a => Show (Logger a) where
  122. show (Logger a) = show a
  123. --Define an instance of Functor for logger
  124. class Functor f where
  125. fmap :: (a -> b) -> f a -> f b
  126. loggerMap :: ( a -> b) -> (Logger a) -> (Logger b)
  127. loggerMap f lg =
  128. let (v, l) = runLogger lg
  129. n = f v
  130. in Logger (n, l)
  131. instance Functor Logger where
  132. fmap = loggerMap
  133. loggerApp :: Logger (a -> b) -> Logger a -> Logger b
  134. loggerApp lf lg =
  135. let (f, s) runLogger lf
  136. nl = loggerMap f lg
  137. (n, l) = runLogger nl
  138. in Logger (n, l ++ s)
  139. instance Applicative Logger where
  140. pure a = Logger (a, [])
  141. (<*>) = loggerApp
  142. instance Monad Logger where
  143. m >>= f = let(a, w) = runLogger m
  144. n = f a
  145. (b, x) = runLogger n
  146. in Logger (b, w ++ x)
  147. --Define a function that takes a number, add one and log the op:
  148. logPlusOne :: (Num a) => a -> Logger a
  149. logPlusOne a = Logger (a+1, ["added one"])
  150. logMultiplyTwo :: (Num a) => a -> Logger a
  151. logMultiplyTwo = Logger (a*2, ["Multiplied by two"])
  152. --Define logOps
  153. logOps :: (Num a) => Logger a -> Logger a
  154. logOps lg = do
  155. v <- lg
  156. p1 <- logPlusOne v
  157. m2 <- logMultiplyTwo p1
  158. return m2
  159. -- Define a record function to record things in the log
  160. record :: String -> Logger()
  161. record s = Logger ((), [s])
  162. >>>>>>> 66d23fcd2717ce0805f5442c6cf4888114f9b38c