Седмица 2 - Pattern matching, where, let in, case of
Материал
Throwback
- Листи
- Добавяне - отпред, отзад, Конкатенация, Индексиране
- List ranges
- List comprehensions
Неща за които не остана време
-
Деструкториране на лист -
head
,tail
,last
,init
-
Кортежи (tuples)
- Като лист, ама с определена дължина, която предварително знаем.
- Може да съдържа стойности на данни от различни типове.
- Типът на кортежа се определя от типовете на данните в него (в реда в който се срещат).
- Пример - вектор
- Пример - асоциативен списък - име/факултетен номер.
fst
,snd
- Как можем да си ги имплементираме?
Pattern matching с листи и кортежи
Идея - пишем различни имплементации в зависимост от “формата” на входа.
- Мачване на прости форми
- Мачване на листи - празен лист
[]
vs(глава : опашка)
- Мачване на кортежи
- Имплеметиране на
fst
,snd
- Вектор, наредена 2ка -
addVec
- Имплеметиране на
Гардове, къде?
-- Фибоначи с where
fib n =
iter 0 1 n
where
iter a _ 0 = a
iter a b cnt = iter b (a + b) (cnt - 1)
-- Фибоначи с гард
fibGuard n
| n == 0 = 0
| n == 1 = 1
| otherwise = fibGuard (n - 1) + fibGuard (n - 2)
Let in, case of
Let <дефинираме порменливи> in <резултатен израз, който вижда променливите>
,
като where
, ама локално.
Пример - нормализиране на вектор:
vecLen :: Floating a => (a, a) -> a
vecLen (x, y) = sqrt (x * x + y * y)
normalized :: Floating b => (b, b) -> (b, b)
normalized v@(x, y) = let l = vecLen v in (x / l, y / l)
Задачи
- Write a program that prints the numbers from 1 to 100. But for multiples of three print “Foo” instead of the number and for the multiples of five print “Bar”. For numbers which are multiples of both three and five print “FooBar”.
-
Напишете ф-я което транспонира матрица.
transpose [[1,2,3], [4,5,6]] == [[1,4], [2,5], [3,6]]
- Напишете ф-я за обединение на 2 списъка. Реултата е списък който съдържа елементите на едният и другият списък без повторение.
- Напишете ф-я която прави сеченеи на елементите на 2 списъка.
- Да се дефинира функция за превръщане на цяло число в стринг.
- Да се дефинира функция която парсва число от стринг (от
"123"
в123
).