how do I abstract this pattern ?

C.M.Brown cmb21 at kent.ac.uk
Wed May 21 13:02:48 EDT 2008


On further thought, better to use the Maybe afterall. You can use Nothing
to signify your False and Just to signify your result.

case p1 s of
  Just result -> result
  Nothing -> case p2 s of ...

That's probably more intuitive to what you were intending.
Chris.


On Wed, 21 May 2008, C.M.Brown wrote:

> On Wed, 21 May 2008, HP Wei wrote:
>
> >
> > Suppose p1, p2, p3 are 3 predicates
> > that take an input -- say, a String.
> > They return either (True, result)
> >             or     False.
> >
> > I want to get an effect like in this expression:
> >
> > case p1 s of
> >    (True, r) -> r
> >    False -> case p2 s of
> >                (True, r) -> r
> >                False -> case p3 s of
> >                            (True, r) -> r
> >                            False -> none
> >
> > Is this a job for Maybe monad ?
> > How do I do that ?
> >
>
> I think this is a job for the Either monad:
>
> data Either a b = Left a | Right b
>
> case p1 s of
>     (Left (True, r)) -> r
>     (Right False) -> case p2 s of
>                     (Left (True, r)) -> r
>                     (Right False) -> case p3 s of
>                             (Left (True, r)) -> r
>                             (Right False) -> none
>
> So you wrap up your (Bool, result) type using Left, and your Bool type
> using Right.
>
> Regards,
> Chris.
>
>
>
>
> > Thanks
> > HP
> > _______________________________________________
> > Glasgow-haskell-users mailing list
> > Glasgow-haskell-users at haskell.org
> > http://www.haskell.org/mailman/listinfo/glasgow-haskell-users
> >
> _______________________________________________
> Glasgow-haskell-users mailing list
> Glasgow-haskell-users at haskell.org
> http://www.haskell.org/mailman/listinfo/glasgow-haskell-users
>


More information about the Glasgow-haskell-users mailing list