Advertisement
Tvor0zhok

Домашнее задание Haskell

May 1st, 2021
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.24 KB | None | 0 0
  1. import Data.Maybe
  2. import Data.List
  3.  
  4. -- №1
  5. infixr 5 |++|
  6. (|++|) :: [a] -> [a] -> [a]
  7. [] |++| a2 = a2
  8. a1 |++| a2 = head a1 : tail a1 |++| a2
  9.  
  10. -- №2
  11. myHead :: [a] -> a
  12. myHead [] = error "empty list"
  13. myHead (x : xs) = x
  14.  
  15. -- №3
  16. myLast :: [a] -> a
  17. myLast [] = error "empty list"
  18. myLast [x] = x
  19. myLast (x : xs) = myLast xs
  20.  
  21. -- №4
  22. myTail :: [a] -> [a]
  23. myTail [] = error "empty list"
  24. myTail (x : xs) = xs
  25.  
  26. -- №5
  27. myInit :: [a] -> [a]
  28. myInit [] = error "empty list"
  29. myInit [x] = []
  30. myInit (x : xs) = x : myInit xs
  31.  
  32. -- №6
  33. myUncons :: [a] -> Maybe (a, [a])
  34. myUncons [] = Nothing
  35. myUncons (x : xs) = Just (x, xs)
  36.  
  37. -- №7
  38. mySingleton :: a -> [a]
  39. mySingleton x = [x]
  40.  
  41. -- №8
  42.  
  43. -- 1-ый способ:
  44. myNull1 :: [a] -> Bool
  45. myNull1 [] = True
  46. myNull1 _ = False
  47.  
  48. -- 2-ой способ:
  49. myNull2 :: Foldable t => t a -> Bool
  50. myNull2 = foldr (\ _ _ -> False) True
  51.  
  52. -- №9
  53.  
  54. -- 1-ый способ:
  55. myLength1 :: [a] -> Int
  56. myLength1 [] = 0
  57. myLength1 (x : xs) = 1 + myLength1 xs
  58.  
  59. -- 2-ой способ:
  60. myLength2 :: Foldable t => t a -> Int
  61. myLength2 = foldr (\x -> (+) 1) 0
  62.  
  63. -- №10
  64. myMap :: (a -> b) -> [a] -> [b]
  65. myMap f [] = []
  66. myMap f (x : xs) = f x : myMap f xs
  67.  
  68. -- №11
  69. myReverse :: [a] -> [a]
  70. myReverse a = rev a []
  71. where rev [] xss = xss
  72. rev (x : xs) xss = rev xs (x : xss)
  73.  
  74. -- №12
  75. myIntersperse :: a -> [a] -> [a]
  76. myIntersperse _ [] = []
  77. myIntersperse _ [x] = [x]
  78. myIntersperse c (x : xs) = x : c : myIntersperse c xs
  79.  
  80. -- №13
  81. myIntercalate :: [a] -> [[a]] -> [a]
  82. myIntercalate _ [] = []
  83. myIntercalate _ [x] = x
  84. myIntercalate s (x : xs) = x ++ s ++ myIntercalate s xs
  85.  
  86. -- №14
  87. myFoldl :: (a -> b -> a) -> a -> [b] -> a
  88. myFoldl f a [] = a
  89. myFoldl f a (x : xs) = myFoldl f (a `f` x) xs
  90.  
  91. -- №15
  92. myFoldl1 :: (a -> a -> a) -> [a] -> a
  93. myFoldl1 f [] = error "empty list"
  94. myFoldl1 f x = foldl f (head x) (tail x)
  95.  
  96. -- №16
  97. myFoldr :: (a -> b -> b) -> b -> [a] -> b
  98. myFoldr f b [] = b
  99. myFoldr f b (x : xs) = x `f` myFoldr f b xs
  100.  
  101. -- №17
  102. myFoldr1 :: (a -> a -> a) -> [a] -> a
  103. myFoldr1 f [] = error "empty list"
  104. myFoldr1 f x = foldr f (last x) (init x)
  105.  
  106. -- №18
  107.  
  108. -- 1-ый способ:
  109. myConcat1 :: [[a]] -> [a]
  110. myConcat1 [] = []
  111. myConcat1 (x : xs) = x ++ myConcat1 xs
  112.  
  113. -- 2-ой способ:
  114. myConcat2 :: Foldable t => t [a] -> [a]
  115. myConcat2 = foldr (++) []
  116.  
  117. -- №19
  118.  
  119. -- 1-ый способ:
  120. myConcatMap1 :: (a -> [b]) -> [a] -> [b]
  121. myConcatMap1 f x = concat $ map f x
  122.  
  123. -- 2-ой способ:
  124. myConcatMap2 :: (a -> [b]) -> [a] -> [b]
  125. myConcatMap2 f [] = []
  126. myConcatMap2 f (x : xs) = f x ++ myConcatMap2 f xs
  127.  
  128. -- №20
  129.  
  130. -- 1-ый способ:
  131. myEnd1 :: [Bool] -> Bool
  132. myEnd1 [] = True
  133. myEnd1 (x : xs) = if not x then False else myEnd1 xs
  134.  
  135. -- 2-ой способ:
  136. myEnd2 :: Foldable t => t Bool -> Bool
  137. myEnd2 = foldr (&&) True
  138.  
  139. -- №21
  140.  
  141. -- 1-ый способ:
  142. myOr1 :: [Bool] -> Bool
  143. myOr1 [] = False
  144. myOr1 (x : xs) = if x then True else myOr1 xs
  145.  
  146. -- 2-ой способ:
  147. myOr2 :: Foldable t => t Bool -> Bool
  148. myOr2 = foldr (||) False
  149.  
  150. -- №22
  151. myAll :: (a -> Bool) -> [a] -> Bool
  152. myAll f a = and $ map f a
  153.  
  154. -- №23
  155. myAny :: (a -> Bool) -> [a] -> Bool
  156. myAny f a = or $ map f a
  157.  
  158. -- №24
  159. mySum :: (Foldable t, Num a) => t a -> a
  160. mySum = foldr (+) 0
  161.  
  162. -- №25
  163. myProduct :: (Foldable t, Num a) => t a -> a
  164. myProduct = foldr (*) 1
  165.  
  166. -- №26
  167. myMaximum :: (Foldable t, Ord a) => t a -> a
  168. myMaximum = foldr1 max
  169.  
  170. -- №27
  171. myMinimum :: (Foldable t, Ord a) => t a -> a
  172. myMinimum = foldr1 min
  173.  
  174. -- №28
  175. myScanl :: (b -> a -> b) -> b -> [a] -> [b]
  176. myScanl f a [] = [a]
  177. myScanl f a (x : xs) = a : myScanl f (a `f` x) xs
  178.  
  179. -- №29
  180. myScanl1 :: (a -> a -> a) -> [a] -> [a]
  181. myScanl1 f [] = []
  182. myScanl1 f x = scanl f (head x) (tail x)
  183.  
  184. -- №30
  185.  
  186. -- 1-ый вариант:
  187. myScanr :: (a -> b -> b) -> b -> [a] -> [b]
  188. myScanr f b [] = [b]
  189. myScanr f b (x : xs) = x `f` head sc : sc
  190. where sc = myScanr f b xs
  191.  
  192. -- 2-ой вариант:
  193. myScanr' :: (a -> b -> b) -> b -> [a] -> [b]
  194. myScanr' f b [] = [b]
  195. myScanr' f b (x : xs) = x `f` q : qs
  196. where qs @(q : _) = myScanr' f b xs
  197.  
  198. -- №31
  199. myScanr1 :: (a -> a -> a) -> [a] -> [a]
  200. myScanr1 f [] = []
  201. myScanr1 f x = scanr f (last x) (init x)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement