[Haskell-cafe] Maybe use advice

Lyndon Maydwell maydwell at gmail.com
Mon Jun 6 17:38:05 CEST 2011


I'm writing an optimisation routine using Uniplate. Unfortunately, a
sub-function I'm writing is getting caught in an infinite loop because
it doesn't return Nothing when there are no optimisations left.

I'd like a way to move the last Just into f, but this makes recursion
very messy. I was wondering if there was a nice way to use something
like the Monad or Applicative instance to help here.

-- Sets of changes
o (Modifier (Changes [])  i) = Just $ i
o (Modifier (Changes [c]) i) = Just $ Modifier c i
o (Modifier (Changes l)   i) = Just $ Modifier (Changes (f l)) i
  where
    f (Scale     x y : Scale     x' y' : l) = f $ Scale     (x*x') (y*y') : f l
    f (Translate x y : Translate x' y' : l) = f $ Translate (x+x') (y+y') : f l
    f (Rotate    x   : Rotate    x'    : l) = f $ Rotate    (x+x')        : f l
    f l = l


Any ideas?



More information about the Haskell-Cafe mailing list