
On Wed, Aug 26, 2009 at 2:07 PM, Jon
Fairbairn
On 2009-08-26 at 09:49PDT Iavor Diatchki wrote:
Hello, I don't really think that we need this function, it is plenty easy to just write with "guard".
See my response to Sebastian, but also, none of the definitions of check in terms of guard meet my criteria for being simple enough, namely no lambdas and only a small amount of plumbing (ie don't get round the "no lambdas" part by compiling it to S and K ;-)
I'm usually opposed to adding small functions to the standard library, but check is something I've defined for myself dozens of times. (Although I usually call it "require".) In my experience, check is very natural if you're writing code using
= (and especially =<<), but guard is possibly more natural with do-notation. Similarly, guard scales better if you have multiple conditions. e.g.,
foo >>= require even >>= bar
is more convenient than
foo >>= \x -> guard (even x) >> bar x
but
foo >>= require (\x -> even x && x < y) >>= bar
is no better than
foo >>= \x -> guard (even x && x < y) >> bar x
On the other hand, the more applicative style,
bar =<< require even =<< foo
doesn't easily translate into using guard.
Finally, it's worth considering adding filter (or "mfilter", "sieve",
whatever). It's trivial to define check/require in terms of filter,
and the resulting code looks even cleaner.
filter even foo >>= bar
filter (\x -> even x && x < y) foo >>= bar
bar =<< filter even foo
--
Dave Menendez