Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- Czy kojarzy Pani może, czy w Haskellu mogę ominąć takie żmudne przypisywanie do wzorca?
- -- Na chwilę obecną mam tablicę zadeklarowaną jak poniżej:
- data Array = IntArr IntArray | StrArr StringArray | BoolArr BoolArray
- -- wszystkie typy tablic wyglądają prawie tak samo, czyli mapują indeks na wartość + przechowują rozmiar będący liczbą
- type IntArray = (M.Map Integer Integer, Size)
- type StrArray = (M.Map Integer String, Size)
- type BoolArray = (M.Map Integer Bool, Size)
- type Size = Integer
- -- 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.
- resize :: Array -> Integer -> Array
- resize (IntArray (m, size)) = ...
- resize (StrArray (m, size)) = ...
- resize (BoolArray (m, size)) = ...
- -- To jest oczywiscie uproszczony przykład, bo w moim interpreterze robi się to zdecydowanie brzydsze:
- execStmt (Resize arrName e) = do
- IntVal newSize <- eval e
- ArrVal arrVal <- getValByVar arrName
- case arrVal of
- | IntArr (m, oldSize) -> do
- let newM = memset m oldSize newSize
- let newArr = ArrVal (IntArr (newM, newSize))
- assValToVar arrName newArr
- return NormExecFlag
- | StrArr (m, oldSize) -> do
- let newM = memset m oldSize newSize
- let newArr = ArrVal (StrArr (newM, newSize))
- assValToVar arrName newArr
- return NormExecFlag
- | BoolArr (m, oldSize) -> do
- let newM = memset m oldSize newSize
- let newArr = ArrVal (BoolArr (newM, newSize))
- assValToVar arrName newArr
- return NormExecFlag
- -- a szukam czegoś co pozwoli zrobić (nie przekombinowując)
- execStmt (Resize arrName e) = do
- IntVal newSize <- eval e
- ArrVal (Constructor (m, oldSize)) <- getValByVar arrName
- let newM = memset m oldSize newSize
- let newArr = ArrVal (Constructor (newM, newSize))
- assValToVar arrName newArr
- return NormExecFlag
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement