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首先做呢?
xss是数字列表的列表。让我们假设它具有类型[[Int]](数字类型可以不同,但这没有任何区别)。
这意味着,如果我们定义一个生成器xs <- xxs,xs则将具有该列表元素的类型,因此[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)