我看不出代码中的“偶数”有什么作用?

时间:2019-04-13 20:24:05

标签: haskell

ghci> let xxs=[[1,3,5,2,3,1,2,4,5],[1,2,3,4,5,6,7,8,9],[1,2,4,2,1,6,3,1,3,2,3,6]] 
ghci> [[x|x<-   xs,even x]|xs<- xxs]
[[2,2,4],[2,4,6,8],[2,4,2,6,2,6]]

这段代码与列表理解有关。但是我看不到程序如何使用“偶数”

1 个答案:

答案 0 :(得分:8)

Haskell列表理解表达式在列表理解的右侧具有三种类型的元素:

  1. 发电机,格式为var <- list-expr;
  2. 过滤器,格式为bool-expr;和
  3. 本地定义,格式为let var = expr

even x部分因此是过滤器。这意味着仅当满足过滤条件时,even x才会产生True,该元素才是列表理解的其余部分的候选者,因此最终会导致将元素分支添加到列表中。

因此,这里的表达式具有两个组成部分:

[x | x <- xs, even x ]
--   \__ __/  \__ _/
--      v        v
--  generator  filter

因此,我们遍历xs中的元素,然后对于每个元素检查该元素是否为even,如果是,则将x添加到结果中。

但是以上内容可以写为:

filter even xs

基本上描述了我们在这里所做的事情:我们过滤列表xs,使结果是仅包含xs偶数元素的列表。