Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
> module ListidF where
> import Prelude hiding (null, filter, takeWhile)
Kõigepealt defineerime kujul foldr op e kolm standardfunktsiooni, mis on
moodulis Prelude defineeritud otseselt ja ka loengumaterjal ei anna
teistsugust varianti.
> null
> = foldr (\_ _ -> False) True
> filter p
> = let
> op x r
> | p x
> = x : r
> | otherwise
> = r
> in
> foldr op []
> takeWhile p
> = let
> op x r
> | p x
> = x : r
> | otherwise
> = []
> in
> foldr op []
Nüüd võtame raskema näite. Kirjutame funktsiooni disj , mis kahe
argumentlisti kohta otsustab, kas nad on disjunktsed:
disj xs ys ==> True , kui xs ja ys ei sisalda ühiseid elemente,
disj xs ys ==> False , kui xs ja ys sisaldavad vähemalt ühe ühise elemendi.
Osutub, et nii disj xs kui disj on defineeritavad kujul foldr op e .
Esimene on lihtsam. Selle saamiseks kirjutame välja definitsiooni, mis on
rekursiivne teise argumendi järgi.
> disj1 xs (y : ys)
> = not (elem y xs) && disj1 xs ys
> disj1 _ _
> = True
Siit saame standardselt
> disj1F xs
> = foldr (\y r -> not (elem y xs) && r) True
"Taandades" foldr argumentfunktsioonist teise argumendi, saame lühema kuju
> disj1F' xs
> = foldr (\y -> (&&) (not (elem y xs))) True
"Taandades" ka järelejäänud argumendi, saame veel lühemalt
> disj1F'' xs
> = foldr ((&&) . not . flip elem xs) True
Kas suudate tulemust lugeda? Kui selline definitsioon ette antaks, kas
saaksite aru?
Katsume nüüd disj enda avaldada kujul foldr op e . Selleks kirjutame
välja definitsiooni, mis on rekursiivne esimese argumendi järgi. Sisuliselt
vahetame disj1 definitsioonis argumendid.
> disj2 (x : xs) ys
> = not (elem x ys) && disj2 xs ys
> disj2 _ _
> = True
Viies teise argumendi paremale poole, saame
> disj2' (x : xs)
> = \ys -> not (elem x ys) && disj2' xs ys
> disj2' _
> = \_ -> True
Nüüd saame standardselt
> disj2F :: Eq a => [a] -> [a] -> Bool
> disj2F
> = foldr (\x r -> \ys -> not (elem x ys) && r ys) (\_ -> True)
Natuke kohendades saame
> disj2F' :: Eq a => [a] -> [a] -> Bool
> disj2F'
> = foldr (\x r ys -> not (elem x ys) && r ys) (const True)
See on loetamatu.