On Mon, 2008-11-10 at 18:20 +0000, Andrew Coppin wrote:
> Mitchell, Neil wrote:
> > In general:
> >
> > if boolean then [value] else []
> >
> > Can be written as:
> >
> > [value | boolean]
> >   
> 
> Is there any specific reason why this is valid?

It is due to the rules for the translation of list comprehensions:

[ e | True ]         = [ e ]
[ e | q ]            = [ e | q, True ]
[ e | b, Q ]         = if b then [ e | Q ] else []
[ e | p <- l, Q ]    = let ok p = [ e | Q ]
                           ok _ = []
                        in concatMap ok l
[ e | let decls, Q ] = let decls in [ e | Q ]

So [ value | boolean ] matches the second rule giving us
  [value | boolean, True]
which matches the third rule
  if boolean then [value | True] else []
which can be simplified via the first rule to
  if boolean then [value] else []

These rules are slightly more complex than necessary because they avoid
using a null base case. We could simplify the first two rules if we were
to allow the degenerate list comprehension [ e | ] and let Q match
nothing. Then we'd use the rule:

[ e | ] = [ e ]

and translate [ value | boolean ] via the original 3rd rule with Q as
nothing:
  if boolean then [value | ] else []
and directly to:
  if boolean then [value ] else []


If you meant, why is it allowed rather than banned then I guess the
answer is because it is orthogonal. The rules naturally handle that case
and there was no particular reason to ban it, even if it is somewhat
unusual.

Duncan

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to