我只是从函数式编程开始,我正在学习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
?
答案 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