ΠΠΎΠ΄ΡΠ»Ρ Data.Map ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠ°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄. ΠΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΎΠ·Π΄Π°ΡΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π°ΠΏΡΡΠΌΡΡ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π³ΠΎ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ° Π΄Π°Π½Π½ΡΡ , ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΡΠ°ΠΊΠΎΠΉ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ Π½Π΅ ΡΠΊΡΠΏΠΎΡΡΠΈΡΠΎΠ²Π°Π½. ΠΠ΄Π½Π°ΠΊΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ, Π²ΡΠ·Π²Π°Π² ΠΎΠ΄Π½Ρ ΠΈΠ· Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Map.fromList. Π Π°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ, ΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΡΠ΅ Π·Π° Data.Map, Π² Π»ΡΠ±ΠΎΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ ΠΌΠΎΠ³ΡΡ ΠΏΠΎΠΌΠ΅Π½ΡΡΡ Π²Π½ΡΡΡΠ΅Π½Π½Π΅Π΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ, ΠΈ ΠΏΡΠΈ ΡΡΠΎΠΌ Π½ΠΈ ΠΎΠ΄Π½Π° ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠ°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π½Π΅ ΡΠ»ΠΎΠΌΠ°Π΅ΡΡΡ.
Π Π°Π·ΡΠΌΠ΅Π΅ΡΡΡ, ΡΠΊΡΠΏΠΎΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠΎΠ² Π΄Π°Π½Π½ΡΡ Π΄Π»Ρ ΡΠΈΠΏΠΎΠ² ΠΏΠΎΠΏΡΠΎΡΠ΅ Π²ΠΏΠΎΠ»Π½Π΅ Π΄ΠΎΠΏΡΡΡΠΈΠΌ.
Π‘ΠΈΠ½ΡΠ°ΠΊΡΠΈΡ Π·Π°ΠΏΠΈΡΠΈ Ρ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΠΌΠΈ ΠΏΠΎΠ»ΡΠΌΠΈ
ΠΡΡΡ Π΅ΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠΏΠΎΡΠΎΠ± ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΡΠΈΠΏ Π΄Π°Π½Π½ΡΡ . ΠΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΡΠΎ ΠΏΠ΅ΡΠ΅Π΄ Π½Π°ΠΌΠΈ ΠΏΠΎΡΡΠ°Π²Π»Π΅Π½Π° Π·Π°Π΄Π°ΡΠ° ΡΠΎΠ·Π΄Π°ΡΡ ΡΠΈΠΏ Π΄Π°Π½Π½ΡΡ Π΄Π»Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΡΠ΅Π»ΠΎΠ²Π΅ΠΊΠ°. ΠΠ°Π½Π½ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΡ Π½Π°ΠΌΠ΅ΡΠ΅Π²Π°Π΅ΠΌΡΡ Ρ ΡΠ°Π½ΠΈΡΡ, β ΠΈΠΌΡ, ΡΠ°ΠΌΠΈΠ»ΠΈΡ, Π²ΠΎΠ·ΡΠ°ΡΡ, ΡΠΎΡΡ, ΡΠ΅Π»Π΅ΡΠΎΠ½ ΠΈ Π»ΡΠ±ΠΈΠΌΡΠΉ ΡΠΎΡΡ ΠΌΠΎΡΠΎΠΆΠ΅Π½ΠΎΠ³ΠΎ. (ΠΠ΅ Π·Π½Π°Ρ, ΠΊΠ°ΠΊ Π½Π°ΡΡΡΡ Π²Π°Ρ, Π½ΠΎ ΡΡΠΎ Π²ΡΡ, ΡΡΠΎ Ρ Ρ ΠΎΡΠ΅Π» Π±Ρ Π·Π½Π°ΡΡ ΠΎ ΡΠ΅Π»ΠΎΠ²Π΅ΠΊΠ΅!) ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΎΠΏΠΈΡΠ΅ΠΌ ΡΠ°ΠΊΠΎΠΉ ΡΠΈΠΏ:
data Person = Person String String Int Float String String deriving (Show)
ΠΠ΅ΡΠ²ΠΎΠ΅ ΠΏΠΎΠ»Π΅ β ΡΡΠΎ ΠΈΠΌΡ, Π²ΡΠΎΡΠΎΠ΅ β ΡΠ°ΠΌΠΈΠ»ΠΈΡ, ΡΡΠ΅ΡΡΠ΅ β Π²ΠΎΠ·ΡΠ°ΡΡ ΠΈ Ρ. Π΄. Π Π²ΠΎΡ Π½Π°Ρ ΠΏΠ΅ΡΡΠΎΠ½Π°ΠΆ:
ghci> let guy = Person "Π€ΡΠ΅Π΄Π΄ΠΈ" "ΠΡΡΠ³Π΅Ρ" 43 184.2 "526β2928" "ΠΡΠΊΠΈΠΌΠΎ"
ghci> guy
Person "Π€ΡΠ΅Π΄Π΄ΠΈ" "ΠΡΡΠ³Π΅Ρ" 43 184.2 "526β2928" "ΠΡΠΊΠΈΠΌΠΎ"
ΠΡ, Π² ΡΠ΅Π»ΠΎΠΌ ΠΏΡΠΈΠ΅ΠΌΠ»Π΅ΠΌΠΎ, Ρ ΠΎΡΡ ΠΈ Π½Π΅ ΠΎΡΠ΅Π½Ρ Β«ΡΠΈΡΠ°Π±Π΅Π»ΡΠ½ΠΎΒ». Π§ΡΠΎ Π΅ΡΠ»ΠΈ Π½Π°ΠΌ Π½ΡΠΆΠ½Π° ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ ΠΏΠΎΠ»Ρ? Π€ΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΈΠΌΡ, ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΡΠ°ΠΌΠΈΠ»ΠΈΠΈ ΠΈ Ρ. Π΄.? ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΈΡ ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
firstName :: Person β> String
firstName (Person firstname _ _ _ _ _) = firstname
lastName :: Person β> String
lastName (Person _ lastname _ _ _ _) = lastname
age :: Person β> Int
age (Person _ _ age _ _ _) = age
height :: Person β> Float
height (Person _ _ _ height _ _) = height
phoneNumber :: Person β> String
phoneNumber (Person _ _ _ _ number _) = number
flavor :: Person β> String
flavor (Person _ _ _ _ _ flavor) = flavor
Π€Ρ-ΡΡ ! ΠΠ°Π»ΠΎ ΡΠ°Π΄ΠΎΡΡΠΈ ΠΏΠΈΡΠ°ΡΡ ΡΠ°ΠΊΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ!.. ΠΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ ΠΎΡΠ΅Π½Ρ Π³ΡΠΎΠΌΠΎΠ·Π΄ΠΊΠΈΠΉ ΠΈ ΡΠΊΡΡΠ½ΡΠΉ, Π½ΠΎ ΠΎΠ½ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ.
ghci> let guy = Person "Π€ΡΠ΅Π΄Π΄ΠΈ" "ΠΡΡΠ³Π΅Ρ" 43 184.2 "526β2928" "ΠΡΠΊΠΈΠΌΠΎ"
ghci> firstName guy
"Π€ΡΠ΅Π΄Π΄ΠΈ"
ghci> height guy
184.2
ghci> flavor guy
"ΠΡΠΊΠΈΠΌΠΎ"
ΠΡ ΡΠΊΠ°ΠΆΠ΅ΡΠ΅ β Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π»ΡΡΡΠΈΠΉ ΡΠΏΠΎΡΠΎΠ±! ΠΠ½ Π½Π΅Ρ, ΠΈΠ·Π²ΠΈΠ½ΡΠΉΡΠ΅, Π½Π΅ΡΡβ¦ Π¨ΡΡΡ, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ ΠΆΠ΅. Π’Π°ΠΊΠΎΠΉ ΠΌΠ΅ΡΠΎΠ΄ Π΅ΡΡΡ! Β«Π₯Π°-Ρ Π°Β» Π΄Π²Π° ΡΠ°Π·Π°. Π‘ΠΎΠ·Π΄Π°ΡΠ΅Π»ΠΈ ΡΠ·ΡΠΊΠ° Haskell ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅Π»ΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ β ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΠ»ΠΈ Π΅ΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠΏΠΎΡΠΎΠ± Π΄Π»Ρ Π·Π°ΠΏΠΈΡΠΈ ΡΠΈΠΏΠΎΠ² Π΄Π°Π½Π½ΡΡ . ΠΠΎΡ ΠΊΠ°ΠΊ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π΄ΠΎΡΡΠΈΠ³Π½ΡΡΡ ΡΠΎΠΉ ΠΆΠ΅ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ° Π·Π°ΠΏΠΈΡΠ΅ΠΉ Ρ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΠΌΠΈ ΠΏΠΎΠ»ΡΠΌΠΈ:
data Person = Person { firstName :: String
, lastName :: String
, age :: Int
, height :: Float
, phoneNumber :: String
, flavor :: String } deriving (Show)
ΠΠΌΠ΅ΡΡΠΎ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ ΠΏΡΠΎΡΡΠΎ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»ΡΡΡ ΡΠΈΠΏΡ ΠΏΠΎΠ»Π΅ΠΉ ΡΠ΅ΡΠ΅Π· Π·Π°ΠΏΡΡΡΡ, ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΠΈΠ³ΡΡΠ½ΡΠ΅ ΡΠΊΠΎΠ±ΠΊΠΈ. ΠΠ½Π°ΡΠ°Π»Π΅ ΠΏΠΈΡΠ΅ΠΌ ΠΈΠΌΡ ΠΏΠΎΠ»Ρ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ firstName, Π·Π°ΡΠ΅ΠΌ ΡΡΠ°Π²ΠΈΠΌ Π΄Π²Π° Π΄Π²ΠΎΠ΅ΡΠΎΡΠΈΡ :: ΠΈ, Π½Π°ΠΊΠΎΠ½Π΅Ρ, ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ ΡΠΈΠΏ. Π Π΅Π·ΡΠ»ΡΡΠΈΡΡΡΡΠΈΠΉ ΡΠΈΠΏ Π΄Π°Π½Π½ΡΡ Π² ΡΠΎΡΠ½ΠΎΡΡΠΈ ΡΠ°ΠΊΠΎΠΉ ΠΆΠ΅. ΠΠ»Π°Π²Π½Π°Ρ Π²ΡΠ³ΠΎΠ΄Π° β ΡΠ°ΠΊΠΎΠΉ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΠΈ Π΄Π»Ρ ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½ΠΈΡ ΠΏΠΎΠ»Π΅ΠΉ. Π―Π·ΡΠΊ Haskell Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠΎΠ·Π΄Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ firstName, lastName, age, height, phoneNumber ΠΈ flavor.
ghci> :t flavor
flavor :: Person β> String
ghci> :t firstName
firstName :: Person β> String
ΠΡΡΡ Π΅ΡΡ ΠΎΠ΄Π½ΠΎ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²ΠΎ Π² ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ° Π·Π°ΠΏΠΈΡΠ΅ΠΉ. ΠΠΎΠ³Π΄Π° ΠΌΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΠΌ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠ»Π°ΡΡΠ° Show Π΄Π»Ρ ΡΠΈΠΏΠ°, ΠΎΠ½ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ ΡΠΈΠΏ Π½Π΅ ΡΠ°ΠΊ, ΠΊΠ°ΠΊ Π΅ΡΠ»ΠΈ Π±Ρ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ Ρ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΠΌΠΈ ΠΏΠΎΠ»ΡΠΌΠΈ Π΄Π»Ρ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡ ΠΈ ΠΈΠ½ΡΡΠ°Π½ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠΈΠΏΠ°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Ρ Π½Π°Ρ Π΅ΡΡΡ ΡΠΈΠΏ, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡΠΈΠΉ Π°Π²ΡΠΎΠΌΠΎΠ±ΠΈΠ»Ρ. ΠΡ Ρ ΠΎΡΠΈΠΌ Ρ ΡΠ°Π½ΠΈΡΡ ΡΠ»Π΅Π΄ΡΡΡΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ: ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡ-ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Ρ, Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈ Π³ΠΎΠ΄ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π°.
data Car = Car String String Int deriving (Show)
ΠΠ²ΡΠΎΠΌΠΎΠ±ΠΈΠ»Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΡΡΡ ΡΠ°ΠΊ:
ghci> Car "Π€ΠΎΡΠ΄" "ΠΡΡΡΠ°Π½Π³" 1967
Car "Π€ΠΎΡΠ΄" "ΠΡΡΡΠ°Π½Π³" 1967
ΠΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ Ρ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΠΌΠΈ ΠΏΠΎΠ»ΡΠΌΠΈ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΠΈΡΠ°ΡΡ Π½ΠΎΠ²ΡΠΉ Π°Π²ΡΠΎΠΌΠΎΠ±ΠΈΠ»Ρ ΡΠ°ΠΊ:
data Car = Car { company :: String
, model :: String
, year :: Int
} deriving (Show)
ΠΠ²ΡΠΎΠΌΠΎΠ±ΠΈΠ»Ρ ΡΠ΅ΠΏΠ΅ΡΡ ΡΠΎΠ·Π΄Π°ΡΡΡΡ ΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
ghci> Car {company="Π€ΠΎΡΠ΄", model="ΠΡΡΡΠ°Π½Π³", year=1967}
Car {company = "Π€ΠΎΡΠ΄", model = "ΠΡΡΡΠ°Π½Π³", year = 1967}
ΠΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ Π°Π²ΡΠΎΠΌΠΎΠ±ΠΈΠ»Ρ ΠΌΡ, ΡΠ°Π·ΡΠΌΠ΅Π΅ΡΡΡ, ΠΎΠ±ΡΠ·Π°Π½Ρ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»ΠΈΡΡ Π²ΡΠ΅ ΠΏΠΎΠ»Ρ, Π½ΠΎ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ Π² Π»ΡΠ±ΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅. ΠΠΎ Π΅ΡΠ»ΠΈ ΠΌΡ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ Ρ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΠΌΠΈ ΠΏΠΎΠ»ΡΠΌΠΈ, ΡΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ ΠΈΡ ΠΏΠΎ ΠΏΠΎΡΡΠ΄ΠΊΡ.
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ Ρ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΠΌΠΈ ΠΏΠΎΠ»ΡΠΌΠΈ, Π΅ΡΠ»ΠΈ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΠΈΠΌΠ΅Π΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠ»Π΅ΠΉ ΠΈ Π½Π΅ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, ΠΊΠ°ΠΊΠΎΠ΅ ΠΏΠΎΠ»Π΅ Π΄Π»Ρ ΡΠ΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ. ΠΡΠ»ΠΈ, ΡΠΊΠ°ΠΆΠ΅ΠΌ, ΠΌΡ ΡΠΎΠ·Π΄Π°ΡΠΌ ΡΡΡΡ ΠΌΠ΅ΡΠ½ΡΠΉ Π²Π΅ΠΊΡΠΎΡ: data Vector = Vector Int Int Int, ΡΠΎ Π²ΠΏΠΎΠ»Π½Π΅ ΠΏΠΎΠ½ΡΡΠ½ΠΎ, ΡΡΠΎ ΠΏΠΎΠ»Ρ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ° Π΄Π°Π½Π½ΡΡ β ΡΡΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ Π²Π΅ΠΊΡΠΎΡΠ°. ΠΠΎ Π² ΡΠΈΠΏΠ°Ρ Person ΠΈ Car Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ»Π΅ΠΉ ΡΠΎΠ²ΡΠ΅ΠΌ Π½Π΅ ΡΠ°ΠΊ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, ΠΈ ΠΌΡ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π²ΡΠΈΠ³ΡΠ°Π΅ΠΌ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ Ρ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΠΌΠΈ ΠΏΠΎΠ»ΡΠΌΠΈ.
ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΡΠΈΠΏΠ°
ΠΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ Π΄Π°Π½Π½ΡΡ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ²-Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ Car ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΡΡΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΎΠ΄Π½ΠΎ β ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΡΠΈΠΏΠ° Car. Π’Π°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΡ ΡΠΈΠΏΠ° ΠΌΠΎΠ³ΡΡ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ ΡΠΈΠΏΡ-ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΈ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π½ΠΎΠ²ΡΠ΅ ΡΠΈΠΏΡ. ΠΠ° ΠΏΠ΅ΡΠ²ΡΠΉ Π²Π·Π³Π»ΡΠ΄ ΡΡΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π°Π±ΡΡΡΠ°ΠΊΡΠ½ΠΎ, Π½ΠΎ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ Π½Π΅ ΡΠ°ΠΊ ΡΠΆ ΡΠ»ΠΎΠΆΠ½ΠΎ. ΠΡΠ»ΠΈ Π²Ρ Π·Π½Π°ΠΊΠΎΠΌΡ Ρ ΡΠ°Π±Π»ΠΎΠ½Π°ΠΌΠΈ Π² ΡΠ·ΡΠΊΠ΅ Π‘++, ΡΠΎ ΡΠ²ΠΈΠ΄ΠΈΡΠ΅ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΠΈ. Π§ΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΡΠ½ΠΎΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠΈΠΏΡ-ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ, Π΄Π°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ, ΠΊΠ°ΠΊ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ ΡΠΈΠΏΡ, Ρ ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΠΌΡ ΡΠΆΠ΅ Π²ΡΡΡΠ΅ΡΠ°Π»ΠΈΡΡ.
data Maybe a = Nothing | Just a
Π Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ a β ΡΠΈΠΏ-ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ (ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΡΠΈΠΏΠ°, ΡΠΈΠΏΠΎΠ²Π°Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ). Π’Π°ΠΊ ΠΊΠ°ΠΊ Π² Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΈ ΠΏΡΠΈΡΡΡΡΡΠ²ΡΠ΅Ρ ΡΠΈΠΏ-ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ, ΠΌΡ Π½Π°Π·ΡΠ²Π°Π΅ΠΌ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Maybe ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠΎΠΌ ΡΠΈΠΏΠΎΠ². Π Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΎΠΉ ΡΠΈΠΏ Π΄Π°Π½Π½ΡΡ ΠΌΡ Ρ ΠΎΡΠΈΠΌ ΡΠΎΡ ΡΠ°Π½ΡΡΡ Π² ΡΠΈΠΏΠ΅ Maybe, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ Π½Π΅ Nothing, ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΡΠΈΠΏΠ° ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡ ΡΠ°ΠΊΠΈΠ΅ ΡΠΈΠΏΡ, ΠΊΠ°ΠΊ Maybe Int, Maybe Car, Maybe String ΠΈ Ρ. Π΄. ΠΠΈ ΠΎΠ΄Π½ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ ΡΠΈΠΏ Β«ΠΏΡΠΎΡΡΠΎ MaybeΒ», ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΡΡΠΎ Π½Π΅ ΡΠΈΠΏ ΠΊΠ°ΠΊ ΡΠ°ΠΊΠΎΠ²ΠΎΠΉ β ΡΡΠΎ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΡΠΈΠΏΠΎΠ². ΠΠ»Ρ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ ΠΎΠ½ ΡΡΠ°Π» Π½Π°ΡΡΠΎΡΡΠΈΠΌ ΡΠΈΠΏΠΎΠΌ, Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ, ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠΊΠ°Π·Π°ΡΡ Π²ΡΠ΅ ΡΠΈΠΏΡ-ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π² ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ΅ ΡΠΈΠΏΠ°.
ΠΡΠ°ΠΊ, Π΅ΡΠ»ΠΈ ΠΌΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π΄ΠΈΠΌ ΡΠΈΠΏ Char ΠΊΠ°ΠΊ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ Π² ΡΠΈΠΏ Maybe, ΡΠΎ ΠΏΠΎΠ»ΡΡΠΈΠΌ ΡΠΈΠΏ Maybe Char. ΠΠ»Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ°: Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Just 'a' ΠΈΠΌΠ΅Π΅Ρ ΡΠΈΠΏ Maybe Char.
ΠΠ±ΡΡΠ½ΠΎ Π½Π°ΠΌ Π½Π΅ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΡΠ²Π½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ°ΠΌ ΡΠΈΠΏΠΎΠ², ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π² ΡΠ·ΡΠΊΠ΅ Haskell Π΅ΡΡΡ Π²ΡΠ²ΠΎΠ΄ ΡΠΈΠΏΠΎΠ². ΠΠΎΡΡΠΎΠΌΡ ΠΊΠΎΠ³Π΄Π° ΠΌΡ ΡΠΎΠ·Π΄Π°ΡΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Just 'a', Haskell ΡΡΡ ΠΆΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ Π΅Π³ΠΎ ΡΠΈΠΏ β Maybe Char.
ΠΡΠ»ΠΈ ΠΌΡ Π²ΡΡ ΠΆΠ΅ Ρ ΠΎΡΠΈΠΌ ΡΠ²Π½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ ΡΠΈΠΏ ΠΊΠ°ΠΊ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ, ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ Π΄Π΅Π»Π°ΡΡ Π² ΡΠΈΠΏΠΎΠ²ΠΎΠΉ ΡΠ°ΡΡΠΈ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΉ, ΡΠΎ Π΅ΡΡΡ ΠΏΠΎΡΠ»Π΅ ΡΠΈΠΌΠ²ΠΎΠ»Π° ::. Π―Π²Π½ΠΎΠ΅ ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ ΡΠΈΠΏΠ° ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡΡ, Π΅ΡΠ»ΠΈ ΠΌΡ, ΠΊ ΠΏΡΠΈΠΌΠ΅ΡΡ, Ρ ΠΎΡΠΈΠΌ, ΡΡΠΎΠ±Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Just 3 ΠΈΠΌΠ΅Π»ΠΎ ΡΠΈΠΏ Maybe Int. ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Haskell Π²ΡΠ²Π΅Π΄Π΅Ρ ΡΠΈΠΏ (Num a) => Maybe a. ΠΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΡΠ²Π½ΡΠΌ Π°Π½Π½ΠΎΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΠΈΠΏΠ°:
ghci> Just 3 :: Maybe Int
Just 3
ΠΠΎΠΆΠ΅Ρ, Π²Ρ ΠΈ Π½Π΅ Π·Π½Π°Π»ΠΈ, Π½ΠΎ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ ΡΠΈΠΏ, Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π±ΡΠ»ΠΈ ΡΠΈΠΏΡ-ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π΅ΡΡ Π΄ΠΎ ΡΠΈΠΏΠ° Maybe. ΠΡΠΎΡ ΡΠΈΠΏ β ΡΠΏΠΈΡΠΎΠΊ. ΠΠ΅ΡΠΌΠΎΡΡΡ Π½Π° ΡΠΎ ΡΡΠΎ Π΄Π΅Π»ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΊΡΡΠ²Π°Π΅ΡΡΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΌ ΡΠ°Ρ Π°ΡΠΎΠΌ, ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΡΠΏΠΈΡΠΊΠ° ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΡΠΎΠ·Π΄Π°ΡΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ ΡΠΈΠΏ. ΠΠ½Π°ΡΠ΅Π½ΠΈΡ ΠΌΠΎΠ³ΡΡ ΠΈΠΌΠ΅ΡΡ ΡΠΈΠΏ [Int], [Char], [[String]], Π½ΠΎ Π²Ρ Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΎΠ·Π΄Π°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Ρ ΡΠΈΠΏΠΎΠΌ [].
ΠΠ ΠΠΠΠ§ΠΠΠΠ. ΠΡ Π½Π°Π·ΡΠ²Π°Π΅ΠΌ ΡΠΈΠΏ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΌ, Π΅ΡΠ»ΠΈ ΠΎΠ½ Π²ΠΎΠΎΠ±ΡΠ΅ Π½Π΅ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΈΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Int ΠΈΠ»ΠΈ Bool) Π»ΠΈΠ±ΠΎ Π΅ΡΠ»ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π² ΡΠΈΠΏΠ΅ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Ρ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Maybe Char). ΠΡΠ»ΠΈ Ρ Π²Π°Ρ Π΅ΡΡΡ ΠΊΠ°ΠΊΠΎΠ΅-ΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, Ρ Π½Π΅Π³ΠΎ Π²ΡΠ΅Π³Π΄Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ ΡΠΈΠΏ.
ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΠΈΠ³ΡΠ°Π΅ΠΌ Ρ ΡΠΈΠΏΠΎΠΌ Maybe:
ghci> Just "Π₯Π°-Ρ Π°"
Just "Π₯Π°-Ρ Π°"
ghci> Just 84
Just 84
ghci> :t Just "Π₯Π°-Ρ Π°"
Just "Π₯Π°-Ρ Π°" :: Maybe [Char]
ghci> :t Just 84
Just 84 :: (Num t) => Maybe t
ghci> :t Nothing
Nothing :: Maybe a
ghci> Just 10 :: Maybe Double
Just 10.0
Π’ΠΈΠΏΡ-ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΏΠΎΠ»Π΅Π·Π½Ρ ΠΏΠΎΡΠΎΠΌΡ, ΡΡΠΎ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Ρ ΠΈΡ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΡΠΈΠΏΡ, Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΎΠΉ ΡΠΈΠΏ Π½Π°ΠΌ Π½Π°Π΄ΠΎ Ρ ΡΠ°Π½ΠΈΡΡ Π² Π½Π°ΡΠ΅ΠΌ ΡΠΈΠΏΠ΅ Π΄Π°Π½Π½ΡΡ . Π ΠΏΡΠΈΠΌΠ΅ΡΡ, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡΡΠ²ΠΈΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ Maybe-ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΠ΅ ΡΠΈΠΏΡ Π΄Π°Π½Π½ΡΡ Π΄Π»Ρ Π»ΡΠ±ΡΡ ΡΠΈΠΏΠΎΠ²:
data IntMaybe = INothing | IJust Int
data StringMaybe = SNothing | SJust String
data ShapeMaybe = ShNothing | ShJust Shape
ΠΠΎΠ»Π΅Π΅ ΡΠΎΠ³ΠΎ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΈΠΏΡ-ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΠ°ΠΌΠΎΠ³ΠΎ ΠΎΠ±ΠΎΠ±ΡΡΠ½Π½ΠΎΠ³ΠΎ Maybe, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ Π΄Π°Π½Π½ΡΠ΅ Π²ΠΎΠΎΠ±ΡΠ΅ Π»ΡΠ±ΡΡ ΡΠΈΠΏΠΎΠ²!