Haskell Hero
Interaktivní učebnice pro začínající Haskellisty
|
Funkce nad BoolProč funkce nad hodnotami Bool?Příklad
Definujte funkci Řešení, které by nás napadlo asi jako první, by bylo nejspíše následující:
Zapsáno v Haskellu: velkeSude :: Integer -> Char velkeSude x = if even x then if x > 10 then 'A' else 'N' else 'N'Asi nemá cenu zdůrazňovat, že kdyby byly podmínky tři nebo čtyři a požadovali bychom, aby byly všechny splněny, kód by se stal velice nepřehledným. Proto máme funkce nad hodnotami Bool .
A zároveň
A zároveň, neboli logická konjunkce je binární funkce zapisovaná operátorem Definice
(&&) :: Bool -> Bool -> Bool True && True = True _ && _ = FalseTato definice předpokládá, že již známe vyhodnocené hodnoty obou argumentů. Pokud se ale první argument vyhodnotí na False , nemusíme už druhý argument vůbec vyhodnocovat, protože ať je jeho hodnota jakákoli, výsledná hodnota bude opět False .
Naopak, pokud se první argument vyhodnotí na Proto se používá definice následující: False && _ = False True && x = x Příklad
Vezměme si ukázkový příklad z prvního odstavce. Jeho definice pomocí velkeSude x = if even x && x > 10 then 'A' else 'N' Nebo
Funkci nebo, neboli logickou disjunkci použijeme tehdy, pokud chceme vytvořit složenou podmínku, která má uspět, pokud je alespoň jedna vnitřní podmínka splněna. Zapisuje se dvěma svislítky: Definice
False || False = False _ || _ = TruePodobně jako funkce (&&) má i funkce (||) efektivnější variantu. Pokud se totiž první argument vyhodnotí na True , nepotřebujeme už znát hodnotu druhého argumentu. Neboť již v této chvíli víme, že se celý výraz vyhodnotí na True .
True || _ = True False || x = x Příklad
Definujte funkci Definujeme tedy funkci, která otestuje, zda je číslo menší jak 10 nebo větší jak 20. mezi :: Integer -> String mezi x = if x < 10 || x > 20 then "Ano" else "Ne" Not
Unární funkce Definice
not :: Bool -> Bool not True = False not False = True |