Skip to content

Latest commit

 

History

History
112 lines (91 loc) · 3.12 KB

lcomprehension.md

File metadata and controls

112 lines (91 loc) · 3.12 KB

List comprehension




Георги Наков, nakov.gl at gmail com
Марин Маринов, marinov.ms+tues at gmail com

Технологично училище "Електронни Системи"
9 Ноември 2016г.


List ranges

  • съкратен запис за списъци от последователни елементи
  • работят за списъци от символи и числа
> [1..5]
  [1, 2, 3, 4, 5]

> ['X'..'Z']
  "XYZ"

Важно: Не използвайте този запис, ако списъкът e с реални числа.


List Comprehension

  • съкратен запис за построяване на (по-сложни) списъци
  • вдъхновен от начина, по който множествата се описват в математиката

```hs > [ x*2 | x <- [1..4]] [2, 4, 6, 8] ```

List comprehension

  • С 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]

Всички условия трябва да са едновременно изпълнени, за да бъде включен елементът в крайния списък.


List comprehension

  • Може да взимаме няколко променливи, всяка взета от различен списък
> [[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

List comprehension

  • Когато задаваме повече от един списък, може да използваме всички предишни променливи при дефиницията на списъка
> [ [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

  • Може да вгнездваме 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"]