#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 имеет три типа элементов в правой части понимания списка:
- генераторы вида
var <- list-expr
; - фильтры формы
bool-expr
; и - локальные определения формы
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
.