需要解释Haskell中的列表理解

Nam*_* Do 5 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]] 
Run Code Online (Sandbox Code Playgroud)

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

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

Wil*_*sem 5

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

这意味着,如果我们定义一个生成器xs <- xxsxs则将具有该列表元素的类型,因此[Int]。一个[Int]不是一个Integral类型的,所以我们不能检查,如果列表Ints是even :: Integral a => a -> Bool

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

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

[ filter even xs | xs <- xss ]
Run Code Online (Sandbox Code Playgroud)

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

map (filter even) xss
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的明确解释。 (2认同)