生成器表达式中的模式

但是,生成器表达式中的 x 不仅可以变量,而且可以是任何模式。在模式不匹配的情况下,跳过生成的元素,并且列表的处理继续下一个元素,因此像过滤器一样:

[x | Just x <- [Just 1, Nothing, Just 3]]     -- [1, 3]

在其模式中具有变量 x 的生成器创建包含其右侧的所有表达式的新范围,其中 x 被定义为生成的元素。

这意味着警卫可以编码为

[ x | x <- [1..4], even x] ==
[ x | x <- [1..4], () <- [() | even x]] ==
[ x | x <- [1..4], () <- if even x then [()] else []]