Георги Наков, nakov.gl at gmail com
Марин Маринов, marinov.ms+tues at gmail com
Технологично училище "Електронни Системи"
9 Ноември 2016г.
- съкратен запис за списъци от последователни елементи
- работят за списъци от символи и числа
> [1..5]
[1, 2, 3, 4, 5]
> ['X'..'Z']
"XYZ"
Важно: Не използвайте този запис, ако списъкът e с реални числа.
- съкратен запис за построяване на (по-сложни) списъци
- вдъхновен от начина, по който множествата се описват в математиката
```hs > [ x*2 | x <- [1..4]] [2, 4, 6, 8] ```
- С list compehension може да прилагаме функция върху всеки един елемент на списъка без явна рекурсия
> [toUpper c | c <- "hello"]
"HELLO"
- С list compehension може да филтрираме елементите на списъка с произволни условия без явна рекурсия с guards
> [ x | x <- [1..10], odd x, mod x 3 == 0]
--всички нечетни числа между 1 и 10, кратни на 3
[3, 9]
Всички условия трябва да са едновременно изпълнени, за да бъде включен елементът в крайния списък.
- Може да взимаме няколко променливи, всяка взета от различен списък
> [[x, y, z] | x <- [1..3], y <- [10,11], z <- [20,21]]
[[1, 10, 20], [1, 10, 21], [1, 11, 20], [1, 11, 21],
[2, 10, 20], [2, 10, 21], [2, 11, 20], [2, 11, 21],
[3, 10, 20], [3, 10, 21], [3, 11, 20], [3, 11, 21]]
В този случай list comprehension-a работи като вложени for цикли:
lst = []
for each x in [1, 2, 3]:
for each y in [10, 11]:
for each z in [20, 21]:
append [x, y, z] to lst
- Когато задаваме повече от един списък, може да използваме всички предишни променливи при дефиницията на списъка
> [ [x, y] | x <- [1..4], y <-[1..x]]
[ [1, 1],
[2, 1], [2, 2],
[3, 1], [3, 2], [3, 3],
[4, 1], [4, 2], [4, 3], [4, 4] ]
- Може да вгнездваме list comprehension-и
removeEs :: [String] -> [String]
removeEs someWords =
[ [c | c <- word, c /= 'e', c /= 'E']
| word <- someWords]
> removeEs ["These", "are", "some", "good", "words"]
["Ths", "ar", "som", "good", "words"]