рдпрд╣ рдЬреНрдЮрд╛рдд рд╣реИ рдХрд┐ рдХреБрдЫ рдХрд╛рд░реНрдп
Integer -> Bool
рд╕рд╣реА рд╣реИ рдпрд╛ рдирд╣реАрдВ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рд░реВрдк рд╕реЗ рдХрдо рд╕реЗ рдХрдо рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдЕрдШреБрд▓рдирд╢реАрд▓ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ рдХреБрдЫ рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рдЬреИрд╕реЗ
(Integer -> Bool) -> Maybe Integer
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ (рдпрдерд╛
(Integer -> Bool) -> Maybe Integer
рд╕рдорд╛рд░реЛрд╣
(Integer -> Bool) -> Maybe Integer
) рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рд╛рдХреГрддрд┐рдХ рд╕рдВрдЦреНрдпрд╛рдПрдБ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВрдЧреЗ, рд▓рдЧрднрдЧ рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рд╕реЗ рдЙрдирдХреА рд╕рд╛рдорд╛рдиреНрдп рдЧрдгрд┐рддреАрдп рдкрд░рд┐рднрд╛рд╖рд╛ (рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реЛрдЧреА):
data Nat = Zero | Succ Nat deriving (Eq, Ord, Show)
рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдПрдХ рдзрдирд╛рддреНрдордХ рдкреВрд░реНрдгрд╛рдВрдХ рдпрд╛ рддреЛ рд╢реВрдиреНрдп рд╣реЛрддрд╛ рд╣реИ рдпрд╛ рдХреБрдЫ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкреВрд░реНрдгрд╛рдВрдХ рдПрдХ (рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░реА рд╕реЗ рдкреНрд░рд╛рдкреНрдд) рджреНрд╡рд╛рд░рд╛ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдореЗрдВ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдкрд░ рдореВрд▓ рд╕рдВрдЪрд╛рд▓рди (рдЬреЛрдбрд╝, рдЧреБрдгрд╛,
Integer
рд╕реЗ рд░реВрдкрд╛рдВрддрд░рдг) рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
instance Num Nat where Zero + y = y Succ x + y = Succ (x + y) Zero * y = Zero Succ x * y = y + (x * y) fromInteger 0 = Zero fromInteger n = Succ (fromInteger (n-1))
рдЕрдм рддрдХ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ, рдирд┐рдпрдорд┐рдд
Integer
рд╕реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорддрднреЗрджреЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХреБрдЫ рдЦрд╛рд╕ рдирд╣реАрдВ рд╣реИред
рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рд╣рдо рдкреНрд░рдкрддреНрд░ рдХрд╛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЪрд╛рд╣рддреЗ рд╣реИрдВ
(Nat -> Bool) -> Maybe Nat
, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдПрдХ рд╕рдВрдЦреНрдпрд╛ рд╣реЛрдЧреА рдЬрд┐рд╕ рдкрд░ рдЗрдирдкреБрдЯ рдлрд╝рдВрдХреНрд╢рди
True
, рдпрд╛ рдРрд╕рд╛ рдХреЛрдИ рдирдВрдмрд░ рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░
Nothing
рдирд╣реАрдВред рдПрдХ рдкрд╣рд▓рд╛ рд╕рдиреНрдирд┐рдХрдЯрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рдорд╛рди рдХрд╛рд░реНрдп:
lyingSearch :: (Nat -> Bool) -> Nat lyingSearch f | f Zero = Zero | otherwise = Succ (lyingSearch (f . Succ))
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд▓рдЧрднрдЧ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдпрджрд┐ рд╡рд╛рдВрдЫрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореМрдЬреВрдж рд╣реИ, рддреЛ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╕рд╣реА рдЙрддреНрддрд░ рджреЗрдЧрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрджрд┐
f Zero == True
, рддреЛ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп
Zero
- рд╕рддреНрдп рд╣реЛрдЧрд╛ред рдЕрдиреНрдпрдерд╛, рдлрд╝рдВрдХреНрд╢рди
x+1
рд▓реМрдЯрд╛рдПрдЧрд╛, рдЬрд╣рд╛рдВ
x
рд╡рд╣ рдорд╛рди рд╣реИ рдЬрд┐рд╕ рдкрд░ рдлрд╝рдВрдХреНрд╢рди
f(x+1)
рд╕рддреНрдп рд╣реИ - рднреА рд╕рддреНрдп рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ
lyingSearch
: рдорд╛рдорд▓реЗ рдореЗрдВ рдЬрдм рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХ рд╕рдВрдЦреНрдпрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рддреЛ рдлрд╝рдВрдХреНрд╢рди рд╣рд░ рдЪрд░рдг рдкрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЕрдирдВрдд:
Succ (Succ (Succ (...
, рдЬрд╣рд╛рдВ рдШреЛрдВрд╕рд▓рд╛ рдХрднреА рдЦрддреНрдо рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
Haskell
рдЖрд▓рд╕реНрдп рдХреЗ рдХрд╛рд░рдг, рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдирдВрдд рд╡рд╛рдВрдЫрд┐рдд рдЬрд╡рд╛рдм рдирд╣реАрдВ рд╣реИ - рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдлрд╝рдВрдХреНрд╢рди "рдЭреВрда" рд╣реЛрдЧрд╛ред
рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рдЙрдкрд░реЛрдХреНрдд
lyingSearch
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╕рдорд╛рдзрд╛рди рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
search
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд
search
:
search f | f possibleMatch = Just possibleMatch | otherwise = Nothing where possibleMatch = lyingSearch f
рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдФрд░ рдХреНрдпрд╛ рдпрд╣ рд╣реЛрдЧрд╛ред рдЖрдЗрдП рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рджреЗрдЦреЗрдВ:
ghci> search (\x -> x*x == 16)
рдпрд╣реА рд╣реИ,
search
рдлрд╝рдВрдХреНрд╢рди рдиреЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдХрд┐ рдкрдВрджреНрд░рд╣ рдХреЗ рдмрд░рд╛рдмрд░ рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдХреЛрдИ рдкреНрд░рд╛рдХреГрддрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдирд╣реАрдВ рд╣реИред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрджрд┐ рдЖрдк рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИред
lyingSearch
рд╕реЗ рд╕рдВрднрд╛рд╡рд┐рдд рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд
lyingSearch
(рдЬреЛ рдХрд┐ рд╣рдореЗрд╢рд╛
Nat
рдХрд╛ рдПрдХ рдорд╛рдиреНрдп рдореВрд▓реНрдп рд╣реИ), рд╣рдо рдмрд╕ рдЗрд╕реЗ
f
рдХреЗ рдЗрдирдкреБрдЯ рдкрд░ рдлрд╝реАрдб рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд░рд┐рдЯрд░реНрди рдорд╛рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рд╡рд╛рдВрдЫрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореМрдЬреВрдж рд╣реИ, рддреЛ (рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╣реА рд╕рдордЭрд╛рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИ)
possibleMatch
рд╣реИ, рдХреЗрд╡рд▓ рд╡рд╣ рд╕рдВрдЦреНрдпрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдЪреЗрдХ рд╕рдлрд▓ рд╣реЛрдЧрд╛ред рдЕрдиреНрдпрдерд╛, рдХреНрдпреЛрдВрдХрд┐
f
рдХрд┐рд╕реА рднреА рдЗрдирдкреБрдЯ рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рдо
False
рдФрд░
Nothing
рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред
search
рдлрд╝рдВрдХреНрд╢рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рд╕реА рднреА рд╡рд┐рдзреЗрдп (
Nat->Bool
рдлрд╝рдВрдХреНрд╢рди) рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдордп рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ (рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдмрд╢рд░реНрддреЗ рдХрд┐ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ
Nat
рд▓рд┐рдП рднреА рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдП)ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкрд╛рд░рд┐рдд рдХрд┐рд╕реА рднреА рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдкреНрддрд┐ рдХреА рд╕реНрдерд┐рддрд┐
f
рдмрд╣реБрдд рдордЬрдмреВрдд рд╣реИ, рдФрд░ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рджреГрдврд╝рддрд╛ рд╕реЗ рдЕрдиреБрдореЗрдп рд╡рд┐рдзреЗрдпрдХреЛрдВ рдХреЗ рд╕реЗрдЯ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИ: рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
fx = x*x + 1 == x
рдПрдХ рдЕрдирдВрдд рд▓реВрдк рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХрд┐рд╕реА рднреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдлрд╝рдВрдХреНрд╢рди рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ? рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдП рдЧрдП рдирд┐рд░рд░реНрдердХрддрд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐рд╕реА рдФрд░ рдХреЗ рд▓рд┐рдП: рд╕рдорд╛рди рдЪрд┐рд╣реНрди рдХреЗ рдмрд╛рдИрдВ рдФрд░ рджрд╛рдИрдВ рдУрд░ рдЕрд╕реАрдо рд░реВрдк рд╕реЗ
Succ (Succ (Succ (...
, рдФрд░ рддрджрдиреБрд╕рд╛рд░ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХрд┐ рдмрд╛рдПрдВ рдФрд░ рджрд╛рдПрдВ рдкрдХреНрд╖ рд╕рдорд╛рди рд╣реИрдВред рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ, рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред
Integer
рд▓рд┐рдП рдПрдХ рд╕рдорд╛рди рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдгред
рдЕрдм рдЖрдк рд╕рд░рд▓ рд╢рдмреНрджреЛрдВ рдореЗрдВ рд╕рдордЭрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрд╢рд╛-рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рдХреНрдпреЛрдВ рдФрд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЖрдЦрд┐рд░рдХрд╛рд░, рдпрджрд┐
f
рдиреЗ рдЕрдирдВрдд рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛, рддреЛ рд╡рд╣ рдЕрдиреБрдХреНрд░рдо
Succ (Succ (Succ (...
, рддреЛ рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдпрд╣
Succ
рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕ рдХреА рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ (рдЦреБрд▓рддрд╛ рд╣реИ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЙрд╕реА рддрд░рд╣, рдЖрдк рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП
search
рдЬреИрд╕реЗ рдХрд╛рд░реНрдп рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╕рд╛рдкреЗрдХреНрд╖ рд░реВрдк рд╕реЗ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рднреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрдЦреНрдпрд╛рдПрдВ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рдЕрдВрддрд╣реАрди рд╕реВрдЪреА рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ (рджреЗрдЦреЗрдВ
рд╕реАрдорд▓реЗрд╕ рдЗрдореНрдкреЙрд╕рд┐рдмрд▓ рдлрдВрдХреНрд╢рдирд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдореНрд╕ )ред рд╣реИрдХреЗрдЬ рдкрд░ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреИрдХреЗрдЬ
рдЕрдирдВрдд-рдЦреЛрдЬ рд╣реИ , рдЬреЛ рдЙрдЪрд┐рдд рдореЛрдирд╛рдб рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рдкреБрдирд╢реНрдЪ: рдпрд╣ рд▓реЗрдЦ
рдЦреЛрдЬрд╛ рдЬрд╛ рд╕рдХрдиреЗ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ "рд░рд┐рдЯреЗрд▓рд┐рдВрдЧ" рджреНрд╡рд╛рд░рд╛ рдереЛрдбрд╝рд╛ рдкреВрд░рдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдЕрдиреБрд╡рд╛рдж рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред