Advertisement
Guest User

Untitled

a guest
Jun 8th, 2019
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -- Czy kojarzy Pani może, czy w Haskellu mogę ominąć takie żmudne przypisywanie do wzorca?
  2. -- Na chwilę obecną mam tablicę zadeklarowaną jak poniżej:
  3.  
  4. data Array = IntArr IntArray | StrArr StringArray | BoolArr BoolArray
  5. -- wszystkie typy tablic wyglądają prawie tak samo, czyli mapują indeks na wartość + przechowują rozmiar będący liczbą
  6. type IntArray = (M.Map Integer Integer, Size)
  7. type StrArray = (M.Map Integer String, Size)
  8. type BoolArray = (M.Map Integer Bool, Size)
  9. type Size = Integer
  10.  
  11. -- i teraz dla przykładu chcę zaimplementować operację powiększania rozmiaru tablicy. No to się wydaje żmudne, bo dla każdego konstruktora muszę robić to samo, choć nie korzystam tutaj w ogóle z ich typów.
  12. resize :: Array -> Integer -> Array
  13. resize (IntArray (m, size)) = ...
  14. resize (StrArray (m, size)) = ...
  15. resize (BoolArray (m, size)) = ...
  16.  
  17. -- To jest oczywiscie uproszczony przykład, bo w moim interpreterze robi się to zdecydowanie brzydsze:
  18. execStmt (Resize arrName e) = do
  19.     IntVal newSize <- eval e
  20.     ArrVal arrVal <- getValByVar arrName
  21.     case arrVal of
  22.         | IntArr (m, oldSize) -> do
  23.             let newM = memset m oldSize newSize
  24.             let newArr = ArrVal (IntArr (newM, newSize))
  25.             assValToVar arrName newArr
  26.             return NormExecFlag
  27.         | StrArr (m, oldSize) -> do
  28.             let newM = memset m oldSize newSize
  29.             let newArr = ArrVal (StrArr (newM, newSize))
  30.             assValToVar arrName newArr
  31.             return NormExecFlag
  32.         | BoolArr (m, oldSize) -> do
  33.             let newM = memset m oldSize newSize
  34.             let newArr = ArrVal (BoolArr (newM, newSize))
  35.             assValToVar arrName newArr
  36.             return NormExecFlag
  37.  
  38. -- a szukam czegoś co pozwoli zrobić (nie przekombinowując)
  39. execStmt (Resize arrName e) = do
  40.     IntVal newSize <- eval e
  41.     ArrVal (Constructor (m, oldSize)) <- getValByVar arrName
  42.     let newM = memset m oldSize newSize
  43.     let newArr = ArrVal (Constructor (newM, newSize))
  44.     assValToVar arrName newArr
  45.     return NormExecFlag
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement