[Haskell-cafe] Maybe use advice
John Lato
jwlato at gmail.com
Tue Jun 7 11:06:06 CEST 2011
Is it necessary (helpful) to use 'rewrite'? Nearly every time I've tried
it, in the end 'transform' has been a better choice. Then you wouldn't need
the 'Just's at all, and it should work fine.
John
> From: Lyndon Maydwell <maydwell at gmail.com>
>
> (missed including cafe)
>
> f :: [Modification] -> Maybe [Modification]
> and
> f _ = Just $ f ...
> are incompatible
>
> I managed to get the behaviour I'm after with the use of Either, but
> this really is messy:
>
>
> -- Sets of changes
> o (Modifier (Changes []) i) = Just $ i
> o (Modifier (Changes [c]) i) = Just $ Modifier c i
> o (Modifier (Changes l) i) = g (f (Left l))
> where
> g (Right l) = Just $ Modifier (Changes l) i
> g (Left l) = Nothing
>
> f (Left (Scale x y : Scale x' y' : l)) =
> f $ Right $ Scale (x*x') (y*y') : h (f $ Left l)
> f (Left (Translate x y : Translate x' y' : l)) =
> f $ Right $ Translate (x+x') (y+y') : h (f $ Left l)
> f (Left (Rotate x : Rotate x' : l)) =
> f $ Right $ Rotate (x+x') : h (f $ Left l)
> f x = x
>
> h (Left l) = l
> h (Right l) = l
>
>
> On Tue, Jun 7, 2011 at 3:11 AM, Maciej Marcin Piechotka
> <uzytkownik2 at gmail.com> wrote:
> > On Mon, 2011-06-06 at 23:38 +0800, Lyndon Maydwell wrote:
> >> 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?
> >
> > Something like:
> >
> > ...
> > f (Rotate ? ?x ? : Rotate ? ?x' ? ?: l)
> > ? ?= Just $ f (Rotate (x+x') : fromMaybe l (f l))
> > f l = Nothing -- As far as I understend
> >
> > Regards
> >
> > _______________________________________________
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20110607/bd7c98d5/attachment-0001.htm>
More information about the Haskell-Cafe
mailing list