Advertisement
Guest User

Untitled

a guest
May 27th, 2017
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import Data.List
  2. import Data.Function
  3.  
  4. type Name = String
  5. type Rate = Integer
  6.  
  7. data Transaction  = CreditOut Integer | CreditIn Integer
  8.     deriving (Eq, Show)
  9.  
  10. type Customer = (Name, [Transaction])
  11.  
  12. type DB = [Customer]
  13.  
  14.  
  15. testDB :: DB
  16. testDB = [
  17.     ("Alma", [CreditIn 3000, CreditOut 200, CreditOut 1500]),
  18.   ("Anna", [CreditIn 5000, CreditOut 5100]),
  19.     ("Feri", [CreditOut 1000, CreditIn 200, CreditIn 200, CreditOut 10])
  20.     ]
  21.  
  22. testDB2 :: DB
  23. testDB2 = [
  24.     ("Ani", [CreditIn 3000]),
  25.     ("Juli", [CreditOut 1000, CreditIn 200])
  26.     ]
  27.  
  28. ---
  29.    
  30. emptyDB::DB
  31. emptyDB = []
  32.  
  33.  
  34. --Benne van-e az adott ügyfél az adatbázisban?
  35. isCust nev db = any ((==nev).fst) db
  36.  
  37.  
  38. add::Name -> Integer -> DB ->DB
  39. add nev qty db
  40.     | (isCust nev db) && (qty>=0) = updateP nev qty db
  41.     | (isCust nev db) && (qty<0) = updateN nev qty db
  42.     | otherwise = db
  43.    
  44. --updateP: növeli az egyenleget
  45.  
  46. updateP _ _ [] = []
  47. updateP nev qty (entry:db)
  48.     | fst entry == nev = ((fst entry), (CreditIn qty):(snd entry)):db
  49.     | otherwise = entry:(updateP nev qty db)
  50.    
  51. --updateN: csökkenti az egyenleget
  52. updateN _ _ [] = []
  53. updateN nev qty (entry:db)
  54.     | fst entry == nev = ((fst entry), (CreditOut (abs qty)):(snd entry)):db
  55.     | otherwise = entry:(updateN nev qty db)
  56. ---
  57. sumTrans [] = 0
  58. sumTrans ((CreditIn t):ts) = t+(sumTrans ts)
  59. sumTrans ((CreditOut t):ts) = (sumTrans ts)-t
  60.  
  61. summarize :: DB ->[(Name,Integer)]
  62. summarize db = map (\(a,t) -> (a,(sumTrans t))) db
  63. ---
  64. encloseDay :: Rate -> DB -> DB
  65. encloseDay _ [] = []
  66. encloseDay rate (entry:db)
  67.     | (q >= 0) = (fst entry, [(CreditIn (rate*q))]):(encloseDay rate db)
  68.     | otherwise = (fst entry, [(CreditOut (abs q))]):(encloseDay rate db)
  69.         where q = (sumTrans (snd entry))
  70. ---
  71. comparing p a b = compare (p a) (p b)
  72. maxOut db = maximumBy (comparing (sumTrans.snd)) db
  73. maxIn db = minimumBy (comparing (sumTrans.snd)) db
  74.  
  75. maximums :: DB -> (Name,Name,Integer)
  76. maximums db = ((fst (maxIn db)),(fst (maxOut db)),q)
  77.     where q = (sumTrans (snd (maxOut db)))-(sumTrans (snd (maxIn db)))
  78.  
  79. ---
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement