Aritmeetilised jadad ja Listikomprehensioon
Aritmeetilised jadad
[m..n]
on list [m, m + 1, \ldots, n] või vastavalt [m, m - 1, \ldots, n]
Näiteks:
[2..5]==[2,3,4,5] [3..1]==[3, 2, 1]
Sisemiselt on see lahendatud Range
liidese funktsiooniga rangeFromTo
s.t. töötab ka muude tüüpide puhul.
Näiteks:
['a'..'g'] == ['a', 'b', 'c', 'd', 'e', 'f', 'g']
[m,n..p]
on sisuliselt list [m, m + (n-m); m + 2(n-m),\ldots , q] kus q <= p
Näiteks:
[3,5..15]==[3, 5, 7, 9, 11, 13, 15]
Sisemiselt on see lahendatud Range
liidese funktsiooniga rangeFromThenTo
s.t. töötab ka muude tüüpide puhul.
Pane tähele, et töötab ka kahanevate väärtustega.
Näiteks:
['z', 'x'..'q']==['z', 'x', 'v', 't', 'r']
Listikomprehensioon
Süntaks: [e | q_1, q_2, \ldots, q_n ]
e on avaldis ja q_i võib olla
- generaator, kujul x \leftarrow l, kus x on muutuja ja l list,
let
, kujul \textsf{let }x = e', kus x on muutuja ja e avaldis, või- valvur, kujul e', kus e' on
Bool
tüüpi avaldis.
Avaldis e võib kasutada "paremal" defineeritud muutujaid, q_i-d võivad kasutada "vasakul" defineeritud muutujaid.
Näiteks:
[ x*x | x<-[1..10] ] == [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] [ x*x | x<-[1..10], mod x 3 == 0] == [9, 36, 81] [ m | x<-[1..10], let m = x*x, m < 50] == [1, 4, 9, 16, 25, 36, 49] [ (a,b) | a<-[1..2],b<-[1..3] ] == [(1,1),(1,2),(1,3),(2,1),(2,2),(2,3)]