module AufgabeFFP5 where import Data.Array newtype Table a b = Tbl (Array b a) deriving Show newTable :: (Ix b) => [(b, a)] -> Table a b newTable l = Tbl (array (lo, hi) l) where indices = map fst l lo = minimum indices hi = maximum indices findTable :: (Ix b) => Table a b -> b -> a findTable (Tbl a) i = a ! i updTable :: (Ix b) => (b, a) -> Table a b -> Table a b updTable p@(i, x) (Tbl a) = Tbl (a // [p]) dynamic :: (Ix coord) => (Table entry coord -> coord -> entry) -> (coord, coord) -> (Table entry coord) dynamic compute bnds = t where t = newTable (map (\coord -> (coord, compute t coord)) (range bnds)) ------------------------------------------------------------------------------- bndsAS :: Array Int Int -> ((Int, Int), (Int, Int)) bndsAS a = ((l,l), (h,h)) where (l,h) = bounds a compAS :: Array Int Int -> Table Int (Int, Int) -> (Int, Int) -> Int compAS a t (i,j) | i == j = a ! j | i (Int, Int) -> Int asDyn a (i,j) = findTable t (i,j) where t = dynamic (compAS a) (bndsAS a) -- maximum function for tables tblMax :: Table Int (Int,Int) -> Int tblMax (Tbl a) = maximum $ elems a mas :: Array Int Int -> Int mas a = tblMax $ dynamic (compAS a) (bndsAS a)