
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?
Is there any specific reason to dis-allow it? The grammar here looks something like (NB: I didn't double-check the report): list_compr ::= [ value | generator* ] generator ::= boolean | pat <- list | let binds One particular special case is where there is exactly one generator, which has three further special cases: [ value | boolean ] [ value | pat <- expr ] [ value | let binds ] These are all valid because they are special cases of the general list comprehension syntax; the de-sugarings are all just special cases of the general list comprehension de-sugaring rules: [ value | ] = [ value ] [ value | boolean, generators ] = if boolean then [ value | generators ] else [] [ value | pat <- expr, generators ] = expr >>= \ x -> case x of pat -> [ value | generators ]; _ -> [] [ value | let binds, generators ] = let binds in [ value | generators ] So the special cases simplify to [ value | boolean ] = if boolean then [ value ] else [] [ value | pat <- expr ] = expr >>= \ x -> case x of pat -> [ value ]; _ -> [] [ value | let binds ] = let binds in [ value ] Why wouldn't this work? jcc