You A Haskell Chapter 2
To start coding in haskell, type in ghci.
ghci
2 + 15
-- 17
49 _ 100
-- 4900
1892 - 1472
-- 420
5 / 2
-- 2.5
We can use parentheses too:
50 _ 100) - 4999
(-- 1
50 _ 100 - 4999
-- 1
50 _ (100 - 4999)
-- -244950
Boolean Algebra:
True && False
-- False
True && True
-- True
False || True
-- True
not False
-- True
not (True && True)
-- False
Equality Testing:
5 == 5
-- True
1 == 0
-- False
5 /= 5
-- False
5 /= 4
-- True
"hello" == "hello"
-- True
We can’t add two different types though:
5 + "llama"
-- No instance for (Num [Char])
-- arising from a use of `+' at <interactive>:1:0-9
-- Possible fix: add an instance declaration for (Num [Char])
-- In the expression: 5 + "llama"
-- In the definition of `it': it = 5 + "llama"
Succ and Pred return the next and previous item.
succ 8
-- 9
-- succ returns the next of an item.
pred 8
-- 7
-- pred returns the predicate, or previous of an item.
min 9 10
-- 9
min 3.4 3.2
-- 3.2
max 100 101
-- 101
succ 9 + max 5 4 + 1
-- 16
succ 9) + max (5 4) + 1
(-- 16
Check if a number is even or odd:
even 4
-- True
odd 5
-- True
= x + x
doubleMe x
= doubleMe x + doubleMe y
doubleUs x y
= if x > 10 then x else x * 2 doubleSmallNumber x
= "It's a me, Conan O'Brien!"
conanO'Brien
= [4,8,15,16,23,42]
lostNumbers
1,2,3,4] ++ [9,10,11,12]
[-- [1,2,3,4,9,10,11,12]
use ++ to add two lists together. strings are just lists of chars. Remember that ++ takes O(n) time
1,2,3,4] ++ [9,10,11,12]
[-- [1,2,3,4,9,10,11,12]
"hello" ++ " " ++ "world"
-- "hello world"
'w','o'] ++ ['o','t']
[-- "woot"
whereas :
, the cons operator takes O(1)
'A': " SMALL CAT"
-- "A SMALL CAT"
5:[1,2,3,4,5]
-- [5,1,2,3,4,5]
Access by index is done with !!
.
"Steve Buscemi" !! 6
-- 'B'
9.4,33.2,96.2,11.2,23.25] !! 1
[-- 33.2
= [1,2,3,4],[5,3,3,3],[1,2,2,3,4],[1,2,3]]
b -- [1,2,3,4],[5,3,3,3],[1,2,2,3,4],[1,2,3]]
++ [1,1,1,1]]
b -- [1,2,3,4],[5,3,3,3],[1,2,2,3,4],[1,2,3],[1,1,1,1]]
6,6,6]:b
[-- [6,6,6],[1,2,3,4],[5,3,3,3],[1,2,2,3,4],[1,2,3]]
!! 2
b -- [1,2,2,3,4]
Lists can be compared if they have elements that meet the typeclass Ord Lists are compared from the head..tail
3,2,1] > [2,1,0]
[-- True
3,2,1] > [2,10,100]
[-- True
3,4,2] > [3,4]
[-- True
3,4,2] > [2,4]
[-- True
3,4,2] == [3,4,2]
[-- True
Head takes a list and returns its head, or first element
head [5,4,3,2,1]
-- 5
tail takes a list and returns its head, which is everything but the head
tail [5,4,3,2,1]
-- [5,4,3,2,1]
last takes a list and returns its last element
last [5,4,3,2,1]
-- 1
init takes a list and returns everything except its last element
init [5,4,3,2,1]
-- [5,4,3,2]
using any of the above blows up on an empty list
head []
-- *** Exception: Prelude.head: empty list
length takes a list and returns its length
length [5,4,3,2,1]
-- 5
null checks if a list is empty. If it is, it returns True, else, False
null [1,2,3]
-- False
null []
-- True
reverse reverses a list
reverse [5,4,3,2,1]
-- [1,2,3,4,5]
take takes from the beginning of the list
take 3 [5,4,3,2,1]
-- [5,4,3]
take 1 [3,9,3]
-- [3]
take 5 [1,2]
-- [1,2]
take 0 [6,6,6]
-- []
drop works in a similar way, but it drops elements then takes the remaining elements.
drop 3 [8,4,2,1,5,6]
-- [1,5,6]
drop 0 [1,2,3,4]
-- [1,2,3,4]
drop 100 [1,2,3,4]
-- []
maximum and minimum returns the max and minimum of a list
minimum [8,4,2,1,5,6]
-- 1
maximum [1,9,2,3,4]
-- 9
sum takes a list of numbers and returns their sum
sum [1,2,3,4]
-- 10
product takes a list of numbers and returns their product
product [1,2,3,4]
-- 24
elem takes a thing and a list of things and tells us if that thing is an element of the list.
4 `elem` [3,4,5,6]
-- True
10 `elem` [3,4,5,6]
-- False
ranges are defined for elements that have a succ
1..20]
[-- [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
'a'..'z']
[-- "abcdefghijklmnopqrstuvwxyz"
'K'..'Z']
[-- "KLMNOPQRSTUVWXYZ"
steps can be specified as the first element before the comma
2,4..20]
[-- [2,4,6,8,10,12,14,16,18,20]
3,6..20]
[-- [3,6,9,12,15,18]
ranges in reverse have to be specified with the first element
20,19..1]
[-- [20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1]
be careful about floats in haskell.
0.1, 0.3 .. 1]
[-- [0.1,0.3,0.5,0.7,0.8999999999999999,1.0999999999999999]
ranges can be lazy, just don’t end the right hand side
= [13,26..]
x -- x
take 3 x
-- [13,26,39]
cycle takes a list and cycles it into an infinite list
take 10 (cycle [1,2,3])
-- [1,2,3,1,2,3,1,2,3,1]
take 12 (cycle
-- "LOL LOL LOL "
repeat takes an element and produces an infinite list of that element
take 10 (repeat 5)
-- [5,5,5,5,5,5,5,5,5,5]
(replicate times item) returns the same element x times
replicate 3 10
-- [10, 10, 10]
List comprehensions
*2 | x <- [1..10]]
[x-- [2,4,6,8,10,12,14,16,18,20]
with an if block, only take items that are greater than 12.
*2 | x <- [1..10], x*2 >= 12]
[x-- [12,14,16,18,20]
= [ if x < 10 then "BOOM!" else "BANG!" | x <- xs, odd x]
boomBangs xs 7..13]
boomBangs [-- ["BOOM!","BOOM!","BANG!","BANG!"]
list comprehensions can be used for outer joins as well
let nouns = ["hobo","frog","pope"]
let adjectives = ["lazy","grouchy","scheming"]
++ " " ++ noun | adjective <- adjectives, noun <- nouns]
[adjective -- ["lazy hobo","lazy frog","lazy pope","grouchy hobo","grouchy frog", "grouchy pope","scheming hobo","scheming frog","scheming pope"]
we can define our own length by replacing everything with 1 and summing it up.
= sum [1 | _ <- xs] length' xs
remove nonuppercase characters
= [ c | c <- st, c `elem` ['A'..'Z']] removeNonUppercase st
tuples are like non-homogenous lists
= (1,
tup
fst tup
-- 8
snd tup
-- "hi"
zip produces a list of pairs
zip [1,2,3,4,5] [5,5,5,5,5]
-- [(1,5),(2,5),(3,5),(4,5),(5,5)]
zip [1 .. 5] ["one", "two", "three", "four", "five"]
-- [(1,]
let rightTriangles = [ (a,b,c) | c <- [1..10], b <- [1..c], a <- [1..b], a^2 + b^2 == c^2]
-- [(3,4,5), (6,8,10)]
Prev: learn-you-a-haskell-chapter-1 Next: learn-you-a-haskell-chapter-3