生成器表达式中的模式
但是,生成器表达式中的 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 []]