Нужно объяснение для понимания списка в Haskell - PullRequest
5 голосов
/ 09 июля 2019

Я только начинаю с функционального программирования и изучаю язык программирования 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 Ответ

5 голосов
/ 09 июля 2019

xss - это список список с числами.Предположим, он имеет тип [[Int]] (тип числа может быть другим, но это не имеет значения).

Это означает, что если мы определим генератор xs <- xxs, то xs будет иметьтип элементов этого списка, поэтому [Int].[Int] является не типом Integral, поэтому мы не можем проверить, является ли список Int s even :: Integral a => a -> Bool.

Однако мы можем обработать этот подсписок xs дальше.Например, с другим пониманием списка, например [ x | x <- xs, even x ], который фильтрует подсписок.

Однако может быть более понятно, что вы делаете с:

[ <b>filter even xs</b> | xs <- xss ]

или мы можем здесь преобразовать внешний списокпонимание простого map:

map (filter even) xss
...