Я не понимаю, что делает «даже» в этом фрагменте кода?

#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]
[[2,2,4],[2,4,6,8],[2,4,2,6,2,6]]
 

Этот фрагмент кода относится к пониманию списка. Но я не понимаю, как программа сочетается с «четным».

Комментарии:

1. Он фильтрует список таким образом, что сохраняются только четные числа.

Ответ №1:

Выражение понимания списка Haskell имеет три типа элементов в правой части понимания списка:

  1. генераторы вида var <- list-expr ;
  2. фильтры формы bool-expr ; и
  3. локальные определения формы let var = expr .

Таким even x образом, часть является фильтром. Это означает, что только если фильтр удовлетворен, so even x приводит к True тому, что этот элемент является кандидатом для понимания остальной части списка и, таким образом, в конечном итоге приводит к добавлению ветви элементов в список.

Итак, здесь выражение, таким образом, состоит из двух компонентов:

 [x | x <- xs, even x ]
--   __ __/  __ _/
--      v        v
--  generator  filter
 

таким образом, мы перебираем элементы в xs , а затем для каждого элемента проверяем, есть ли этот элемент even , и если он есть, мы добавляем x к результату.

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

 filter even xs
 

которые в основном описывают то, что мы делаем здесь: мы фильтруем список xs таким образом, чтобы результатом был список, содержащий только четные элементы xs .