replaceByMin1 :: Tree Int -> Tree Int replaceByMin1 t = let (m, r) = doReplace m t -- nahraď prvky v t odkazem na m a spočítej in r -- hodnotu m doReplace :: Int -> Tree Int -> (Int, Tree Int) doReplace w (Tree r sons) = (minimum (r : mins), Tree w rsons) where minsAndRsons = map (doReplace w) sons -- seznam dvojic (minimum ze syna, syn s hodnotami -- nahrazenými w) (mins, rsons) = unzip minsAndRsons -- rozdělíme dvojice do dvou seznamů unzip :: [(a,b)] -> ([a], [b]) -- rozděl seznam dvojic na dva seznamy unzip [] = ([],[]) -- rozdělení prázdného seznamu unzip ((a,b) : zb) = r where (ra,rb) = unzip zb -- rozděl zbytek seznamu r = (a : ra, b : rb) -- a přidej první prvky