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.