Andy Melnikov (nponeccop) wrote,
Andy Melnikov
nponeccop

Data.Foldable to the rescue

Переписывал инлайнер в HNC на свой морфизьм, и понял, как генерически композить рерайты. Никаких хуйнарных композиторов не нужно, и тем более стейта и манад.
process :: (ExpressionFunctor (ExpressionFix, Maybe ExpressionFix) -> Maybe ExpressionFix) 
    -> Rewrite ExpressionFix
process = process3 (,) 

process3 :: (Fix ExpressionFunctor -> c -> b) -> (ExpressionFunctor b -> c) -> Fix ExpressionFunctor -> c
process3 j f = self
	where self = f . fmap (\x -> j x (self x)) . unFix

data ExpressionFunctor a 
    =   Application a [a]
    |   Atom Label
    |   Constant Const deriving (Functor)
Просто нужно задерайвить Foldable, и посчитать с его помощью isChanged, а новое значение (под)терма получать старым добрым fmap (uncurry fromMaybe). Побежал имплементить. Если повезет, ещё удастся и флаг от клиента спрятать, чтобы он над ним не надругался.

Upd: Сделал, всё спрятав. Но теперь (если заменить process . phy на process2 . phy2) 7 тестов из 84 падают, потому что в часть веток никогда не заходит. Хез почему, буду разбираться. Падающие тесты, в-общем, и не должны были работать, но странно не то, что падают, а то, что не заходит.
process2 :: (ExpressionFunctor ExpressionFix -> Maybe (Fix ExpressionFunctor)) -> Rewrite ExpressionFix
process2 f = process ff where
	ff x = let x' = uncurry fromMaybe <$> x
		in case f x' of
 			Nothing -> if F.any (isJust . snd) x then Just $ Fix x' else Nothing
			x -> x
Subscribe

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 0 comments