
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@yahoo.co.uk

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.h...
()
guard False = empty
https://hackage.haskell.org/package/base-4.14.0.0/docs/Control-Applicative.h...
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
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@yahoo.co.uk
_______________________________________________ Beginners mailing list Beginners@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners

Duh! Of course, thanks David.
On 2 Dec 2020, at 12:51, David McBride
wrote: 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.h... () guard False = empty https://hackage.haskell.org/package/base-4.14.0.0/docs/Control-Applicative.h... 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
mailto:mike_k_houghton@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@yahoo.co.uk mailto:mike_k_houghton@yahoo.co.uk
_______________________________________________ Beginners mailing list Beginners@haskell.org mailto:Beginners@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners _______________________________________________ Beginners mailing list Beginners@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
participants (2)
-
David McBride
-
mike h