part1.
Prelude> [2^n | n <- [1..10]]
[2,4,8,16,32,64,128,256,512,1024]
Prelude> [2^n | n <- [1..10],2^n >= 10, 2^n < 100]
[16,32,64]
- 2^n: the expression for the elements of the resulting list
- n <- [1…10]: tells where the variable values come from
- 2^n >= 10, 2^n < 100: can be predicates or filters placing additional constraints on which value to use.
part2.
Prelude> [x | x <- "outrageous",not(elem x "aeiou")]
"trgs"
Prelude> [x | x <- "outrageous",not(x `elem` `aeiou`)]
"trgs"
Prelude> [[x|x <- word, not(x `elem` "aeiou")]| word <- ["bell","book","candle"]]
["bll","bk","cndl"]
- First two snippets have the same function that remove vowels, elem[^1] is a Haskell function.
- Third snippets is a nesting list comprehension, inner list comprehension
[x|x <- word, not(x
elem"aeiou")]
remove all of the vowels from the word, and outer list comprehension does that for each word in the list. - we use backtick[^2] in the last twosnippet to make infix.
[^1]elem:
Function: | elem |
---|---|
Type: | Eq a => a -> [a] -> Bool |
Descriptions: | returns True if the list contains an item equal to the first argument |
Example:
Prelude> 14 `elem` [1..10]
False
Prelude> elem 1 [1..10]
True
Prelude> 'o' `elem` "tom"
True
[^2]backtick:
Prelude>10.0 / 5.0
2.0
Prelude> div 10 5
2
Prelude> 10 `div` 5
2
Divison can be written in 3 different ways, as the above show.
we might want to write it as an infix notation as if it were an operator and then we can do that with the backtick, so i can put div operator in backticks and then it becomes an operator
part3.
Here is another example:
Prelude> [[x*y | x <-[1..5]] | y <- [1..5]]
[[1,2,3,4,5],[2,4,6,8,10],[3,6,9,12,15],[4,8,12,16,20],[5,10,15,20,25]]
The inner list comprehension[x*y | x <-[1..5]]
multiplies by the each possible value of y.
The outer list comprehension [[x*y | x <-[1..5]] | y <- [1..5]]
does that for each possible value of x.