data Day = Monday | Tuesday | Wednesday | Thursday | Friday | Saturday | Sunday
deriving (Eq, Ord, Show, Read, Bounded, Enum)
Π’Π°ΠΊ ΠΊΠ°ΠΊ Π΄Π»Ρ Π½Π°ΡΠ΅Π³ΠΎ ΡΠΈΠΏΠ° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Ρ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ ΠΊΠ»Π°ΡΡΠΎΠ² Show ΠΈ Read, ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠΈΠΏΠ° Π² ΡΡΡΠΎΠΊΠΈ ΠΈ ΠΈΠ· ΡΡΡΠΎΠΊ:
ghci> Wednesday
Wednesday
ghci> show Wednesday
"Wednesday"
ghci> read "Saturday" :: Day
Saturday
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ½ ΠΈΠΌΠ΅Π΅Ρ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ ΠΊΠ»Π°ΡΡΠΎΠ² Eq ΠΈ Ord, Π΄ΠΎΠΏΡΡΠΊΠ°ΡΡΡΡ ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΠ°Π²Π΅Π½ΡΡΠ²ΠΎ:
ghci> Saturday == Sunday
False
ghci> Saturday == Saturday
True
ghci> Saturday > Friday
True
ghci> Monday `compare` Wednesday
LT
ΠΠ°Ρ ΡΠΈΠΏ ΡΠ°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠ»Π°ΡΡΠ° Bounded, ΡΠ°ΠΊ ΡΡΠΎ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΠΉΡΠΈ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ Π΄Π΅Π½Ρ.
ghci> minBound :: Day
Monday
ghci> maxBound :: Day
Sunday
ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ ΡΠΎΠΌΡ ΡΡΠΎ ΡΠΈΠΏ ΠΈΠΌΠ΅Π΅Ρ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠ»Π°ΡΡΠ° Enum, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΠΏΡΠ΅Π΄ΡΠ΅ΡΡΠ²ΡΡΡΠΈΠ΅ ΠΈ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ Π΄Π½ΠΈ, Π° ΡΠ°ΠΊΠΆΠ΅ Π·Π°Π΄Π°Π²Π°ΡΡ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρ Π΄Π½Π΅ΠΉ.
ghci> succ Monday
Tuesday
ghci> pred Saturday
Friday
ghci> [Thursday .. Sunday]
[Thursday,Friday,Saturday,Sunday]
ghci> [minBound .. maxBound] :: [Day]
[Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday]
ΠΠ°ΠΌΠ΅ΡΠ°ΡΠ΅Π»ΡΠ½ΠΎ!
Π‘ΠΈΠ½ΠΎΠ½ΠΈΠΌΡ ΡΠΈΠΏΠΎΠ²
Π Π°Π½Π΅Π΅ ΠΌΡ ΡΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΈ, ΡΡΠΎ ΡΠΈΠΏΡ [Char] ΠΈ String ΡΠ²Π»ΡΡΡΡΡ ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ°ΠΌΠΈ ΠΈ ΠΌΠΎΠ³ΡΡ Π²Π·Π°ΠΈΠΌΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΡΡΡΡΡ. ΠΡΠΎ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠΈΠ½ΠΎΠ½ΠΈΠΌΠΎΠ² ΡΠΈΠΏΠΎΠ². Π‘ΠΈΠ½ΠΎΠ½ΠΈΠΌ ΡΠΈΠΏΠ° ΡΠ°ΠΌ ΠΏΠΎ ΡΠ΅Π±Π΅ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ β ΠΎΠ½ ΠΏΡΠΎΡΡΠΎ Π΄Π°ΡΡ Π΄ΡΡΠ³ΠΎΠ΅ ΠΈΠΌΡ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠ΅ΠΌΡ ΡΠΈΠΏΡ, ΠΎΠ±Π»Π΅Π³ΡΠ°Ρ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π°ΡΠ΅Π³ΠΎ ΠΊΠΎΠ΄Π° ΠΈ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ. ΠΠΎΡ ΡΠ°ΠΊ ΡΡΠ°Π½Π΄Π°ΡΡΠ½Π°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΡΠΈΠΏ String ΠΊΠ°ΠΊ ΡΠΈΠ½ΠΎΠ½ΠΈΠΌ Π΄Π»Ρ [Char]:
type String = [Char]
ΠΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ type ΠΌΠΎΠΆΠ΅Ρ Π²Π²Π΅ΡΡΠΈ Π² Π·Π°Π±Π»ΡΠΆΠ΄Π΅Π½ΠΈΠ΅, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΠΌΡ Π½Π΅ ΡΠΎΠ·Π΄Π°ΡΠΌ Π½ΠΈΡΠ΅Π³ΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ (ΡΠΎΠ·Π΄Π°ΡΠΌ ΠΌΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ³ΠΎ ΡΠ»ΠΎΠ²Π° data), Π° ΠΏΡΠΎΡΡΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌ ΡΠΈΠ½ΠΎΠ½ΠΈΠΌ Π΄Π»Ρ ΡΠΆΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠ΅Π³ΠΎ ΡΠΈΠΏΠ°.
ΠΡΠ»ΠΈ ΠΌΡ ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅Ρ ΡΡΡΠΎΠΊΡ Π² Π²Π΅ΡΡ Π½ΠΈΠΉ ΡΠ΅Π³ΠΈΡΡΡ, ΠΈ Π½Π°Π·ΠΎΠ²ΡΠΌ Π΅Ρ toUpperString, ΡΠΎ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π°ΡΡ Π΅ΠΉ ΡΠΈΠ³Π½Π°ΡΡΡΡ ΡΠΈΠΏΠ° toUpperString :: [Char] β> [Char] ΠΈΠ»ΠΈ toUpperString :: String β> String. ΠΠ±Π΅ ΡΠΈΠ³Π½Π°ΡΡΡΡ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ°ΡΡ ΠΎΠ΄Π½ΠΎ ΠΈ ΡΠΎ ΠΆΠ΅, Π½ΠΎ Π²ΡΠΎΡΠ°Ρ Π»Π΅Π³ΡΠ΅ ΡΠΈΡΠ°Π΅ΡΡΡ.
Π£Π»ΡΡΡΠ΅Π½Π½Π°Ρ ΡΠ΅Π»Π΅ΡΠΎΠ½Π½Π°Ρ ΠΊΠ½ΠΈΠ³Π°
ΠΠΎΠ³Π΄Π° ΠΌΡ ΡΠ°Π±ΠΎΡΠ°Π»ΠΈ Ρ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΌ Data.Map, ΡΠΎ Π²Π½Π°ΡΠ°Π»Π΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ»ΠΈ Π·Π°ΠΏΠΈΡΠ½ΡΡ ΠΊΠ½ΠΈΠΆΠΊΡ Π² Π²ΠΈΠ΄Π΅ Π°ΡΡΠΎΡΠΈΠ°ΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΡΠΏΠΈΡΠΊΠ°, Π° ΠΏΠΎΡΠΎΠΌ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²ΡΠ²Π°Π»ΠΈ Π΅Π³ΠΎ Π² ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅. ΠΠ°ΠΊ ΠΌΡ ΡΠΆΠ΅ Π·Π½Π°Π΅ΠΌ, Π°ΡΡΠΎΡΠΈΠ°ΡΠΈΠ²Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ β ΡΡΠΎ ΡΠΏΠΈΡΠΎΠΊ ΠΏΠ°Ρ Β«ΠΊΠ»ΡΡβΠ·Π½Π°ΡΠ΅Π½ΠΈΠ΅Β». ΠΠ°Π²Π°ΠΉΡΠ΅ Π²Π·Π³Π»ΡΠ½Π΅ΠΌ Π½Π° ΡΡΠΎΡ Π²Π°ΡΠΈΠ°Π½Ρ Π·Π°ΠΏΠΈΡΠ½ΠΎΠΉ ΠΊΠ½ΠΈΠΆΠΊΠΈ:
phoneBook :: [(String,String)]
phoneBook =
[("ΠΎΠ»Ρ","555β29-38")
,("ΠΆΠ΅Π½Ρ","452β29-28")
,("ΠΊΠ°ΡΡ","493β29-28")
,("ΠΌΠ°ΡΠ°","205β29-28")
,("Π½Π°Π΄Ρ","939β82-82")
,("ΡΠ»Ρ","853β24-92")
]
ΠΡ Π²ΠΈΠ΄ΠΈΠΌ, ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ phoneBook ΠΈΠΌΠ΅Π΅Ρ ΡΠΈΠΏ [(String,String)]. ΠΡΠΎ Π³ΠΎΠ²ΠΎΡΠΈΡ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ ΠΏΠ΅ΡΠ΅Π΄ Π½Π°ΠΌΠΈ Π°ΡΡΠΎΡΠΈΠ°ΡΠΈΠ²Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ ΡΡΡΠΎΠΊΠΈ Π² ΡΡΡΠΎΠΊΠΈ, β Π½ΠΎ Π½Π΅ Π±ΠΎΠ»Π΅Π΅. ΠΠ°Π²Π°ΠΉΡΠ΅ Π·Π°Π΄Π°Π΄ΠΈΠΌ ΡΠΈΠ½ΠΎΠ½ΠΈΠΌ ΡΠΈΠΏΠ°, ΠΈ ΠΌΡ ΡΠΌΠΎΠΆΠ΅ΠΌ ΡΠ·Π½Π°ΡΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π±ΠΎΠ»ΡΡΠ΅ ΠΏΠΎ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠΈ ΡΠΈΠΏΠ°:
type PhoneBook = [(String,String)]
Π’Π΅ΠΏΠ΅ΡΡ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΡ ΡΠΈΠΏΠ° Π΄Π»Ρ Π½Π°ΡΠ΅ΠΉ Π·Π°ΠΏΠΈΡΠ½ΠΎΠΉ ΠΊΠ½ΠΈΠΆΠΊΠΈ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ°ΠΊΠΎΠΉ: phoneBook :: PhoneBook. ΠΠ°Π΄Π°Π΄ΠΈΠΌ ΡΠ°ΠΊΠΆΠ΅ ΡΠΈΠ½ΠΎΠ½ΠΈΠΌ Π΄Π»Ρ String.
type PhoneNumber = String
type Name = String
type PhoneBook = [(Name,PhoneNumber)]
Π’Π΅, ΠΊΡΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠ΅Ρ Π½Π° ΡΠ·ΡΠΊΠ΅ Haskell, Π΄Π°ΡΡ ΡΠΈΠ½ΠΎΠ½ΠΈΠΌΡ ΡΠΈΠΏΡ String, Π΅ΡΠ»ΠΈ Ρ ΠΎΡΡΡ ΡΠ΄Π΅Π»Π°ΡΡ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡ Π±ΠΎΠ»Π΅Π΅ Β«Π³ΠΎΠ²ΠΎΡΡΡΠΈΠΌΠΈΒ» β ΠΏΠΎΡΡΠ½ΠΈΡΡ, ΡΠ΅ΠΌ ΡΠ²Π»ΡΡΡΡΡ ΡΡΡΠΎΠΊΠΈ ΠΈ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ.
ΠΡΠ°ΠΊ, ΡΠ΅Π°Π»ΠΈΠ·ΡΡ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΠΈΠΌΡ ΠΈ Π½ΠΎΠΌΠ΅Ρ ΡΠ΅Π»Π΅ΡΠΎΠ½Π° ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ, Π΅ΡΡΡ Π»ΠΈ ΡΠ°ΠΊΠ°Ρ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡ Π² Π½Π°ΡΠ΅ΠΉ Π·Π°ΠΏΠΈΡΠ½ΠΎΠΉ ΠΊΠ½ΠΈΠΆΠΊΠ΅, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π°ΡΡ Π΅ΠΉ ΠΊΡΠ°ΡΠΈΠ²ΡΡ ΠΈ ΠΏΠΎΠ½ΡΡΠ½ΡΡ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΡ ΡΠΈΠΏΠ°:
inPhoneBook :: Name β> PhoneNumber β> PhoneBook β> Bool
inPhoneBook name pnumber pbook = (name,pnumber) `elem` pbook
ΠΡΠ»ΠΈ Π±Ρ ΠΌΡ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ ΡΠΈΠ½ΠΎΠ½ΠΈΠΌΡ ΡΠΈΠΏΠΎΠ², ΡΠΈΠΏ Π½Π°ΡΠ΅ΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π±ΡΠ» Π±Ρ String β> String β> [(String,String)] β> Bool. Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ Π»Π΅Π³ΡΠ΅ ΠΏΠΎΠ½ΡΡΡ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΡΠΈΠ½ΠΎΠ½ΠΈΠΌΠΎΠ² ΡΠΈΠΏΠΎΠ². ΠΠ΄Π½Π°ΠΊΠΎ Π½Π΅ Π½Π°Π΄ΠΎ ΠΏΠ΅ΡΠ΅Π³ΠΈΠ±Π°ΡΡ ΠΏΠ°Π»ΠΊΡ. ΠΡ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΠΌ ΡΠΈΠ½ΠΎΠ½ΠΈΠΌΡ ΡΠΈΠΏΠΎΠ² Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΎΠΏΠΈΡΠ°ΡΡ, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠ΅ ΡΠΈΠΏΡ Π² Π½Π°ΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΡΡ (ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠΈ ΡΠΈΠΏΠΎΠ² Π»ΡΡΡΠ΅ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Ρ), ΠΈΠ»ΠΈ ΠΊΠΎΠ³Π΄Π° ΠΌΡ ΠΈΠΌΠ΅Π΅ΠΌ Π΄Π΅Π»ΠΎ Ρ Π΄Π»ΠΈΠ½Π½ΠΎΠΉ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠ΅ΠΉ ΡΠΈΠΏΠ°, ΠΊΠΎΡΠΎΡΡΡ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΡΠ°ΡΡΠΎ ΠΏΠΎΠ²ΡΠΎΡΡΡΡ (Π²ΡΠΎΠ΄Π΅ [(String,String)]), ΠΏΡΠΈΡΡΠΌ ΡΡΠ° Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΡ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ ΡΡΠΎ-ΡΠΎ Π±ΠΎΠ»Π΅Π΅ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΠΎΠ΅ Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅ Π½Π°ΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ.
ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·Π°ΡΠΈΡ ΡΠΈΠ½ΠΎΠ½ΠΈΠΌΠΎΠ²
Π‘ΠΈΠ½ΠΎΠ½ΠΈΠΌΡ ΡΠΈΠΏΠΎΠ² ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·ΠΎΠ²Π°Π½Ρ. ΠΡΠ»ΠΈ ΠΌΡ Ρ ΠΎΡΠΈΠΌ Π·Π°Π΄Π°ΡΡ ΡΠΈΠ½ΠΎΠ½ΠΈΠΌ Π΄Π»Ρ Π°ΡΡΠΎΡΠΈΠ°ΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΡΠΏΠΈΡΠΊΠ° ΠΈ ΠΏΡΠΈ ΡΡΠΎΠΌ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ, ΡΡΠΎΠ±Ρ ΠΎΠ½ ΠΌΠΎΠ³ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ Π»ΡΠ±ΡΠ΅ ΡΠΈΠΏΡ Π΄Π»Ρ ΠΊΠ»ΡΡΠ΅ΠΉ ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ°ΠΊ:
type AssocList k v = [(k,v)]
Π€ΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΊΠ»ΡΡΡ Π² Π°ΡΡΠΎΡΠΈΠ°ΡΠΈΠ²Π½ΠΎΠΌ ΡΠΏΠΈΡΠΊΠ΅, ΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ ΡΠΈΠΏ (Eq k) => k β> AssocList k v β> Maybe v. Π’ΠΈΠΏ AssocList β ΡΡΠΎ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΡΠΈΠΏΠΎΠ², ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π΄Π²Π° ΡΠΈΠΏΠ° ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ ΡΠΈΠΏ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ AssocList Int String.
ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ°ΡΡΠΈΡΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π½ΠΎΠ²ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ; Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°ΡΡΠΈΡΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ ΡΠΈΠΏΡ-ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΈ ΠΏΠΎΠ»ΡΡΠ°ΡΡ Π½ΠΎΠ²ΡΠ΅ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΡ ΡΠΈΠΏΠΎΠ². Π’Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΌΡ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ, Π½Π΅ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Ρ Π²ΡΠ΅Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π½ΠΎΠ²ΡΡ ΡΡΠ½ΠΊΡΠΈΡ, ΠΌΡ Π±ΡΠ΄Π΅ΠΌ Π²ΡΠ·ΡΠ²Π°ΡΡ ΠΈ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΡΠΈΠΏΠ°, Π½Π΅ ΡΠΊΠ°Π·ΡΠ²Π°Ρ Π²ΡΠ΅Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ², ΠΈ ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΡΠ°ΡΡΠΈΡΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ½Π½ΡΠΉ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΡΠΈΠΏΠ°. ΠΡΠ»ΠΈ ΠΌΡ Ρ ΠΎΡΠΈΠΌ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠΈΠΏ Π΄Π»Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ (ΠΈΠ· ΠΌΠΎΠ΄ΡΠ»Ρ Data.Map) Ρ ΡΠ΅Π»ΠΎΡΠΈΡΠ»Π΅Π½Π½ΡΠΌΠΈ ΠΊΠ»ΡΡΠ°ΠΌΠΈ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ°ΠΊ:
type IntMap v = Map Int v
ΠΈΠ»ΠΈ ΡΠ°ΠΊ:
type IntMap = Map Int
Π Π»ΡΠ±ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΡΠΈΠΏΠΎΠ² IntMap ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ β ΡΡΠΎ ΠΈ Π±ΡΠ΄Π΅Ρ ΡΠΈΠΏΠΎΠΌ, Π² ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡ Int.
Π Π²ΠΎΡ Π΅ΡΡ ΡΡΠΎ. ΠΡΠ»ΠΈ Π²Ρ ΠΏΠΎΠΏΡΡΠ°Π΅ΡΠ΅ΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ, Π²Π°ΠΌ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΏΡΠΎΠΈΠ·Π²Π΅ΡΡΠΈ ΠΊΠ²Π°Π»ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΈΠΌΠΏΠΎΡΡ ΠΌΠΎΠ΄ΡΠ»Ρ Data.Map. ΠΡΠΈ ΠΊΠ²Π°Π»ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΈΠΌΠΏΠΎΡΡΠ΅ ΠΏΠ΅ΡΠ΅Π΄ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ°ΠΌΠΈ ΡΠΈΠΏΠΎΠ² ΡΠ°ΠΊΠΆΠ΅ Π½Π°Π΄ΠΎ ΡΡΠ°Π²ΠΈΡΡ ΠΈΠΌΡ ΠΌΠΎΠ΄ΡΠ»Ρ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΌΡ Π±Ρ Π·Π°ΠΏΠΈΡΠ°Π»ΠΈ: IntMap = Map.Map Int.
Π£Π±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ Π²Ρ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅ΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ°ΠΌΠΈ ΡΠΈΠΏΠΎΠ² ΠΈ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ°ΠΌΠΈ Π΄Π°Π½Π½ΡΡ . ΠΡΠ»ΠΈ ΠΌΡ ΡΠΎΠ·Π΄Π°Π»ΠΈ ΡΠΈΠ½ΠΎΠ½ΠΈΠΌ ΡΠΈΠΏΠ° IntMap ΠΈΠ»ΠΈ AssocList, ΡΡΠΎ Π΅ΡΡ Π½Π΅ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Π»Π°ΡΡ ΡΠ°ΠΊΠΈΠ΅ Π²Π΅ΡΠΈ, ΠΊΠ°ΠΊ AssocList [(1,2),(4,5),(7,9)]. ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΎ, ΡΡΠΎ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡΡΠ»Π°ΡΡΡΡ Π½Π° ΡΠΈΠΏ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π΄ΡΡΠ³ΠΎΠ΅ ΠΈΠΌΡ. ΠΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°ΡΡ: [(1,2),(3,5),(8,9)] :: AssocList Int Int, Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΡΠ΅Π³ΠΎ ΡΠΈΡΠ»Π° Π² ΡΠΏΠΈΡΠΊΠ΅ Π±ΡΠ΄ΡΡ ΡΡΠ°ΠΊΡΠΎΠ²Π°ΡΡΡΡ ΠΊΠ°ΠΊ ΡΠ΅Π»ΡΠ΅ β Π½ΠΎ ΠΌΡ ΡΠ°ΠΊΠΆΠ΅ ΡΠΌΠΎΠΆΠ΅ΠΌ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΡΡΠΈΠΌ ΡΠΏΠΈΡΠΊΠΎΠΌ ΠΊΠ°ΠΊ Ρ ΠΎΠ±ΡΡΠ½ΡΠΌ ΡΠΏΠΈΡΠΊΠΎΠΌ ΠΏΠ°Ρ ΡΠ΅Π»ΡΡ ΡΠΈΡΠ΅Π». Π‘ΠΈΠ½ΠΎΠ½ΠΈΠΌΡ ΡΠΈΠΏΠΎΠ² (ΠΈ Π²ΠΎΠΎΠ±ΡΠ΅ ΡΠΈΠΏΡ) ΠΌΠΎΠ³ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π² ΡΠ·ΡΠΊΠ΅ Haskell ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠΈ ΡΠΈΠΏΠΎΠ². Π§Π°ΡΡΡ ΡΠ·ΡΠΊΠ°, ΠΎΡΠ½ΠΎΡΡΡΠ°ΡΡΡ ΠΊ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡ ΡΠΈΠΏΠΎΠ², β ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠΈΠΏΠΎΠ² (ΡΠΎ Π΅ΡΡΡ ΠΏΡΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Π΄Π°Π½Π½ΡΡ ΠΈ ΡΠΈΠΏΠΎΠ²) ΠΈΠ»ΠΈ ΡΠ°ΡΡΡ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡ ΠΏΠΎΡΠ»Π΅ ΡΠΈΠΌΠ²ΠΎΠ»Π° :: (Π΄Π²Π° Π΄Π²ΠΎΠ΅ΡΠΎΡΠΈΡ). Π‘ΠΈΠΌΠ²ΠΎΠ» :: ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΏΡΠΈ Π΄Π΅ΠΊΠ»Π°ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ ΠΈΠ»ΠΈ Π°Π½Π½ΠΎΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ ΡΠΈΠΏΠΎΠ².
ΠΠ΄ΠΈ Π½Π°Π»Π΅Π²ΠΎ, ΠΏΠΎΡΠΎΠΌ Π½Π°ΠΏΡΠ°Π²ΠΎ
ΠΡΡ ΠΎΠ΄ΠΈΠ½ ΡΡΠ΄Π΅ΡΠ½ΡΠΉ ΡΠΈΠΏ, ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡΠΈΠΉ Π΄Π²Π° Π΄ΡΡΠ³ΠΈΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ², β ΡΡΠΎ ΡΠΈΠΏ Either. ΠΠ½ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½ ΠΏΡΠΈΠ±Π»ΠΈΠ·ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ°ΠΊ:
data Either a b = Left a | Right b deriving (Eq, Ord, Read, Show)
Π£ Π½Π΅Π³ΠΎ Π΄Π²Π° ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ° Π΄Π°Π½Π½ΡΡ . ΠΡΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ Left, Π΅Π³ΠΎ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΠΈΠΌΠ΅Π΅Ρ ΡΠΈΠΏ a; Π΅ΡΠ»ΠΈ Right β ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΠΈΠΌΠ΅Π΅Ρ ΡΠΈΠΏ b. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π°Π½Π½ΡΠΉ ΡΠΈΠΏ Π΄Π»Ρ ΠΈΠ½ΠΊΠ°ΠΏΡΡΠ»ΡΡΠΈΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Π΄Π²ΡΡ ΡΠΈΠΏΠΎΠ². ΠΠΎΠ³Π΄Π° ΠΌΡ ΡΠ°Π±ΠΎΡΠ°Π΅ΠΌ Ρ ΡΠΈΠΏΠΎΠΌ Either a b, ΡΠΎ ΠΎΠ±ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΠΎΠΏΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Ρ ΠΎΠ±ΡΠ°Π·ΡΠΎΠΌ ΠΏΠΎ Left ΠΈ Right ΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΎΠΉ Π²Π°ΡΠΈΠ°Π½Ρ ΡΠΎΠ²ΠΏΠ°Π».
ghci> Right 20
Right 20
ghci> Left "Π²00Ρ"
Left "Π²00Ρ"
ghci> :t Right 'a'
Right 'a' :: Either a Char ghci> :t Left True
Left True :: Either Bool b
ΠΠ· ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΡΠ»Π΅Π΄ΡΠ΅Ρ, ΡΡΠΎ ΡΠΈΠΏΠΎΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Left True ΡΠ²Π»ΡΠ΅ΡΡΡ Either Bool b. ΠΠ΅ΡΠ²ΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΡΠΈΠΏΠ° Bool, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΎΠ·Π΄Π°Π½ΠΎ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠΎΠΌ Left; Π²ΡΠΎΡΠΎΠΉ ΠΆΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΠΎΡΡΠ°Π»ΡΡ ΠΏΠΎΠ»ΠΈΠΌΠΎΡΡΠ½ΡΠΌ. Π‘ΠΈΡΡΠ°ΡΠΈΡ ΠΏΠΎΠ΄ΠΎΠ±Π½Π° ΡΠΎΠΌΡ ΠΊΠ°ΠΊ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Nothing ΠΈΠΌΠ΅Π΅Ρ ΡΠΈΠΏ Maybe a.
ΠΡ Π²ΠΈΠ΄Π΅Π»ΠΈ, ΡΡΠΎ ΡΠΈΠΏ Maybe Π³Π»Π°Π²Π½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π·Π°Π²Π΅ΡΡΠΈΡΡΡΡ Π½Π΅ΡΠ΄Π°ΡΠ΅ΠΉ. ΠΠΎ ΠΈΠ½ΠΎΠ³Π΄Π° ΡΠΈΠΏ Maybe Π½Π΅ ΡΠ°ΠΊ ΡΠ΄ΠΎΠ±Π΅Π½, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Nothing Π½Π΅ Π½Π΅ΡΡΡ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ, ΠΊΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ ΡΡΠΎ ΡΡΠΎ-ΡΠΎ ΠΏΠΎΡΠ»ΠΎ Π½Π΅ ΡΠ°ΠΊ. ΠΡΠΎ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ Π΄Π»Ρ ΡΡΠ½ΠΊΡΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ Π²ΡΠ΄Π°Π²Π°ΡΡ ΠΎΡΠΈΠ±ΠΊΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΎΠ΄Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ β ΠΈΠ»ΠΈ Π΅ΡΠ»ΠΈ Π½Π°ΠΌ ΠΏΡΠΎΡΡΠΎ Π½Π΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ, ΠΊΠ°ΠΊ ΠΈ ΠΏΠΎΡΠ΅ΠΌΡ ΡΡΠ½ΠΊΡΠΈΡ Β«ΡΠΏΠ°Π»Π°Β». ΠΠΎΠΈΡΠΊ Π² ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΈ ΡΠΈΠΏΠ° Data.Map ΠΌΠΎΠΆΠ΅Ρ Π·Π°Π²Π΅ΡΡΠΈΡΡΡΡ Π½Π΅ΡΠ΄Π°ΡΠ΅ΠΉ, ΡΠΎΠ»ΡΠΊΠΎ Π΅ΡΠ»ΠΈ ΠΈΡΠΊΠΎΠΌΡΠΉ ΠΊΠ»ΡΡ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½, ΡΠ°ΠΊ ΡΡΠΎ ΠΌΡ Π·Π½Π°Π΅ΠΌ, ΡΡΠΎ ΡΠ»ΡΡΠΈΠ»ΠΎΡΡ. ΠΠΎ Π΅ΡΠ»ΠΈ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π·Π½Π°ΡΡ, ΠΏΠΎΡΠ΅ΠΌΡ Π½Π΅ ΡΡΠ°Π±ΠΎΡΠ°Π»Π° Π½Π΅ΠΊΠΎΡΠΎΡΠ°Ρ ΡΡΠ½ΠΊΡΠΈΡ, ΠΎΠ±ΡΡΠ½ΠΎ ΠΌΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΡΠΈΠΏΠ° Either a b, Π³Π΄Π΅ a β ΡΡΠΎ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΈΠΏ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ΅Ρ Π½Π°ΠΌ ΡΡΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ ΡΠ°ΡΡΠΊΠ°Π·Π°ΡΡ ΠΎ ΠΏΡΠΈΡΠΈΠ½Π΅ ΠΎΡΠΈΠ±ΠΊΠΈ, ΠΈ b β ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΡΠ΄Π°ΡΠ½ΠΎΠ³ΠΎ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ. Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, ΠΎΡΠΈΠ±ΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ Π΄Π°Π½Π½ΡΡ Left, ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ Right.