ΠΠΎΠΊΠ° Π²ΡΡ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ. ΠΠΎ ΡΡΠΎ Π΅ΡΠ»ΠΈ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅ Π΄Π»Ρ ΡΠΏΠΈΡΠΊΠ°, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠ΅Π³ΠΎ, ΡΠΏΠ°ΡΠΈΠ±ΠΎ Π΄ΠΎΠΊΡΠΎΡΡ ΠΠ»ΠΎ, ΠΎΠ΄ΠΈΠ½ ΠΌΠΈΠ»Π»ΠΈΠΎΠ½ Π΅Π΄ΠΈΠ½ΠΈΡ?
ghci> foldl (+) 0 (replicate 1000000 1)
*** Exception: stack overflow
ΠΠ³ΠΎ, ΠΆΠ΅ΡΡΠΎΠΊΠΎ! Π§ΡΠΎ ΠΆΠ΅ ΡΠ»ΡΡΠΈΠ»ΠΎΡΡ? Haskell Π»Π΅Π½ΠΈΠ², ΠΏΠΎΡΡΠΎΠΌΡ ΠΎΠ½ ΠΎΡΠΊΠ»Π°Π΄ΡΠ²Π°Π΅Ρ ΡΠ΅Π°Π»ΡΠ½ΡΠ΅ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ Π½Π°ΡΡΠΎΠ»ΡΠΊΠΎ, Π½Π°ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. ΠΠΎΠ³Π΄Π° ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ foldl, Haskell Π½Π΅ Π²ΡΡΠΈΡΠ»ΡΠ΅Ρ Π°ΠΊΠΊΡΠΌΡΠ»ΡΡΠΎΡ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡΠ°Π³Π΅. ΠΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ ΠΎΠ½ ΠΎΡΠΊΠ»Π°Π΄ΡΠ²Π°Π΅Ρ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅. ΠΠ° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ ΡΠ°Π³Π΅ ΠΎΠ½ ΡΠ½ΠΎΠ²Π° Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΡΡΠΈΡΠ°Π΅Ρ, ΠΎΠΏΡΡΡ ΠΎΡΠΊΠ»Π°Π΄ΡΠ²Π°Ρ Π½Π° ΠΏΠΎΡΠΎΠΌ. ΠΠΌΡ, ΠΏΡΠ°Π²Π΄Π°, ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΡΠΎΡ ΡΠ°Π½ΡΡΡ ΡΡΠ°ΡΠΎΠ΅ ΠΎΡΠ»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ Π² ΠΏΠ°ΠΌΡΡΠΈ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π½ΠΎΠ²ΠΎΠΌΡ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΡΡΠ΅Π±ΠΎΠ²Π°ΡΡΡΡ Π΅Π³ΠΎ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΏΠΎΠΊΠ° ΡΠ²ΡΡΡΠΊΠ° foldl ΡΠ°Π΄ΠΎΡΡΠ½ΠΎ ΡΠΎΡΠΎΠΏΠΈΡΡΡ ΠΏΠΎ ΡΠΏΠΈΡΠΊΡ, Π² ΠΏΠ°ΠΌΡΡΠΈ ΠΎΠ±ΡΠ°Π·ΡΠ΅ΡΡΡ ΠΊΡΡΠ° ΠΎΡΠ»ΠΎΠΆΠ΅Π½Π½ΡΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ, ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠ±ΡΡΠΌ ΠΏΠ°ΠΌΡΡΠΈ. Π Π°Π½ΠΎ ΠΈΠ»ΠΈ ΠΏΠΎΠ·Π΄Π½ΠΎ ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΊ ΠΎΡΠΈΠ±ΠΊΠ΅ ΠΏΠ΅ΡΠ΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΡΠ΅ΠΊΠ°.
ΠΠΎΡ ΠΊΠ°ΠΊ Haskell Π²ΡΡΠΈΡΠ»ΡΠ΅Ρ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ foldl (+) 0 [1,2,3]:
foldl (+) 0 [1,2,3] =
foldl (+) (0 + 1) [2,3] =
foldl (+) ((0 + 1) + 2) [3] =
foldl (+) (((0 + 1) + 2) + 3) [] =
((0 + 1) + 2) + 3 =
(1+2) + 3 =
3 + 3 =
6
ΠΠ΄Π΅ΡΡ Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΎ ΡΠ½Π°ΡΠ°Π»Π° ΡΡΡΠΎΠΈΡΡΡ Π±ΠΎΠ»ΡΡΠΎΠΉ ΡΡΠ΅ΠΊ ΠΈΠ· ΠΎΡΠ»ΠΎΠΆΠ΅Π½Π½ΡΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ. ΠΠ°ΡΠ΅ΠΌ, ΠΏΠΎ Π΄ΠΎΡΡΠΈΠΆΠ΅Π½ΠΈΠΈ ΠΊΠΎΠ½ΡΠ° ΡΠΏΠΈΡΠΊΠ°, Π½Π°ΡΠΈΠ½Π°ΡΡΡΡ ΡΠ΅Π°Π»ΡΠ½ΡΠ΅ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ. ΠΠ»Ρ ΠΌΠ°Π»Π΅Π½ΡΠΊΠΈΡ ΡΠΏΠΈΡΠΊΠΎΠ² Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π½Π΅Ρ, Π° Π²ΠΎΡ Π΅ΡΠ»ΠΈ ΡΠΏΠΈΡΠΎΠΊ Π³ΡΠΎΠΌΠ°Π΄Π½ΡΠΉ, Ρ ΠΌΠΈΠ»Π»ΠΈΠΎΠ½ΠΎΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ Π±ΠΎΠ»ΡΡΠ΅, Π²Ρ ΠΈ ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΡΠ΅ΠΊΠ°. ΠΠ΅Π»ΠΎ Π² ΡΠΎΠΌ, ΡΡΠΎ Π²ΡΠ΅ ΡΡΠΈ ΠΎΡΠ»ΠΎΠΆΠ΅Π½Π½ΡΠ΅ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΠΎ. ΠΡΠ»ΠΎ Π±Ρ Π½Π΅ΠΏΠ»ΠΎΡ ΠΎ, Π΅ΡΠ»ΠΈ Π±Ρ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π»Π° ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ Π½Π΅ ΠΎΡΠΊΠ»Π°Π΄ΡΠ²Π°Π΅Ρ, ΠΏΡΠ°Π²Π΄Π° ΠΆΠ΅? ΠΠ½Π° Π±Ρ ΡΠ°Π±ΠΎΡΠ°Π»Π° ΠΊΠ°ΠΊ-ΡΠΎ ΡΠ°ΠΊ:
foldl' (+) 0 [1,2,3] =
foldl' (+) 1 [2,3] =
foldl' (+) 3 [3] =
foldl (+) 6 [] =
6
ΠΡΡΠΈΡΠ»Π΅Π½ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ°Π³Π°ΠΌΠΈ ΡΠ²ΡΡΡΠΊΠΈ Π½Π΅ ΠΎΡΠΊΠ»Π°Π΄ΡΠ²Π°ΡΡΡΡ β ΠΎΠ½ΠΈ ΡΡΡ ΠΆΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ. ΠΡ ΡΡΠΎ ΠΆ, Π½Π°ΠΌ ΠΏΠΎΠ²Π΅Π·Π»ΠΎ: ΡΡΡΠΎΠ³Π°Ρ Π²Π΅ΡΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ foldl Π² ΠΌΠΎΠ΄ΡΠ»Π΅ Data.List Π΅ΡΡΡ, ΠΈ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ ΠΎΠ½Π° ΠΈΠΌΠ΅Π½Π½ΠΎ foldl'. ΠΠΎΠΏΡΠΎΠ±ΡΠ΅ΠΌ-ΠΊΠ° Ρ Π΅Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π²ΡΡΠΈΡΠ»ΠΈΡΡ ΡΡΠΌΠΌΡ ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Π° Π΅Π΄ΠΈΠ½ΠΈΡ:
ghci> foldl' (+) 0 (replicate 1000000 1)
1000000
ΠΠΎΡΡΡΡΠ°ΡΡΠΈΠΉ ΡΡΠΏΠ΅Ρ ! Π’Π°ΠΊ ΡΡΠΎ, Π΅ΡΠ»ΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ foldl, ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ ΠΎΡΠΈΠ±ΠΊΡ ΠΏΠ΅ΡΠ΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΡΠ΅ΠΊΠ°, ΠΏΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠΈΡΡΡΡ Π½Π° foldl'. ΠΡΡΠ°ΡΠΈ, Ρ foldl1 ΡΠΎΠΆΠ΅ Π΅ΡΡΡ ΡΡΡΠΎΠ³Π°Ρ Π²Π΅ΡΡΠΈΡ, ΠΎΠ½Π° Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ foldl1'.
ΠΠΎΠΈΡΠ΅ΠΌ ΡΠΈΡΠ»Π°
ΠΡ ΠΏΡΠΎΠ³ΡΠ»ΠΈΠ²Π°Π΅ΡΠ΅ΡΡ ΠΏΠΎ ΡΠ»ΠΈΡΠ΅, ΠΈ ΡΡΡ ΠΊ Π²Π°ΠΌ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ ΡΡΠ°ΡΡΡΠΊΠ° ΠΈ ΡΠΏΡΠ°ΡΠΈΠ²Π°Π΅Ρ: Β«ΠΡΠΎΡΡΠΈΡΠ΅, Π° ΠΊΠ°ΠΊΠΎΠ²ΠΎ ΠΏΠ΅ΡΠ²ΠΎΠ΅ Π½Π°ΡΡΡΠ°Π»ΡΠ½ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ, ΡΡΠΌΠΌΠ° ΡΠΈΡΡ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠ°Π²Π½Π° 40?Β»
ΠΡ ΡΡΠΎ, ΡΠ΄ΡΠ»ΠΈΡΡ? ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌ Haskell-ΠΌΠ°Π³ΠΈΡ ΠΈ Π½Π°ΠΉΠ΄ΡΠΌ ΡΡΠΎ ΡΠΈΡΠ»ΠΎ. ΠΡΠ»ΠΈ ΠΌΡ, ΠΊ ΠΏΡΠΈΠΌΠ΅ΡΡ, ΠΏΡΠΎΡΡΠΌΠΌΠΈΡΡΠ΅ΠΌ ΡΠΈΡΡΡ ΡΠΈΡΠ»Π° 123, ΡΠΎ ΠΏΠΎΠ»ΡΡΠΈΠΌ 6. Π£ ΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΆΠ΅ ΡΠΈΡΠ»Π° ΡΠΎΠ³Π΄Π° ΡΡΠΌΠΌΠ° ΡΠΈΡΡ ΡΠ°Π²Π½Π° 40?
ΠΠ΅ΡΠ²ΡΠΌ Π΄Π΅Π»ΠΎΠΌ Π½Π°ΠΏΠΈΡΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΡΠΈΡΠ°Π΅Ρ ΡΡΠΌΠΌΡ ΡΠΈΡΡ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΠΈΡΠ»Π°. ΠΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ ΠΈΡΡΡΠΉ ΡΡΡΠΊ! ΠΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ show ΠΈ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅ΠΌ Π½Π°ΡΠ΅ ΡΠΈΡΠ»ΠΎ Π² ΡΡΡΠΎΠΊΡ. ΠΠΎΠ³Π΄Π° Ρ Π½Π°Ρ Π±ΡΠ΄Π΅Ρ ΡΡΡΠΎΠΊΠ° ΠΈΠ· ΡΠΈΡΡ, ΠΌΡ ΠΏΠ΅ΡΠ΅Π²Π΅Π΄ΡΠΌ ΠΊΠ°ΠΆΠ΄ΡΠΉ Π΅Ρ ΡΠΈΠΌΠ²ΠΎΠ» Π² ΡΠΈΡΠ»ΠΎ ΠΈ ΠΏΡΠΎΡΡΠΌΠΌΠΈΡΡΠ΅ΠΌ ΠΏΠΎΠ»ΡΡΠΈΠ²ΡΠΈΠΉΡΡ ΡΠΈΡΠ»ΠΎΠ²ΠΎΠΉ ΡΠΏΠΈΡΠΎΠΊ. ΠΡΠ΅Π²ΡΠ°ΡΠ°ΡΡ ΡΠΈΠΌΠ²ΠΎΠ» Π² ΡΠΈΡΠ»ΠΎ Π±ΡΠ΄Π΅ΠΌ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ digitToInt ΠΈΠ· ΠΌΠΎΠ΄ΡΠ»Ρ Data.Char. ΠΠ½Π° ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΈΠΏΠ° Char ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Int:
ghci> digitToInt '2'
2
ghci> digitToInt 'F'
15
ghci> digitToInt 'z'
*** Exception: Char.digitToInt: not a digit 'z'
Π€ΡΠ½ΠΊΡΠΈΡ digitToInt ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ ΡΠΈΠΌΠ²ΠΎΠ»Π°ΠΌΠΈ ΠΈΠ· Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° ΠΎΡ '0' Π΄ΠΎ '9' ΠΈ ΠΎΡ 'A' Π΄ΠΎ 'F' (ΡΠ°ΠΊΠΆΠ΅ ΠΈ ΡΡΡΠΎΡΠ½ΡΠΌΠΈ).
ΠΠΎΡ ΡΡΠ½ΠΊΡΠΈΡ, ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡΠ°Ρ ΡΠΈΡΠ»ΠΎ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΠ°Ρ ΡΡΠΌΠΌΡ Π΅Π³ΠΎ ΡΠΈΡΡ:
import Data.Char
import Data.List
digitSum :: Int -> Int
digitSum = sum . map digitToInt . show
ΠΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅ΠΌ Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ Π² ΡΡΡΠΎΠΊΡ, ΠΏΡΠΎΠΉΠ΄ΡΠΌΡΡ ΠΏΠΎ ΡΡΡΠΎΠΊΠ΅ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ digitToInt, ΡΡΠΌΠΌΠΈΡΡΠ΅ΠΌ ΠΏΠΎΠ»ΡΡΠΈΠ²ΡΠΈΠΉΡΡ ΡΠΈΡΠ»ΠΎΠ²ΠΎΠΉ ΡΠΏΠΈΡΠΎΠΊ.
Π’Π΅ΠΏΠ΅ΡΡ Π½ΡΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ ΠΏΠ΅ΡΠ²ΠΎΠ΅ Π½Π°ΡΡΡΠ°Π»ΡΠ½ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ, ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠ² ΠΊ ΠΊΠΎΡΠΎΡΠΎΠΌΡ ΡΡΠ½ΠΊΡΠΈΡ digitSum ΠΌΡ ΠΏΠΎΠ»ΡΡΠΈΠΌ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ° ΡΠΈΡΠ»ΠΎ 40. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ find ΠΈΠ· ΠΌΠΎΠ΄ΡΠ»Ρ Data.List. ΠΠ½Π° ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΠΏΡΠ΅Π΄ΠΈΠΊΠ°Ρ ΠΈ ΡΠΏΠΈΡΠΎΠΊ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΡΠΏΠΈΡΠΊΠ°, ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΡΡΡΠΈΠΉ ΠΏΡΠ΅Π΄ΠΈΠΊΠ°ΡΡ. ΠΡΠ°Π²Π΄Π°, ΡΠΈΠΏ Ρ Π½Π΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π½Π΅ΠΎΠ±ΡΡΠ½ΡΠΉ:
ghci> :t find
find :: (a -> Bool) -> [a] -> Maybe a
ΠΠ΅ΡΠ²ΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ β ΠΏΡΠ΅Π΄ΠΈΠΊΠ°Ρ, Π²ΡΠΎΡΠΎΠΉ β ΡΠΏΠΈΡΠΎΠΊ, Ρ ΡΡΠΈΠΌ Π²ΡΡ ΡΡΠ½ΠΎ. ΠΠΎ ΡΡΠΎ Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ? Π§ΡΠΎ ΡΡΠΎ Π·Π° Maybe a? ΠΡΠΎ ΡΠΈΠΏ, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π°ΠΌ Π΄ΠΎ ΡΠΈΡ ΠΏΠΎΡ Π½Π΅ Π²ΡΡΡΠ΅ΡΠ°Π»ΡΡ. ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ Ρ ΡΠΈΠΏΠΎΠΌ Maybe a Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΡ ΠΎΠΆΠ΅ Π½Π° ΡΠΏΠΈΡΠΎΠΊ ΡΠΈΠΏΠ° [a]. ΠΡΠ»ΠΈ ΡΠΏΠΈΡΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ Π½ΠΎΠ»Ρ, ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ², ΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΈΠΏΠ° Maybe a ΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ Π»ΠΈΠ±ΠΎ Π½ΠΎΠ»Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ², Π»ΠΈΠ±ΠΎ Π² ΡΠΎΡΠ½ΠΎΡΡΠΈ ΠΎΠ΄ΠΈΠ½. ΠΡΡ ΡΡΡΠΊΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ, Π΅ΡΠ»ΠΈ ΠΌΡ Ρ ΠΎΡΠΈΠΌ ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΡΠΎΠ²Π°Π»Π°. ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ, β Nothing. ΠΠ½ΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ ΠΏΡΡΡΠΎΠΌΡ ΡΠΏΠΈΡΠΊΡ. ΠΠ»Ρ ΠΊΠΎΠ½ΡΡΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΡΠΎ-ΡΠΎ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ, ΡΠΊΠ°ΠΆΠ΅ΠΌ, ΡΡΡΠΎΠΊΡ "ΡΠΉ", Π±ΡΠ΄Π΅ΠΌ ΠΏΠΈΡΠ°ΡΡ Just "ΡΠΉ". ΠΠΎΡ ΠΊΠ°ΠΊ Π²ΡΡ ΡΡΠΎ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ:
ghci> Nothing
Nothing
ghci> Just "ΡΠΉ"
Just "ΡΠΉ"
ghci> Just 3
Just 3
ghci> :t Just "ΡΠΉ"
Just "ΡΠΉ" :: Maybe [Char]
ghci> :t Just True
Just True :: Maybe Bool
ΠΠΈΠ΄ΠΈΡΠ΅, Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Just True ΠΈΠΌΠ΅Π΅Ρ ΡΠΈΠΏ Maybe Bool. ΠΠΎΡ ΠΎΠΆΠ΅ Π½Π° ΡΠΎ, ΡΡΠΎ ΡΠΏΠΈΡΠΎΠΊ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠΈΠΏΠ° Bool, ΠΈΠΌΠ΅Π΅Ρ ΡΠΈΠΏ [Bool].
ΠΡΠ»ΠΈ ΡΡΠ½ΠΊΡΠΈΡ find Π½Π°Ρ ΠΎΠ΄ΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½Ρ, ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΡΡΡΠΈΠΉ ΠΏΡΠ΅Π΄ΠΈΠΊΠ°ΡΡ, ΠΎΠ½Π° Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΡΠΎΡ ΡΠ»Π΅ΠΌΠ΅Π½Ρ, ΠΎΠ±ΡΡΠ½ΡΡΡΠΉ Π² Just. ΠΡΠ»ΠΈ Π½Π΅ Π½Π°Ρ ΠΎΠ΄ΠΈΡ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Nothing:
ghci> find (>4) [3,4,5,6,7]
Just 5
ghci> find odd [2,4,6,8,9]
Just 9
ghci> find (=='x') "ΠΌΠ΅Ρ-ΠΊΠ»Π°Π΄Π΅Π½Π΅Ρ"
Nothing
ΠΠ΅ΡΠ½ΡΠΌΡΡ ΡΠ΅ΠΏΠ΅ΡΡ ΠΊ Π½Π°ΡΠ΅ΠΉ Π·Π°Π΄Π°ΡΠ΅. ΠΡ ΡΠΆΠ΅ Π½Π°ΠΏΠΈΡΠ°Π»ΠΈ ΡΡΠ½ΠΊΡΠΈΡ digitSum ΠΈ Π·Π½Π°Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΎΠ½Π° ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, ΡΠ°ΠΊ ΡΡΠΎ ΠΏΡΠΈΡΠ»Π° ΠΏΠΎΡΠ° ΡΠΎΠ±ΡΠ°ΡΡ Π²ΡΡ Π²ΠΌΠ΅ΡΡΠ΅. ΠΠ°ΠΏΠΎΠΌΠ½Ρ, ΡΡΠΎ ΠΌΡ Ρ ΠΎΡΠΈΠΌ Π½Π°ΠΉΡΠΈ ΡΠΈΡΠ»ΠΎ, ΡΡΠΌΠΌΠ° ΡΠΈΡΡ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠ°Π²Π½Π° 40.
firstTo40 :: Maybe Int
firstTo40 = find (\x -> digitSum == 40) [1..]
ΠΡ ΠΏΡΠΎΡΡΠΎ Π²Π·ΡΠ»ΠΈ Π±Π΅ΡΠΊΠΎΠ½Π΅ΡΠ½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ [1..] ΠΈ Π½Π°ΡΠ°Π»ΠΈ ΠΈΡΠΊΠ°ΡΡ ΠΏΠ΅ΡΠ²ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ, Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ digitSum Π΄Π»Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠ°Π²Π½ΠΎ 40.
ghci> firstTo40
Just 49999
Π Π²ΠΎΡ ΠΈ ΠΎΡΠ²Π΅Ρ! ΠΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠΎΠΉ Π½ΡΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ ΠΈΡΠΊΠΎΠΌΡΡ ΡΡΠΌΠΌΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°:
firstTo :: Int -> Maybe Int
firstTo n = find (\x -> digitSum x == n) [1..]
Π Π½Π΅Π±ΠΎΠ»ΡΡΠ°Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°:
ghci> firstTo 27
Just 999
ghci> firstTo 1
Just 1
ghci> firstTo 13
Just 49
ΠΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠ»ΡΡΠ΅ΠΉ Π½Π° Π·Π½Π°ΡΠ΅Π½ΠΈΡ
ΠΠ°ΡΠ°ΡΡΡΡ, ΡΠ°Π±ΠΎΡΠ°Ρ Ρ Π΄Π°Π½Π½ΡΠΌΠΈ ΠΈΠ· Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡΠ°, ΠΌΡ ΡΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΠΎ Π½Π΅ Π·Π°Π±ΠΎΡΠΈΠΌΡΡ, Π² ΠΊΠ°ΠΊΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅ ΠΎΠ½ΠΈ ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Ρ. ΠΡ ΠΏΡΠΎΡΡΠΎ Ρ ΠΎΡΠΈΠΌ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΊ Π½ΠΈΠΌ Π΄ΠΎΡΡΡΠΏ ΠΏΠΎ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠΌΡ ΠΊΠ»ΡΡΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΆΠ΅Π»Π°Ρ ΡΠ·Π½Π°ΡΡ, ΠΊΡΠΎ ΠΆΠΈΠ²ΡΡ ΠΏΠΎ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎΠΌΡ Π°Π΄ΡΠ΅ΡΡ, ΠΌΡ ΠΈΡΠ΅ΠΌ ΠΈΠΌΠ΅Π½Π° ΡΠ΅Ρ , ΠΊΡΠΎ ΠΏΠΎ ΡΡΠΎΠΌΡ Π°Π΄ΡΠ΅ΡΡ ΠΏΡΠΎΠΆΠΈΠ²Π°Π΅Ρ. Π ΠΎΠ±ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΌΡ Π³ΠΎΠ²ΠΎΡΠΈΠΌ, ΡΡΠΎ ΠΈΡΠ΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ (ΡΡΡ-Π»ΠΈΠ±ΠΎ ΠΈΠΌΡ) ΠΏΠΎ ΠΊΠ»ΡΡΡ (Π°Π΄ΡΠ΅Ρ ΡΡΠΎΠ³ΠΎ ΡΠ΅Π»ΠΎΠ²Π΅ΠΊΠ°).
ΠΠΎΡΡΠΈ Ρ ΠΎΡΠΎΡΠΎ: Π°ΡΡΠΎΡΠΈΠ°ΡΠΈΠ²Π½ΡΠ΅ ΡΠΏΠΈΡΠΊΠΈ
Π‘ΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² ΠΏΠΎΡΡΡΠΎΠΈΡΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Β«ΠΊΠ»ΡΡβΠ·Π½Π°ΡΠ΅Π½ΠΈΠ΅Β». ΠΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΡ β Π°ΡΡΠΎΡΠΈΠ°ΡΠΈΠ²Π½ΡΠ΅ ΡΠΏΠΈΡΠΊΠΈ. ΠΡΡΠΎΡΠΈΠ°ΡΠΈΠ²Π½ΡΠ΅ ΡΠΏΠΈΡΠΊΠΈ (ΡΠ°ΠΊΠΆΠ΅ Π½Π°Π·ΡΠ²Π°Π΅ΠΌΡΠ΅ ΡΠ»ΠΎΠ²Π°ΡΡΠΌΠΈ ΠΈΠ»ΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡΠΌΠΈ) β ΡΡΠΎ ΡΠΏΠΈΡΠΊΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Ρ ΡΠ°Π½ΡΡ Π½Π΅ΡΠΏΠΎΡΡΠ΄ΠΎΡΠ΅Π½Π½ΡΠ΅ ΠΏΠ°ΡΡ Β«ΠΊΠ»ΡΡβΠ·Π½Π°ΡΠ΅Π½ΠΈΠ΅Β». ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ Π°ΡΡΠΎΡΠΈΠ°ΡΠΈΠ²Π½ΡΠ΅ ΡΠΏΠΈΡΠΊΠΈ Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΡΠ΅Π»Π΅ΡΠΎΠ½Π½ΡΡ Π½ΠΎΠΌΠ΅ΡΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠ΅Π»Π΅ΡΠΎΠ½Π½ΡΠΉ Π½ΠΎΠΌΠ΅Ρ ΠΊΠ°ΠΊ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈ ΠΈΠΌΡ ΡΠ΅Π»ΠΎΠ²Π΅ΠΊΠ° ΠΊΠ°ΠΊ ΠΊΠ»ΡΡ. ΠΠ°ΠΌ Π½Π΅Π²Π°ΠΆΠ½ΠΎ, Π² ΠΊΠ°ΠΊΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅ ΠΎΠ½ΠΈ ΡΠΎΡ ΡΠ°Π½Π΅Π½Ρ: Π²ΡΡ, ΡΡΠΎ Π½Π°ΠΌ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ, β ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠ΅Π»Π΅ΡΠΎΠ½Π½ΡΠΉ Π½ΠΎΠΌΠ΅Ρ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ. ΠΠ°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΡΠΎΡΡΠΎΠΉ ΡΠΏΠΎΡΠΎΠ± ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΡ Π°ΡΡΠΎΡΠΈΠ°ΡΠΈΠ²Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ Π² ΡΠ·ΡΠΊΠ΅ Haskell β ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΏΠΈΡΠΎΠΊ ΠΏΠ°Ρ. ΠΠ΅ΡΠ²ΡΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΠΏΠ°ΡΡ Π±ΡΠ΄Π΅Ρ ΠΊΠ»ΡΡΠΎΠΌ, Π²ΡΠΎΡΠΎΠΉ β Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ. ΠΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ Π°ΡΡΠΎΡΠΈΠ°ΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΡΠΏΠΈΡΠΊΠ° Ρ Π½ΠΎΠΌΠ΅ΡΠ°ΠΌΠΈ ΡΠ΅Π»Π΅ΡΠΎΠ½ΠΎΠ²:
phoneBook =
[("ΠΎΠ»Ρ","555β29-38")
,("ΠΆΠ΅Π½Ρ","452β29-28")
,("ΠΊΠ°ΡΡ","493β29-28")
,("ΠΌΠ°ΡΠ°","205β29-28")
,("Π½Π°Π΄Ρ","939β82-82")
,("ΡΠ»Ρ","853β24-92")
]
ΠΠ° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΡΡΠ°Π½Π½ΠΎΠ³ΠΎ Π²ΡΡΠ°Π²Π½ΠΈΠ²Π°Π½ΠΈΡ, ΡΡΠΎ ΠΏΡΠΎΡΡΠΎ ΡΠΏΠΈΡΠΎΠΊ, ΡΠΎΡΡΠΎΡΡΠΈΠΉ ΠΈΠ· ΠΏΠ°Ρ ΡΡΡΠΎΠΊ. Π‘Π°ΠΌΠ°Ρ ΡΠ°ΡΡΠ°Ρ Π·Π°Π΄Π°ΡΠ° ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Π°ΡΡΠΎΡΠΈΠ°ΡΠΈΠ²Π½ΡΡ ΡΠΏΠΈΡΠΊΠΎΠ² β ΠΏΠΎΠΈΡΠΊ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠΎ ΠΊΠ»ΡΡΡ. ΠΠ°Π²Π°ΠΉΡΠ΅ Π½Π°ΠΏΠΈΡΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΡΡΠΎΠΉ Π·Π°Π΄Π°ΡΠΈ.
findKey :: (Eq k) => k β> [(k,v)] β> v
findKey key xs = snd . head $ filter (\(k,v) β> key == k) xs
ΠΡΡ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΠΏΡΠΎΡΡΠΎ. Π€ΡΠ½ΠΊΡΠΈΡ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΠΊΠ»ΡΡ ΠΈ ΡΠΏΠΈΡΠΎΠΊ, ΡΠΈΠ»ΡΡΡΡΠ΅Ρ ΡΠΏΠΈΡΠΎΠΊ ΡΠ°ΠΊ, ΡΡΠΎ ΠΎΡΡΠ°ΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡΡΠΈΠ΅ ΠΊΠ»ΡΡΠΈ, ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΠΏΠ΅ΡΠ²ΡΡ ΠΏΠ°ΡΡ Β«ΠΊΠ»ΡΡβΠ·Π½Π°ΡΠ΅Π½ΠΈΠ΅Β», Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅. ΠΠΎ ΡΡΠΎ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΠ΄ΡΡ, Π΅ΡΠ»ΠΈ ΠΈΡΠΊΠΎΠΌΠΎΠ³ΠΎ ΠΊΠ»ΡΡΠ° Π½Π΅Ρ Π² ΡΠΏΠΈΡΠΊΠ΅? Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΏΡΡΠ°ΡΡΡΡ ΠΏΠΎΠ»ΡΡΠΈΡΡ Β«Π³ΠΎΠ»ΠΎΠ²ΡΒ» ΠΏΡΡΡΠΎΠ³ΠΎ ΡΠΏΠΈΡΠΊΠ°, ΡΡΠΎ Π²ΡΠ·ΠΎΠ²Π΅Ρ ΠΎΡΠΈΠ±ΠΊΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ. ΠΠ΄Π½Π°ΠΊΠΎ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΡΡΡΠ΅ΠΌΠΈΡΡΡΡ ΠΊ ΡΠΎΠΌΡ, ΡΡΠΎΠ±Ρ Π½Π°ΡΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π±ΡΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΡΡΡΠΎΠΉΡΠΈΠ²ΡΠΌΠΈ ΠΊ Β«ΠΏΠ°Π΄Π΅Π½ΠΈΡΠΌΒ», ΠΏΠΎΡΡΠΎΠΌΡ Π΄Π°Π²Π°ΠΉΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΠΈΠΏ Maybe. ΠΡΠ»ΠΈ ΠΌΡ Π½Π΅ Π½Π°ΠΉΠ΄ΡΠΌ ΠΊΠ»ΡΡΠ°, ΡΠΎ Π²Π΅ΡΠ½ΡΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Nothing. ΠΡΠ»ΠΈ Π½Π°ΠΉΠ΄ΡΠΌ, Π±ΡΠ΄Π΅ΠΌ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ Just <ΡΠΎ, ΡΡΠΎ Π½Π°ΡΠ»ΠΈ>.