需要解释Haskell中的列表理解

时间:2019-07-09 07:34:17

标签: haskell list-comprehension

我只是从函数式编程开始,我正在学习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]
-- Output: 
-- [[2,2,4],[2,4,6,8],[2,4,2,6,2,6]] 

我看到这段代码将在每个子列表中产生带有偶数的新列表。

但是我不知道为什么先x <- xs然后再xs <- xxs,为什么我们不能首先做x <- xxs

1 个答案:

答案 0 :(得分:5)

xss是一个 list 个数字的列表。让我们假设它的类型为[[Int]](数字类型可以不同,但​​这没有任何区别)。

这意味着,如果我们定义生成器xs <- xxs,则xs将具有该列表元素的类型,因此[Int][Int]不是Integral类型的,因此我们无法检查Int的列表是否为even :: Integral a => a -> Bool

我们可以进一步处理该子列表xs。例如,使用另一个列表理解,例如[ x | x <- xs, even x ]来过滤子列表。

不过,您可能会更清楚地知道要做什么:

[ filter even xs | xs <- xss ]

或者我们可以在此处将外部列表理解转换为简单的map

map (filter even) xss