[Haskell-beginners] Desugar list comprehension

David McBride toad3k at gmail.com
Wed Dec 2 12:51:40 UTC 2020


If you check on hoogle for how guard is written, it is just this

guard True  = pure
<https://hackage.haskell.org/package/base-4.14.0.0/docs/Control-Applicative.html#v:pure>
()
guard False = empty
<https://hackage.haskell.org/package/base-4.14.0.0/docs/Control-Applicative.html#v:empty>

That means you can use the same thing in your own code

import Control.Applicative

pairs xs =
  xs >>= \x ->
    xs >>= \y ->
      if (x + y == 2020) then pure (x,y) else empty


On Wed, Dec 2, 2020 at 5:31 AM mike h <mike_k_houghton at yahoo.co.uk> wrote:

> Hi,
>  I have
> sumIs2020P1' xs = do
> x <- xs
> y <- xs
> guard (x + y == 2020)
> pure (x,y)
>
> which has been desugared from a list comprehension
> I would like to reduce this even more using >>=
> So I do
> sumIs2020P1'' xs = (a,b) where
> (a,b):rest = filter (\(x,y) -> x + y == 2020) pairs
>
> pairs = xs >>= \x ->
> xs >>= \y ->
> pure (x,y)
>
> but really I would like the guard to be within the >>= sections but I
> could not work out
> how to do it!
> i.e. I’m looking for something like (pseudo code)
>
> pairs = xs >>= \x ->
> xs >>= \y ->
> if (x + y == 2020) then pure (x,y) else DO_NOTHING
> which would then allow the filter to be removed.
>
>
> Many Thanks
>
> Mike
>
>
>
> Dr Mike Houghton
>
> mike_k_houghton at yahoo.co.uk
>
>
>
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/beginners/attachments/20201202/c6c160ce/attachment.html>


More information about the Beginners mailing list