LINUX.ORG.RU

История изменений

Исправление mix_mix, (текущая версия) :

Ну или вот даже получше будет, так как человеческая система типов.
Попробуй хотя бы такое на ифах запилить, посмотрим насколько код раздует

deleteFixup :: RBZip a -> RBZip a
deleteFixup (RBZip a@(Node Red _ _ _) path) = RBZip (setBlack a) path
deleteFixup (RBZip a ((Step cb vb ToLeft (Node Black vd c e@(Node Red _ _ _))):path)) = 
    deleteFixup . topMostZip $ RBZip (Node cb vd (Node Black vb a c) (setBlack e)) path
deleteFixup (RBZip a ((Step cb vb ToRight (Node Black vd e@(Node Red _ _ _) c)):path)) = 
    deleteFixup . topMostZip $ RBZip (Node cb vd (setBlack e) (Node Black vb c a)) path
deleteFixup (RBZip a ((Step cb vb ToLeft (Node Black vd (Node Red vc scl scr) e)):path)) = 
    deleteFixup $ RBZip a ((Step cb vb ToLeft (Node Black vc scl (Node Red vd scr e))):path)
deleteFixup (RBZip a ((Step cb vb ToRight (Node Black vd e (Node Red vc scl scr))):path)) = 
    deleteFixup $ RBZip a ((Step cb vb ToRight (Node Black vc (Node Red vd e scl) scr)):path)
deleteFixup (RBZip a path) = RBZip (setBlack a) path

Исходная версия mix_mix, :

Ну или вот даже получше будет, так как человеческая система типов. Попробуй хотя бы такое на ифах запилить, посмотрим насколько код раздует

deleteFixup :: RBZip a -> RBZip a
deleteFixup (RBZip a@(Node Red _ _ _) path) = RBZip (setBlack a) path
deleteFixup (RBZip a ((Step _ vb db (Node Red vd l r)):path)) =
    deleteFixup $ RBZip a ((Step Red vb db newW):(Step Black vd db newS):path)
    where (!newW, !newS) = case db of
              ToLeft -> (l,r)
              ToRight -> (r,l)
deleteFixup (RBZip a ((Step cb vb ToLeft (Node Black vd c e@(Node Red _ _ _))):path)) = 
    deleteFixup . topMostZip $ RBZip (Node cb vd (Node Black vb a c) (setBlack e)) path
deleteFixup (RBZip a ((Step cb vb ToRight (Node Black vd e@(Node Red _ _ _) c)):path)) = 
    deleteFixup . topMostZip $ RBZip (Node cb vd (setBlack e) (Node Black vb c a)) path
deleteFixup (RBZip a ((Step cb vb ToLeft (Node Black vd (Node Red vc scl scr) e)):path)) = 
    deleteFixup $ RBZip a ((Step cb vb ToLeft (Node Black vc scl (Node Red vd scr e))):path)
deleteFixup (RBZip a ((Step cb vb ToRight (Node Black vd e (Node Red vc scl scr))):path)) = 
    deleteFixup $ RBZip a ((Step cb vb ToRight (Node Black vc (Node Red vd e scl) scr)):path)
deleteFixup (RBZip a ((Step cb vb db d@(Node Black _ _ _)):path)) = 
    deleteFixup $ (RBZip (Node cb vb newL newR) path)
    where (!newL, !newR) = case db of
              ToLeft -> (a,d')
              ToRight -> (d',a)
          !d' = setRed d
deleteFixup (RBZip a path) = RBZip (setBlack a) path