findKey :: (Eq k) => k β> [(k,v)] β> Maybe v
findKey key [] = Nothing
findKey key ((k,v):xs)
| key == k = Just v
| otherwise = findKey key xs
ΠΠΎΡΠΌΠΎΡΡΠΈΡΠ΅ Π½Π° Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΡ ΡΠΈΠΏΠ°. Π€ΡΠ½ΠΊΡΠΈΡ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΠΊΠ»ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ Π½Π° ΡΠ°Π²Π΅Π½ΡΡΠ²ΠΎ (Eq), ΠΈ Π°ΡΡΠΎΡΠΈΠ°ΡΠΈΠ²Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ, Π° Π·Π°ΡΠ΅ΠΌ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅. ΠΡΠ³Π»ΡΠ΄ΠΈΡ ΠΏΡΠ°Π²Π΄ΠΎΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ.
ΠΡΠΎ ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ, ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΠ°Ρ ΡΠΏΠΈΡΠΎΠΊ. ΠΠ°Π·ΠΎΠ²ΡΠΉ ΡΠ»ΡΡΠ°ΠΉ, ΡΠ°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅ ΡΠΏΠΈΡΠΊΠ° Π½Π° Β«Π³ΠΎΠ»ΠΎΠ²ΡΒ» ΠΈ Β«Ρ Π²ΠΎΡΡΒ», ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΡΠΉ Π²ΡΠ·ΠΎΠ² β Π²ΡΡ Π½Π° ΠΌΠ΅ΡΡΠ΅. Π’Π°ΠΊΠΆΠ΅ ΡΡΠΎ ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΡΠ°Π±Π»ΠΎΠ½ Π΄Π»Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΠ²ΡΡΡΠΊΠΈ. ΠΠΎΡΠΌΠΎΡΡΠΈΠΌ, ΠΊΠ°ΠΊ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ²ΡΡΡΠΊΠΈ.
findKey :: (Eq k) => k β> [(k,v)] β> Maybe v
findKey key = foldr (\(k,v) acc β> if key == k then Just v else acc) Nothing
ΠΠ ΠΠΠΠ§ΠΠΠΠ. ΠΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, Π»ΡΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ²ΡΡΡΠΊΠΈ Π΄Π»Ρ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΡΡ ΠΎΠ±Ρ ΠΎΠ΄ΠΎΠ² ΡΠΏΠΈΡΠΊΠ° Π²ΠΌΠ΅ΡΡΠΎ ΡΠ²Π½ΠΎΠ³ΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΡΠ²ΡΡΡΠΊΠΈ Π»Π΅Π³ΡΠ΅ ΡΠΈΡΠ°ΡΡΡΡ ΠΈ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡΡΡΡ. ΠΡΠ±ΠΎΠΉ ΡΠ΅Π»ΠΎΠ²Π΅ΠΊ Π΄ΠΎΠ³Π°Π΄Π°Π΅ΡΡΡ, ΡΡΠΎ ΡΡΠΎ ΡΠ²ΡΡΡΠΊΠ°, ΠΊΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ²ΠΈΠ΄ΠΈΡ Π²ΡΠ·ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΈ foldr β ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π±ΠΎΠ»ΡΡΠ΅ ΠΈΠ½ΡΠ΅Π»Π»Π΅ΠΊΡΡΠ°Π»ΡΠ½ΡΡ ΡΡΠΈΠ»ΠΈΠΉ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΡΠ°ΡΠΏΠΎΠ·Π½Π°ΡΡ ΡΠ²Π½ΠΎ Π½Π°ΠΏΠΈΡΠ°Π½Π½ΡΡ ΡΠ΅ΠΊΡΡΡΠΈΡ.
ghci> findKey "ΡΠ»Ρ" phoneBook
Just "853β24-92"
ghci> findKey "ΠΎΠ»Ρ" phoneBook
Just "555β29-38"
ghci> findKey "Π°Π½Ρ" phoneBook
Nothing
ΠΡΠ»ΠΈΡΠ½ΠΎ, ΡΠ°Π±ΠΎΡΠ°Π΅Ρ! ΠΡΠ»ΠΈ Ρ Π½Π°Ρ Π΅ΡΡΡ ΡΠ΅Π»Π΅ΡΠΎΠ½Π½ΡΠΉ Π½ΠΎΠΌΠ΅Ρ Π΄Π΅Π²ΡΡΠΊΠΈ, ΠΌΡ ΠΏΡΠΎΡΡΠΎ (Just) ΠΏΠΎΠ»ΡΡΠΈΠΌ Π½ΠΎΠΌΠ΅Ρ; Π² ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π½Π΅ ΠΏΠΎΠ»ΡΡΠΈΠΌ Π½ΠΈΡΠ΅Π³ΠΎ (Nothing).
ΠΠΎΠ΄ΡΠ»Ρ Data.Map
ΠΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ ΡΡΠ½ΠΊΡΠΈΡ lookup ΠΈΠ· ΠΌΠΎΠ΄ΡΠ»Ρ Data.List. ΠΡΠ»ΠΈ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π΅ ΠΊΠ»ΡΡΡ, ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ ΠΎΠ±ΠΎΠΉΡΠΈ Π²ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΡΠΏΠΈΡΠΊΠ°, ΠΏΠΎΠΊΠ° ΠΌΡ Π΅Π³ΠΎ Π½Π΅ Π½Π°ΠΉΠ΄ΡΠΌ.
ΠΠΎΠ΄ΡΠ»Ρ Data.Map ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅Ρ Π°ΡΡΠΎΡΠΈΠ°ΡΠΈΠ²Π½ΡΠ΅ ΡΠΏΠΈΡΠΊΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π±ΡΡΡΡΠ΅Π΅ (ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ½ΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π΄Π΅ΡΠ΅Π²ΡΠ΅Π²), Π° ΡΠ°ΠΊΠΆΠ΅ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ. ΠΠ°ΡΠΈΠ½Π°Ρ Ρ ΡΡΠΎΠ³ΠΎ ΠΌΠΎΠΌΠ΅Π½ΡΠ° ΠΌΡ Π±ΡΠ΄Π΅ΠΌ Π³ΠΎΠ²ΠΎΡΠΈΡΡ, ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅ΠΌ Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡΠΌΠΈ Π²ΠΌΠ΅ΡΡΠΎ Π°ΡΡΠΎΡΠΈΠ°ΡΠΈΠ²Π½ΡΡ ΡΠΏΠΈΡΠΊΠΎΠ².
Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΠΎΠ΄ΡΠ»Ρ Data.Map ΡΠΊΡΠΏΠΎΡΡΠΈΡΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΡΡΡΠΈΠ΅ Ρ ΠΌΠΎΠ΄ΡΠ»ΡΠΌΠΈ Prelude ΠΈ Data.List, ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΈΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠ²Π°Π»ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΈΠΌΠΏΠΎΡΡΠ°.
import qualified Data.Map as Map
ΠΠΎΠΌΠ΅ΡΡΠΈΡΠ΅ ΡΡΠΎΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ Π² ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ ΠΈ Π·Π°Π³ΡΡΠ·ΠΈΡΠ΅ Π΅Π³ΠΎ Π² GHCi. ΠΡ Π±ΡΠ΄Π΅ΠΌ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²ΡΠ²Π°ΡΡ Π°ΡΡΠΎΡΠΈΠ°ΡΠΈΠ²Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ Π² ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ fromList ΠΈΠ· ΠΌΠΎΠ΄ΡΠ»Ρ Data.Map. Π€ΡΠ½ΠΊΡΠΈΡ fromList ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π°ΡΡΠΎΡΠΈΠ°ΡΠΈΠ²Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ (Π² ΡΠΎΡΠΌΠ΅ ΡΠΏΠΈΡΠΊΠ°) ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Ρ ΡΠ΅ΠΌΠΈ ΠΆΠ΅ Π°ΡΡΠΎΡΠΈΠ°ΡΠΈΡΠΌΠΈ. ΠΠ΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠΈΠ³ΡΠ°Π΅ΠΌ:
ghci> Map.fromList [(3, "ΡΡΡΠ»ΠΈ"),(4,"Π΄Π΅ΡΠ΅Π²ΡΡ"),(9,"ΠΏΡΡΠ»Ρ")]
fromList [(3, "ΡΡΡΠ»ΠΈ"),(4,"Π΄Π΅ΡΠ΅Π²ΡΡ"),(9,"ΠΏΡΡΠ»Ρ")]
ghci> Map.fromList [("ΡΡΠΈΠΊ","ΡΠΎΡΠΌΠ°Π½"),("ΡΠΎΠ±Π΅ΡΡ","ΡΠ΅ΠΉΠ·"),("ΠΊΡΠΈΡ", "ΡΠ°ΡΠ±")]
fromList [("ΠΊΡΠΈΡ","ΡΠ°ΡΠ±"),("ΡΠΎΠ±Π΅ΡΡ","ΡΠ΅ΠΉΠ·"),("ΡΡΠΈΠΊ","ΡΠΎΡΠΌΠ°Π½")]
ΠΠΎΠ³Π΄Π° ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ· ΠΌΠΎΠ΄ΡΠ»Ρ Data.Map ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ Π² ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ, ΡΠ½Π°ΡΠ°Π»Π° Π²ΡΠ²ΠΎΠ΄ΠΈΡΡΡ fromList, Π° Π·Π°ΡΠ΅ΠΌ Π°ΡΡΠΎΡΠΈΠ°ΡΠΈΠ²Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡΠΈΠΉ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅.
ΠΡΠ»ΠΈ Π² ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΌ ΡΠΏΠΈΡΠΊΠ΅ Π΅ΡΡΡ Π΄ΡΠ±Π»ΠΈΠΊΠ°ΡΡ ΠΊΠ»ΡΡΠ΅ΠΉ, ΠΎΠ½ΠΈ ΠΎΡΠ±ΡΠ°ΡΡΠ²Π°ΡΡΡΡ:
ghci> Map.fromList [("MS",1),("MS",2),("MS",3)]
fromList [("MS",3)]
ΠΠΎΡ ΡΠΈΠ³Π½Π°ΡΡΡΠ° ΡΡΠ½ΠΊΡΠΈΠΈ fromList:
Map.fromList :: (Ord k) => [(k, v)] β> Map.Map k v
ΠΠ½Π° Π³ΠΎΠ²ΠΎΡΠΈΡ, ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΡΠΏΠΈΡΠΎΠΊ ΠΏΠ°Ρ ΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ ΡΠΈΠΏΠ° k ΠΈ v ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ ΠΊΠ»ΡΡΠΈ ΡΠΈΠΏΠ° k Π² Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠΈΠΏΠ° v. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ Π΅ΡΠ»ΠΈ ΠΌΡ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΠΌ Π°ΡΡΠΎΡΠΈΠ°ΡΠΈΠ²Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΎΠ±ΡΡΠ½ΠΎΠ³ΠΎ ΡΠΏΠΈΡΠΊΠ°, ΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΊΠ»ΡΡΠ΅ΠΉ Π΄ΠΎΠ»ΠΆΠ½Ρ Π»ΠΈΡΡ ΡΠΌΠ΅ΡΡ ΡΡΠ°Π²Π½ΠΈΠ²Π°ΡΡΡΡ (ΠΈΠΌΠ΅ΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠ»Π°ΡΡΠ° ΡΠΈΠΏΠΎΠ² Eq); ΡΠ΅ΠΏΠ΅ΡΡ ΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΈΡ ΡΠΏΠΎΡΡΠ΄ΠΎΡΠΈΡΡ (ΠΊΠ»Π°ΡΡ ΡΠΈΠΏΠΎΠ² Ord). ΠΡΠΎ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠ΄ΡΠ»Ρ Data.Map. Π£ΠΏΠΎΡΡΠ΄ΠΎΡΠΈΠ²Π°Π΅ΠΌΡΠ΅ ΠΊΠ»ΡΡΠΈ Π½ΡΠΆΠ½Ρ Π΅ΠΌΡ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΡΠ°Π·ΠΌΠ΅ΡΠ°ΡΡ Π΄Π°Π½Π½ΡΠ΅ Π±ΠΎΠ»Π΅Π΅ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ.
Π’Π΅ΠΏΠ΅ΡΡ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°ΡΡ Π½Π°Ρ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ Π°ΡΡΠΎΡΠΈΠ°ΡΠΈΠ²Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ phoneBook Π² ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅. ΠΠ°ΠΎΠ΄Π½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΡΠΈΠ³Π½Π°ΡΡΡΡ:
import qualified Data.Map as Map
phoneBook :: Map.Map String String
phoneBook = Map.fromList $
[("ΠΎΠ»Ρ","555β29-38")
,("ΠΆΠ΅Π½Ρ","452β29-28")
,("ΠΊΠ°ΡΡ","493β29-28")
,("ΠΌΠ°ΡΠ°","205β29-28")
,("Π½Π°Π΄Ρ","939β82-82")
,("ΡΠ»Ρ","853β24-92")
]
ΠΡΠ»ΠΈΡΠ½ΠΎ. ΠΠ°Π³ΡΡΠ·ΠΈΠΌ ΡΡΠΎΡ ΡΡΠ΅Π½Π°ΡΠΈΠΉ Π² GHCi ΠΈ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠΈΠ³ΡΠ°Π΅ΠΌ Ρ ΡΠ΅Π»Π΅ΡΠΎΠ½Π½ΠΎΠΉ ΠΊΠ½ΠΈΠΆΠΊΠΎΠΉ. ΠΠΎ-ΠΏΠ΅ΡΠ²ΡΡ , Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ lookup ΠΈ ΠΏΠΎΠΈΡΠ΅ΠΌ ΠΊΠ°ΠΊΠΈΠ΅-Π½ΠΈΠ±ΡΠ΄Ρ Π½ΠΎΠΌΠ΅ΡΠ°. Π€ΡΠ½ΠΊΡΠΈΡ lookup ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΠΊΠ»ΡΡ ΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈ ΠΏΡΡΠ°Π΅ΡΡΡ Π½Π°ΠΉΡΠΈ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π΅ ΠΊΠ»ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅. ΠΡΠ»ΠΈ Π²ΡΡ ΠΏΡΠΎΡΠ»ΠΎ ΡΠ΄Π°ΡΠ½ΠΎ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ ΠΎΠ±ΡΡΠ½ΡΡΠΎΠ΅ Π² Just Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅; Π² ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ β Nothing:
ghci> :t Map.lookup
Map.lookup :: (Ord k) => k -> Map.Map k a -> Maybe a
ghci> Map.lookup "ΠΎΠ»Ρ" phoneBook
Just "555-29-38"
ghci> Map.lookup "Π½Π°Π΄Ρ" phoneBook
Just "939-82-82"
ghci> Map.lookup "ΡΠ°Π½Ρ" phoneBook
Nothing
Π‘Π»Π΅Π΄ΡΡΡΠΈΠΉ ΡΡΡΠΊ: ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π½ΠΎΠ²ΠΎΠ΅ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅, Π΄ΠΎΠ±Π°Π²ΠΈΠ² Π² ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ΅ Π½ΠΎΠ²ΡΠΉ Π½ΠΎΠΌΠ΅Ρ. Π€ΡΠ½ΠΊΡΠΈΡ insert ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΠΊΠ»ΡΡ, Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π½ΠΎΠ²ΠΎΠ΅ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ β ΠΏΠΎΡΡΠΈ ΡΠ°ΠΊΠΎΠ΅ ΠΆΠ΅, ΡΡΠΎ ΠΈ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ΅, Π½ΠΎ Ρ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½ΡΠΌΠΈ ΠΊΠ»ΡΡΠΎΠΌ ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ:
ghci> :t Map.insert
Map.insert :: (Ord k) => k -> a -> Map.Map k a -> Map.Map k a
ghci> Map.lookup "ΡΠ°Π½Ρ" phoneBook
Nothing
ghci> let newBook = Map.insert "ΡΠ°Π½Ρ" "341-90-21" phoneBook
ghci> Map.lookup "ΡΠ°Π½Ρ" newBook
Just "341-90-21"
ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΡΡΠΈΡΠ°Π΅ΠΌ, ΡΠΊΠΎΠ»ΡΠΊΠΎ Ρ Π½Π°Ρ ΡΠ΅Π»Π΅ΡΠΎΠ½Π½ΡΡ Π½ΠΎΠΌΠ΅ΡΠΎΠ². ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π½Π°ΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ size ΠΈΠ· ΠΌΠΎΠ΄ΡΠ»Ρ Data.Map. ΠΠ½Π° ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π΅Π³ΠΎ ΡΠ°Π·ΠΌΠ΅Ρ. Π’ΡΡ Π²ΡΡ ΡΡΠ½ΠΎ:
ghci> :t Map.size
Map.size :: Map.Map k a -> Int
ghci> Map.size phoneBook
6
ghci> Map.size newBook
7
ΠΠΎΠΌΠ΅ΡΠ° Π² Π½Π°ΡΠ΅ΠΉ ΡΠ΅Π»Π΅ΡΠΎΠ½Π½ΠΎΠΉ ΠΊΠ½ΠΈΠΆΠΊΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Ρ ΡΡΡΠΎΠΊΠ°ΠΌΠΈ. ΠΠΎΠΏΡΡΡΠΈΠΌ, ΠΌΡ Ρ ΠΎΡΠΈΠΌ Π²ΠΌΠ΅ΡΡΠΎ Π½ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΏΠΈΡΠΊΠΈ ΡΠΈΡΡ: ΡΠΎ Π΅ΡΡΡ Π²ΠΌΠ΅ΡΡΠΎ Π½ΠΎΠΌΠ΅ΡΠ° "939-82-82" β ΡΠΏΠΈΡΠΎΠΊ [9,3,9,8,2,8,2]. Π‘Π½Π°ΡΠ°Π»Π° Π½Π°ΠΏΠΈΡΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΡΡΡΡΡ ΡΠ΅Π»Π΅ΡΠΎΠ½Π½ΡΠΉ Π½ΠΎΠΌΠ΅Ρ Π² ΡΡΡΠΎΠΊΠ΅ Π² ΡΠΏΠΈΡΠΎΠΊ ΡΠ΅Π»ΡΡ . ΠΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΏΡΡΠ°ΡΡΡΡ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΡ digitToInt ΠΈΠ· ΠΌΠΎΠ΄ΡΠ»Ρ Data.Char ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ ΡΠΈΠΌΠ²ΠΎΠ»Ρ Π² ΡΡΡΠΎΠΊΠ΅, Π½ΠΎ ΠΎΠ½Π° Π½Π΅ Π·Π½Π°Π΅Ρ, ΡΡΠΎ Π΄Π΅Π»Π°ΡΡ Ρ Π΄Π΅ΡΠΈΡΠΎΠΌ! ΠΠΎΡΡΠΎΠΌΡ Π½ΡΠΆΠ½ΠΎ ΠΈΠ·Π±Π°Π²ΠΈΡΡΡΡ ΠΎΡ Π²ΡΠ΅Ρ Π½Π΅ΡΠΈΡΡ. ΠΠΎΠΏΡΠΎΡΠΈΠΌ ΠΏΠΎΠΌΠΎΡΠΈ Ρ ΡΡΠ½ΠΊΡΠΈΠΈ isDigit ΠΈΠ· ΠΌΠΎΠ΄ΡΠ»Ρ Data.Char, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΡΠΈΠΌΠ²ΠΎΠ» ΠΈ ΡΠΎΠΎΠ±ΡΠ°Π΅Ρ Π½Π°ΠΌ, ΡΠ²Π»ΡΠ΅ΡΡΡ Π»ΠΈ ΠΎΠ½ ΡΠΈΡΡΠΎΠΉ. ΠΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΡΠΎΠΊΠ° Π±ΡΠ΄Π΅Ρ ΠΎΡΡΠΈΠ»ΡΡΡΠΎΠ²Π°Π½Π°, ΠΏΡΠΎΠΉΠ΄ΡΠΌΡΡ ΠΏΠΎ Π½Π΅ΠΉ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ digitToInt.
string2digits :: String -> [Int]
string2digits = map digitToInt . filter isDigit
ΠΠ°, Π½Π΅ Π·Π°Π±ΡΠ΄ΡΡΠ΅ ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΌΠΎΠ΄ΡΠ»Ρ Data.Char. ΠΡΠΎΠ±ΡΠ΅ΠΌ:
ghci> string2digits "948-92-82"
[9,4,8,9,2,8,2]
ΠΠ°ΠΌΠ΅ΡΠ°ΡΠ΅Π»ΡΠ½ΠΎ! Π’Π΅ΠΏΠ΅ΡΡ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΡ map ΠΈΠ· ΠΌΠΎΠ΄ΡΠ»Ρ Data. Map, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΠΏΡΡΡΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΡ string2digits ΠΏΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ phoneBook:
ghci> let intBook = Map.Map string2digits phoneBook
ghci> :t intBook
intBook :: Map.Map String [Int]
ghci> Map.lookup "ΠΎΠ»Ρ" intBook
Just [5,5,5,2,9,3,8]
Π€ΡΠ½ΠΊΡΠΈΡ map ΠΈΠ· ΠΌΠΎΠ΄ΡΠ»Ρ Data.Map ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ ΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅Ρ ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π² ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΈ.
Π Π°ΡΡΠΈΡΠΈΠΌ ΡΠ΅Π»Π΅ΡΠΎΠ½Π½ΡΡ ΠΊΠ½ΠΈΠΆΠΊΡ. ΠΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΡΠΎ Ρ ΠΊΠΎΠ³ΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ Π΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ΅Π»Π΅ΡΠΎΠ½Π½ΡΡ Π½ΠΎΠΌΠ΅ΡΠΎΠ², ΠΈ Π½Π°Ρ Π°ΡΡΠΎΡΠΈΠ°ΡΠΈΠ²Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΠΊΠ°ΠΊ-ΡΠΎ ΡΠ°ΠΊ:
phoneBook =
[("ΠΎΠ»Ρ","555β29-38")
,("ΠΎΠ»Ρ","342β24-92")
,("ΠΆΠ΅Π½Ρ","452β29-28")
,("ΠΊΠ°ΡΡ","493β29-28")
,("ΠΊΠ°ΡΡ","943β29-29")
,("ΠΊΠ°ΡΡ","827β91-62")
,("ΠΌΠ°ΡΠ°","205β29-28")
,("Π½Π°Π΄Ρ","939β82-82")
,("ΡΠ»Ρ","853β24-92")
,("ΡΠ»Ρ","555β21-11")
]
ΠΡΠ»ΠΈ ΠΌΡ ΠΏΡΠΎΡΡΠΎ Π²ΡΠ·ΠΎΠ²Π΅ΠΌ fromList, ΡΡΠΎΠ±Ρ ΠΏΠΎΠΌΠ΅ΡΡΠΈΡΡ Π²ΡΡ ΡΡΠΎ Π² ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅, ΡΠΎ ΠΏΠΎΡΠ΅ΡΡΠ΅ΠΌ ΠΌΠ°ΡΡΡ Π½ΠΎΠΌΠ΅ΡΠΎΠ²! ΠΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ Π΄ΡΡΠ³ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ ΠΈΠ· ΠΌΠΎΠ΄ΡΠ»Ρ Data.Map, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ fromListWith. ΠΡΠ° ΡΡΠ½ΠΊΡΠΈΡ Π΄Π΅ΠΉΡΡΠ²ΡΠ΅Ρ ΠΏΠΎΡΡΠΈ ΠΊΠ°ΠΊ fromList, Π½ΠΎ Π²ΠΌΠ΅ΡΡΠΎ ΠΎΡΠ±ΡΠ°ΡΡΠ²Π°Π½ΠΈΡ ΠΏΠΎΠ²ΡΠΎΡΡΡΡΠΈΡ ΡΡ ΠΊΠ»ΡΡΠ΅ΠΉ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΡΡ Π΅ΠΉ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΈ ΡΠ΅ΡΠ°Π΅Ρ, ΡΡΠΎ Π΄Π΅Π»Π°ΡΡ.
phoneBookToMap :: (Ord k) => [(k, String)] -> Map.Map k String
phoneBookToMap xs = Map.fromListWith add xs
where add number1 number2 = number1 ++ ", " ++ number2
ΠΡΠ»ΠΈ ΡΡΠ½ΠΊΡΠΈΡ fromListWith ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ²Π°Π΅Ρ, ΡΡΠΎ ΠΊΠ»ΡΡ ΡΠΆΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ, ΠΎΠ½Π° Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΡΡ Π΅ΠΉ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠΎΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ ΠΎΠ±Π° Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π² ΠΎΠ΄Π½ΠΎ, Π° Π·Π°ΡΠ΅ΠΌ Π·Π°ΠΌΠ΅Π½ΡΠ΅Ρ ΡΡΠ°ΡΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π° Π½ΠΎΠ²ΠΎΠ΅, ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠ΅ ΠΎΡ ΡΠΎΠ΅Π΄ΠΈΠ½ΡΡΡΠ΅ΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ:
ghci> Map.lookup "ΠΊΠ°ΡΡ" $ phoneBookToMap phoneBook
"827β91-62, 943β29-29, 493β29-28"
ghci> Map.lookup "Π½Π°Π΄Ρ" $ phoneBookToMap phoneBook
"939-82-82"
ghci> Map.lookup "ΠΎΠ»Ρ" $ phoneBookToMap phoneBook
"342-24-92, 555-29-38"
Π Π΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π±Ρ ΡΠ΄Π΅Π»Π°ΡΡ Π²ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π² Π°ΡΡΠΎΡΠΈΠ°ΡΠΈΠ²Π½ΠΎΠΌ ΡΠΏΠΈΡΠΊΠ΅ ΠΎΠ΄Π½ΠΎΡΠ»Π΅ΠΌΠ΅Π½ΡΠ½ΡΠΌΠΈ ΡΠΏΠΈΡΠΊΠ°ΠΌΠΈ, Π° ΠΏΠΎΡΠΎΠΌ ΡΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠΎΠ²Π°ΡΡ ΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ΅ΠΉ ++, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ:
phoneBookToMap :: (Ord k) => [(k, a)] -> Map.Map k [a]
phoneBookToMap xs = Map.fromListWith (++) $ map (\(k,v) -> (k, [v])) xs
ΠΡΠΎΠ²Π΅ΡΠΈΠΌ Π² GHCi:
ghci> Map.lookup "ΠΊΠ°ΡΡ" $ phoneBookToMap phoneBook
["827β91-62","943β29-29","493β29-28"]