Cesta, krok 2
Zadáno v neděli 16. 5.
K odevzdání ve čtvrtek 13. 5.
Tyto úlohy jsou pouze pro poutníky na cestě. Co dělá jaká funkce můžete rychle najít v knize, nebo na Hoogle.
Od teď pište typy ke všem funkcím, v tomto kroce i ve všech budoucích.
Vysvětlete vlastními slovy (klidně až naživo v úterý):
- Jaký je rozdíl mezi
Int
aInteger
? - Jaký je rozdíl mezi
Float
aDouble
? - Co je to typová třída?
- Proč potřebujeme mít v jazyce typy?
- Jaký je rozdíl mezi seznamem a tuplem?
Praktické úlohy; nepoužívejte if-then-else, pokud budete mít nutkání jej použít, sáhněte k pattern matchingu, case-of
nebo guardům (to jsou ty věci s |
).
- Dopište typy ke všem funkcím z minulého týdne. Od nynějška už ke všem funkcím typy pište.
- Napište funkci
myProduct
, která vrátí součin všech čísel v seznamu. Použijte pattern-matching a rekurzi, nepoužívejte list comprehension. Můžete se inspirovat implementací funkcesum
v kapitole 4.
> myProduct [1, 2, 3, 4] 24 > myProduct [0, 1, 2, 3, 4] 0
- Napište funkci
myProduct'
, která dělá to samé jakomyProduct
, ale ignoruje nuly. Opět použíjte pattern matching.
> myProduct' [1, 2, 3, 4] 24 > myProduct' [0, 1, 2, 3, 4] 24
- Napište funkci
sortInto
, která vezme setřízený seznam věcí, které jdou porovnávat, a jeden další prvek, a vrátí index, na který by se měl daný prvek dát, aby seznam zůstal opět setříděný.
Možná budete potřebovat napsat si pomocnou funkci; pokud ano, napište ji v rámci hlavní funkce pomocí let-in
nebo where
.
> 2 `sortInto` [1, 3, 4] 1 > 10 `sortInto` [0, 1, 2, 3, 4] 5 > 'o' `sortInto` "lmqz" 2
- Napište funkci
fib
, která vypočítá n-té fibonacciho číslo. První dvě Fibonacciho čísla jsou1
a1
, každé další se rovná součtu dvou předchozích. Začátek řady je tedy 1, 1, 2, 3, 5, 8, ...
K napsání použijte case-of
.
- Napište funkci
signum
, která dostane číslo a vrátí-1
,0
, nebo1
podle jeho znaménka. Použijte guardy (|
).
Možná se bude hodit funkce fromIntegral
(ale negerantuji to).
> signum 10.0 1 > signum 0 0 > signum -191.7 -1