Haskell Lite mera om listor Skapa en lista

  • Slides: 13
Download presentation
Haskell Lite mera om listor

Haskell Lite mera om listor

Skapa en lista mha ett delintervall Prelude> [1. . 8] [1, 2, 3, 4,

Skapa en lista mha ett delintervall Prelude> [1. . 8] [1, 2, 3, 4, 5, 6, 7, 8] Prelude> [1. 1. . 2. 2] [1. 1, 2. 1] Steglängd: default 1 Sista elementet närmast slutgränsen Prelude> [1. 1. . 4. 2] [1. 1, 2. 1, 3. 1, 4. 1] Prelude> [1, 3. . 10] [1, 3, 5, 7, 9] Du kan definiera steglängden själv implicit

Skapa en lista mha ett delintervall Prelude> [1. 1, 1. 2. 4] [1. 1,

Skapa en lista mha ett delintervall Prelude> [1. 1, 1. 2. 4] [1. 1, 1. 299999998, 1. 399999997, 1. 4999999 996, 1. 599999994, 1. 699999993, 1. 799999992, 1. 89999999, 1. 99999999, 2. 0999999988, 2. 1999 9999984, 2. 299999998, 2. 3999999977] Inte så exakt när det gäller flyttal. . .

List comprehension • En kraftfull mekanisk för att skapa listor • Syntax (jfr matematisk

List comprehension • En kraftfull mekanisk för att skapa listor • Syntax (jfr matematisk standardnotation; <- ska tolkas som ∈ Prelude> let ex = [1. . 10] Prelude> ex [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] Prelude> let x 2 = [2*x | x <- ex] Prelude> x 2 [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

List comprehension • Du kan också använda funktioner i list comprehensions: Prelude> let is.

List comprehension • Du kan också använda funktioner i list comprehensions: Prelude> let is. Even n = (n `mod` 2 == 0) Prelude> : info is. Even : : Integral a => a -> Bool -- Defined at <interactive>: 22: 5 Prelude> let even. Ex = [is. Even x | x <- ex] ex = [1. . 10] Prelude> even. Ex [False, True, False, True] Prelude> let even. Ex = [is. Even x | x <- x 2] ex 2 = [2, 4. . 20] Prelude> even. Ex [True, True, True, True]

List comprehension • Du kan sätta villkor till generatorn: Prelude> let ex. Big =

List comprehension • Du kan sätta villkor till generatorn: Prelude> let ex. Big = [x | x <- x 2, x >= 10] Prelude> ex. Big [10, 12, 14, 16, 18, 20] Prelude> let ex = [1. . 100] Prelude> let test. L = [x | x <- ex, is. Even x, x > 60] Prelude> test. L [62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100]

List comprehension • Du kan använda ett mönster i stället för en variabel på

List comprehension • Du kan använda ett mönster i stället för en variabel på den vänstra sidan av pilen: Prelude> let par. Plus = [x+y | (x, y) <- [(1, 1), (2, 2), (4, 4)]] Prelude> par. Plus [2, 4, 8]

List comprehension • Du kan ha två generatorer och kombinera deras resultat, här till

List comprehension • Du kan ha två generatorer och kombinera deras resultat, här till en kartesisk produkt: Prelude> let paraxy = [(x, y) | x <- [1. . 5], y <- [1. . 5]] Prelude> paraxy [(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (2, 1), (2, 2), (2, 3), (2, 4), (2, 5), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5), (4, 1), (4, 2), (4, 3), (4, 4), (4, 5), (5, 1), (5, 2), (5, 3), (5, 4), (5, 5)] Prelude> let test. L = [x - y | x <- [1. . 5], y <- [2, 4. . 10]] Prelude> test. L [-1, -3, -5, -7, -9, 0, -2, -4, -6, -8, 1, -3, -5, -7, 2, 0, -2, -4, -6, 3, 1, -3, -5]

List comprehension • Obs! Om du vill subtrahera elementen parvis, dvs första element –

List comprehension • Obs! Om du vill subtrahera elementen parvis, dvs första element – första element, andra element – andra element etc. finns det andra operationer för detta! (Se zip och zip. With) Prelude> let l 1 = [1. . 5] Prelude> let l 2 = [2, 4. . 10] Prelude> : info zip : : [a] -> [b] -> [(a, b)] -- Defined in `GHC. List' Prelude> let l 3 = zip l 1 l 2 Prelude> l 3 [(1, 2), (2, 4), (3, 6), (4, 8), (5, 10)] Prelude> let l 4 = [a-b | (a, b) <- l 3] Prelude> l 4 [-1, -2, -3, -4, -5]

List comprehension • Vi kan också göra detta ännu snyggare utan list comprehension när

List comprehension • Vi kan också göra detta ännu snyggare utan list comprehension när vi tittar mera på högre ordningens funktioner: Prelude> l 1 [1, 2, 3, 4, 5] Prelude> l 2 [2, 4, 6, 8, 10] Prelude> let l 5 = zip. With (-) l 1 l 2 Prelude> l 5 [-1, -2, -3, -4, -5]

List comprehension • Vi kan använda list comprehension i funktionsdefinitioner: Prelude> let add. Ord.

List comprehension • Vi kan använda list comprehension i funktionsdefinitioner: Prelude> let add. Ord. Pairs pair. List = [m+n | (m, n) <- pair. List, m < n] Prelude> : info add. Ord. Pairs : : (Num t, Ord t) => [(t, t)] -> [t] -- Defined at <interactive>: 55: 5 Prelude> add. Ord. Pairs [(1, 1), (1, 2), (2, 3), (4, 2)] [3, 5]

List comprehension • Vi kan använda list comprehension i funktionsdefinitioner: Prelude> let all. Even

List comprehension • Vi kan använda list comprehension i funktionsdefinitioner: Prelude> let all. Even xs = (xs == [x | x <- xs, is. Even x]) Prelude> : info all. Even : : Integral a => [a] -> Bool -- Defined at <interactive>: 58: 5 Prelude> all. Even [1. . 10] False Prelude> all. Even [2, 4. . 20] True Prelude> all. Even [2, 4. . 19] True 19 är ej med i listan!

List comprehension • Vi kan använda list comprehension i funktionsdefinitioner: Prelude> let singletons xss

List comprehension • Vi kan använda list comprehension i funktionsdefinitioner: Prelude> let singletons xss = [x | [x] <- xss] Prelude> : info singletons : : [[t]] -> [t] -- Defined at <interactive>: 63: 5 Prelude> singletons [[], [1], [2], [3, 4, 5], [2, 4], [6, 7, 8], [9]] [1, 2, 9] Observera hur mönsteranpassning används här!