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)]