data IntMaybe = INothing | IJust Int
data StringMaybe = SNothing | SJust String
data ShapeMaybe = ShNothing | ShJust Shape
ΠΠΎΠ»Π΅Π΅ ΡΠΎΠ³ΠΎ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΈΠΏΡ-ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΠ°ΠΌΠΎΠ³ΠΎ ΠΎΠ±ΠΎΠ±ΡΡΠ½Π½ΠΎΠ³ΠΎ Maybe, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ Π΄Π°Π½Π½ΡΠ΅ Π²ΠΎΠΎΠ±ΡΠ΅ Π»ΡΠ±ΡΡ ΡΠΈΠΏΠΎΠ²!
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: ΡΠΈΠΏ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Nothing β Maybe a. ΠΡΠΎ ΠΏΠΎΠ»ΠΈΠΌΠΎΡΡΠ½ΡΠΉ ΡΠΈΠΏ: Π² Π΅Π³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΡΠΈΡΡΡΡΡΠ²ΡΠ΅Ρ ΡΠΈΠΏΠΎΠ²Π°Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ β ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½Π΅Π΅, ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ a Π² ΡΠΈΠΏΠ΅ Maybe a. ΠΡΠ»ΠΈ Π½Π΅ΠΊΠΎΡΠΎΡΠ°Ρ ΡΡΠ½ΠΊΡΠΈΡ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΡΠΈΠΏΠ° Maybe Int, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π΅ΠΉ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Nothing, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΎ Π½Π΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΌΠΎΠ³Π»ΠΎ Π±Ρ ΡΡΠΎΠΌΡ ΠΏΡΠ΅ΠΏΡΡΡΡΠ²ΠΎΠ²Π°ΡΡ. Π’ΠΈΠΏ Maybe a ΠΌΠΎΠΆΠ΅Ρ Π²Π΅ΡΡΠΈ ΡΠ΅Π±Ρ ΠΊΠ°ΠΊ Maybe Int, ΡΠΎΡΠ½ΠΎ ΡΠ°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ 5 ΠΌΠΎΠΆΠ΅Ρ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡΡΡ ΠΊΠ°ΠΊ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΈΠΏΠ° Int ΠΈΠ»ΠΈ Double. ΠΠ½Π°Π»ΠΎΠ³ΠΈΡΠ½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΡΠΈΠΏ ΠΏΡΡΡΠΎΠ³ΠΎ ΡΠΏΠΈΡΠΊΠ° β ΡΡΠΎ [a]. ΠΡΡΡΠΎΠΉ ΡΠΏΠΈΡΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ Π²Π΅ΡΡΠΈ ΡΠ΅Π±Ρ ΠΊΠ°ΠΊ ΡΠΏΠΈΡΠΎΠΊ ΡΠ΅Π³ΠΎ ΡΠ³ΠΎΠ΄Π½ΠΎ. ΠΠΎΡ ΠΏΠΎΡΠ΅ΠΌΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡ ΡΠ°ΠΊΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ, ΠΊΠ°ΠΊ [1,2,3] ++ [] ΠΈ ["Ρ Π°","Ρ Π°","Ρ Π°"] ++ [].
ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·ΠΎΠ²Π°ΡΡ Π»ΠΈ ΠΌΠ°ΡΠΈΠ½Ρ?
ΠΠΎΠ³Π΄Π° ΠΈΠΌΠ΅Π΅Ρ ΡΠΌΡΡΠ» ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ ΡΠΈΠΏΠΎΠ²ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ? ΠΠ±ΡΡΠ½ΠΎ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΈΡ , ΠΊΠΎΠ³Π΄Π° Π½Π°Ρ ΡΠΈΠΏ Π΄Π°Π½Π½ΡΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΌΠ΅ΡΡ ΡΠΎΡ ΡΠ°Π½ΡΡΡ Π²Π½ΡΡΡΠΈ ΡΠ΅Π±Ρ Π»ΡΠ±ΠΎΠΉ Π΄ΡΡΠ³ΠΎΠΉ ΡΠΈΠΏ, ΠΊΠ°ΠΊ ΡΡΠΎ Π΄Π΅Π»Π°Π΅Ρ Maybe a. ΠΡΠ»ΠΈ Π²Π°Ρ ΡΠΈΠΏ β ΡΡΠΎ Π½Π΅ΠΊΠΎΡΠΎΡΠ°Ρ Β«ΠΎΠ±ΡΡΡΠΊΠ°Β», ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΈΠΏΠΎΠ²-ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΠΎΠΏΡΠ°Π²Π΄Π°Π½Π½ΠΎ. ΠΡ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ Π½Π°Ρ ΡΠΈΠΏ Π΄Π°Π½Π½ΡΡ Car Ρ ΡΠ°ΠΊΠΎΠ³ΠΎ:
data Car = Car { company :: String
, model :: String
, year :: Int
} deriving (Show)
Π½Π° ΡΠ°ΠΊΠΎΠΉ:
data Car a b c = Car { company :: a
, model :: b
, year :: c
} deriving (Show)
ΠΠΎ Π²ΡΠΈΠ³ΡΠ°Π΅ΠΌ Π»ΠΈ ΠΌΡ Π² ΡΡΠΌ-Π½ΠΈΠ±ΡΠ΄Ρ? ΠΡΠ²Π΅Ρ β Π²Π΅ΡΠΎΡΡΠ½ΠΎ, Π½Π΅Ρ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π²ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠΈ ΠΌΡ Π²ΡΡ ΡΠ°Π²Π½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΡΠΈΠΏΠΎΠΌ Car String String Int. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΏΠ΅ΡΠ²ΠΎΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Car, ΠΌΡ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ ΡΠΎΠ·Π΄Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ ΡΠ²ΠΎΠΉΡΡΠ²Π° Π°Π²ΡΠΎΠΌΠΎΠ±ΠΈΠ»Ρ Π² Π²ΠΈΠ΄Π΅ ΠΏΠΎΠ½ΡΡΠ½ΠΎΠ³ΠΎ ΡΠ΅ΠΊΡΡΠ°:
tellCar :: Car β> String
tellCar (Car {company = c, model = m, year = y}) =
"ΠΠ²ΡΠΎΠΌΠΎΠ±ΠΈΠ»Ρ " ++ c ++ " " ++ m ++ ", Π³ΠΎΠ΄: " ++ show y
ghci> let stang = Car {company="Π€ΠΎΡΠ΄", model="ΠΡΡΡΠ°Π½Π³", year=1967}
ghci> tellCar stang
"ΠΠ²ΡΠΎΠΌΠΎΠ±ΠΈΠ»Ρ Π€ΠΎΡΠ΄ ΠΡΡΡΠ°Π½Π³, Π³ΠΎΠ΄: 1967"
ΠΡΠΈΡΡΠ½Π°Ρ ΠΌΠ°Π»Π΅Π½ΡΠΊΠ°Ρ ΡΡΠ½ΠΊΡΠΈΡ. ΠΠ΅ΠΊΠ»Π°ΡΠ°ΡΠΈΡ ΡΠΈΠΏΠ° ΡΡΠ½ΠΊΡΠΈΠΈ ΠΊΡΠ°ΡΠΈΠ²Π° ΠΈ ΠΏΠΎΠ½ΡΡΠ½Π°. Π ΡΡΠΎ Π΅ΡΠ»ΠΈ Car β ΡΡΠΎ Car a b c?
tellCar :: (Show a) => Car String String a β> String
tellCar (Car {company = c, model = m, year = y}) =
"ΠΠ²ΡΠΎΠΌΠΎΠ±ΠΈΠ»Ρ " ++ c ++ " " ++ m ++ ", Π³ΠΎΠ΄: " ++ show y
ΠΡ Π²ΡΠ½ΡΠΆΠ΄Π΅Π½Ρ Π·Π°ΡΡΠ°Π²ΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ Car ΡΠΈΠΏΠ° (Show a) => Car String String a. ΠΠ°ΠΊ Π²ΠΈΠ΄ΠΈΡΠ΅, Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΡ ΡΠΈΠΏΠ° ΡΡΠ½ΠΊΡΠΈΠΈ Π±ΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½Π°; Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²ΠΎ, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π·Π΄Π΅ΡΡ ΠΈΠΌΠ΅Π΅ΡΡΡ, β ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π»ΡΠ±ΠΎΠΉ ΡΠΈΠΏ, ΠΈΠΌΠ΅ΡΡΠΈΠΉ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠ»Π°ΡΡΠ° Show, ΠΊΠ°ΠΊ ΡΠΈΠΏ Π΄Π»Ρ ΡΠΈΠΏΠΎΠ²ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ c.
ghci> tellCar (Car "Π€ΠΎΡΠ΄" "ΠΡΡΡΠ°Π½Π³" 1967)
"ΠΠ²ΡΠΎΠΌΠΎΠ±ΠΈΠ»Ρ Π€ΠΎΡΠ΄ ΠΡΡΡΠ°Π½Π³, Π³ΠΎΠ΄: 1967"
ghci> tellCar (Car "Π€ΠΎΡΠ΄" "ΠΡΡΡΠ°Π½Π³" "ΡΡΡΡΡΠ° Π΄Π΅Π²ΡΡΡΡΠΎΡ ΡΠ΅ΡΡΡΠ΄Π΅ΡΡΡ ΡΠ΅Π΄ΡΠΌΠΎΠΉ")
"ΠΠ²ΡΠΎΠΌΠΎΠ±ΠΈΠ»Ρ Π€ΠΎΡΠ΄ ΠΡΡΡΠ°Π½Π³, Π³ΠΎΠ΄: \"ΡΡΡΡΡΠ° Π΄Π΅Π²ΡΡΡΡΠΎΡ ΡΠ΅ΡΡΡΠ΄Π΅ΡΡΡ ΡΠ΅Π΄ΡΠΌΠΎΠΉ\""
ghci> :t Car "Π€ΠΎΡΠ΄" "ΠΡΡΡΠ°Π½Π³" 1967
Car "Π€ΠΎΡΠ΄" "ΠΡΡΡΠ°Π½Π³" 1967 :: (Num t) => Car [Char] [Char] t
ghci> :t Car "Π€ΠΎΡΠ΄" "ΠΡΡΡΠ°Π½Π³" "ΡΡΡΡΡΠ° Π΄Π΅Π²ΡΡΡΡΠΎΡ ΡΠ΅ΡΡΡΠ΄Π΅ΡΡΡ ΡΠ΅Π΄ΡΠΌΠΎΠΉ"
Car "Π€ΠΎΡΠ΄" "ΠΡΡΡΠ°Π½Π³" "ΡΡΡΡΡΠ° Π΄Π΅Π²ΡΡΡΡΠΎΡ ΡΠ΅ΡΡΡΠ΄Π΅ΡΡΡ ΡΠ΅Π΄ΡΠΌΠΎΠΉ"
:: Car [Char] [Char] [Char]
ΠΠ° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅ ΠΌΡ Π²ΡΡ ΡΠ°Π²Π½ΠΎ Π² Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π΅ ΡΠ»ΡΡΠ°Π΅Π² ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ Π±Ρ Car String String Int, ΡΠ°ΠΊ ΡΡΠΎ Π² ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·Π°ΡΠΈΠΈ ΡΠΈΠΏΠ° Car Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ ΡΠΌΡΡΠ»Π° Π½Π΅Ρ. ΠΠ±ΡΡΠ½ΠΎ ΠΌΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·ΠΈΡΡΠ΅ΠΌ ΡΠΈΠΏΡ, ΠΊΠΎΠ³Π΄Π° Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Π½Π°ΡΠ΅Π³ΠΎ ΡΠΈΠΏΠ° Π½Π΅Π²Π°ΠΆΠ½ΠΎ, ΡΡΠΎ Π² Π½ΡΠΌ Ρ ΡΠ°Π½ΠΈΡΡΡ. Π‘ΠΏΠΈΡΠΎΠΊ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² β ΡΡΠΎ ΠΏΡΠΎΡΡΠΎ ΡΠΏΠΈΡΠΎΠΊ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ², ΠΈ Π½Π΅Π²Π°ΠΆΠ½ΠΎ, ΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΎΠ½ΠΈ ΡΠΈΠΏΠ°: ΡΠΏΠΈΡΠΎΠΊ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π²Π½Π΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΡΠΎΠ³ΠΎ. ΠΡΠ»ΠΈ ΠΌΡ Ρ ΠΎΡΠΈΠΌ ΡΡΠΌΠΌΠΈΡΠΎΠ²Π°ΡΡ ΡΠΏΠΈΡΠΎΠΊ ΡΠΈΡΠ΅Π», ΡΠΎ Π² ΡΡΠΌΠΌΠΈΡΡΡΡΠ΅ΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡΠΎΡΠ½ΠΈΡΡ, ΡΡΠΎ Π½Π°ΠΌ Π½ΡΠΆΠ΅Π½ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠΏΠΈΡΠΎΠΊ ΡΠΈΡΠ΅Π». Π’ΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅ Π²Π΅ΡΠ½ΠΎ ΠΈ Π΄Π»Ρ ΡΠΈΠΏΠ° Maybe. ΠΠ½ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π½Π΅ ΠΈΠΌΠ΅ΡΡ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ ΠΈΠΌΠ΅ΡΡ ΠΊΠ°ΠΊΠΎΠ΅-ΡΠΎ ΠΎΠ΄Π½ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅. Π’ΠΈΠΏ Ρ ΡΠ°Π½ΠΈΠΌΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π½Π΅ Π²Π°ΠΆΠ΅Π½.
ΠΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈΠ·Π²Π΅ΡΡΠ½ΡΠΉ Π½Π°ΠΌ ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ° β ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Map k v ΠΈΠ· ΠΌΠΎΠ΄ΡΠ»Ρ Data.Map. ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ k β ΡΡΠΎ ΡΠΈΠΏ ΠΊΠ»ΡΡΠ΅ΠΉ Π² ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΈ, ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ v β ΡΠΈΠΏ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ. ΠΡΠΎ ΠΎΡΠ»ΠΈΡΠ½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·Π°ΡΠΈΠΈ ΡΠΈΠΏΠΎΠ². ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·Π°ΡΠΈΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π°ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π»ΡΠ±ΡΠ΅ ΡΠΈΠΏΡ, ΡΡΠ΅Π±ΡΡ Π»ΠΈΡΡ, ΡΡΠΎΠ±Ρ ΡΠΈΠΏ ΠΊΠ»ΡΡΠ° ΠΈΠΌΠ΅Π» ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠ»Π°ΡΡΠ° Ord. ΠΡΠ»ΠΈ Π±Ρ ΠΌΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ»ΠΈ ΡΠΈΠΏ Π΄Π»Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ, ΡΠΎ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΊΠ»Π°ΡΡ ΡΠΈΠΏΠ° Π² ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠΈ:
data (Ord k) => Map k v = ...
Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ Π² ΡΠ·ΡΠΊΠ΅ Haskell ΠΏΡΠΈΠ½ΡΡΠΎ ΡΠΎΠ³Π»Π°ΡΠ΅Π½ΠΈΠ΅ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΠΊΠ»Π°ΡΡΠ° ΡΠΈΠΏΠΎΠ² ΠΏΡΠΈ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠΈ ΡΠΈΠΏΠΎΠ² Π΄Π°Π½Π½ΡΡ . ΠΠΎΡΠ΅ΠΌΡ? ΠΠΎΡΠΎΠΌΡ ΡΡΠΎ ΡΠ΅ΡΡΡΠ·Π½ΡΡ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ² ΠΌΡ Π½Π΅ ΠΏΠΎΠ»ΡΡΠΈΠΌ, Π½ΠΎ Π² ΠΊΠΎΠ½ΡΠ΅ ΠΊΠΎΠ½ΡΠΎΠ² Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π²ΡΡ Π±ΠΎΠ»ΡΡΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ, Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΠΎΠ½ΠΈ Π½Π΅ Π½ΡΠΆΠ½Ρ. ΠΠΎΠΌΠ΅ΡΡΠΈΠΌ Π»ΠΈ ΠΌΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ (Ord k) Π² Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΡ ΡΠΈΠΏΠ° ΠΈΠ»ΠΈ Π½Π΅ ΠΏΠΎΠΌΠ΅ΡΡΠΈΠΌ β Π²ΡΡ ΡΠ°Π²Π½ΠΎ ΠΏΡΠΈΠ΄ΡΡΡΡ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ Π΅Π³ΠΎ ΠΏΡΠΈ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΉ, ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°ΡΡΠΈΡ , ΡΡΠΎ ΠΊΠ»ΡΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠΏΠΎΡΡΠ΄ΠΎΡΠ΅Π½. ΠΠΎ Π΅ΡΠ»ΠΈ ΠΌΡ Π½Π΅ ΠΏΠΎΠΌΠ΅ΡΡΠΈΠΌ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ Π² ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠΈ ΡΠΈΠΏΠ°, Π½Π°ΠΌ Π½Π΅ ΠΏΡΠΈΠ΄ΡΡΡΡ ΠΏΠΈΡΠ°ΡΡ Π΅Π³ΠΎ Π² ΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΡΡ , ΠΊΠΎΡΠΎΡΡΠΌ Π½Π΅Π²Π°ΠΆΠ½ΠΎ, ΠΌΠΎΠΆΠ΅Ρ ΠΊΠ»ΡΡ Π±ΡΡΡ ΡΠΏΠΎΡΡΠ΄ΠΎΡΠ΅Π½ ΠΈΠ»ΠΈ Π½Π΅Ρ. ΠΡΠΈΠΌΠ΅Ρ ΡΠ°ΠΊΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ β toList :: Map k a β> [(k, a)]. ΠΡΠ»ΠΈ Π±Ρ Map k a ΠΈΠΌΠ΅Π» ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ ΡΠΈΠΏΠ° Π² ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠΈ, ΡΠΈΠΏ Π΄Π»Ρ ΡΡΠ½ΠΊΡΠΈΠΈ toList Π±ΡΠ» Π±Ρ ΡΠ°ΠΊΠΈΠΌ: toList :: (Ord k) => Map k a β> [(k, a)], Π΄Π°ΠΆΠ΅ Π½Π΅ΡΠΌΠΎΡΡΡ Π½Π° ΡΠΎ ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ Π½Π΅ ΡΡΠ°Π²Π½ΠΈΠ²Π°Π΅Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π΄ΡΡΠ³ Ρ Π΄ΡΡΠ³ΠΎΠΌ.
Π’Π°ΠΊ ΡΡΠΎ Π½Π΅ ΠΏΠΎΠΌΠ΅ΡΠ°ΠΉΡΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΡΠΈΠΏΠΎΠ² Π² Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠΈ ΡΠΈΠΏΠΎΠ² Π΄Π°Π½Π½ΡΡ , Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΡΡΠΎ ΠΈΠΌΠ΅Π»ΠΎ Π±Ρ ΡΠΌΡΡΠ», ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π²Π°ΠΌ Π²ΡΡ ΡΠ°Π²Π½ΠΎ ΠΏΡΠΈΠ΄ΡΡΡΡ ΠΏΠΎΠΌΠ΅ΡΠ°ΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π² Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠΈ ΡΠΈΠΏΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΉ.
ΠΠ΅ΠΊΡΠΎΡΡ ΡΡΠ΄ΡΠ±Ρ
ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΠΌ ΡΡΡΡ ΠΌΠ΅ΡΠ½ΡΠΉ Π²Π΅ΠΊΡΠΎΡ ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π΄Π»Ρ Π½Π΅Π³ΠΎ. ΠΡ Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠΉ ΡΠΈΠΏ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Ρ ΠΎΡΡ Π²Π΅ΠΊΡΠΎΡ ΠΈ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΈΡΠ»ΠΎΠ²ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ, ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΡΠ°Π·Π½ΡΠ΅ ΡΠΈΠΏΡ ΡΠΈΡΠ΅Π».
data Vector a = Vector a a a deriving (Show)
vplus :: (Num a) => Vector a β> Vector a β> Vector a
(Vector i j k) `vplus` (Vector l m n) = Vector (i+l) (j+m) (k+n)
scalarProd :: (Num a) => Vector a β> Vector a β> a
(Vector i j k) `scalarProd` (Vector l m n) = i*l + j*m + k*n
vmult :: (Num a) => Vector a β> a β> Vector a
(Vector i j k) `vmult` m = Vector (i*m) (j*m) (k*m)
Π€ΡΠ½ΠΊΡΠΈΡ vplus ΡΠΊΠ»Π°Π΄ΡΠ²Π°Π΅Ρ Π΄Π²Π° Π²Π΅ΠΊΡΠΎΡΠ° ΠΏΡΡΡΠΌ ΡΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΡ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°Ρ. Π€ΡΠ½ΠΊΡΠΈΡ scalarProd ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ ΡΠΊΠ°Π»ΡΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΡ Π΄Π²ΡΡ Π²Π΅ΠΊΡΠΎΡΠΎΠ², ΡΡΠ½ΠΊΡΠΈΡ vmult β Π΄Π»Ρ ΡΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΡ Π²Π΅ΠΊΡΠΎΡΠ° Π½Π° ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ.
ΠΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΌΠΎΠ³ΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΡΠΈΠΏΠ°ΠΌΠΈ Vector Int, Vector Integer, Vector Float ΠΈ Π΄ΡΡΠ³ΠΈΠΌΠΈ, Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ ΠΏΠΎΠΊΠ° ΡΠΈΠΏ-ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ a ΠΈΠ· ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ Vector a ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ ΠΊΠ»Π°ΡΡΡ ΡΠΈΠΏΠΎΠ² Num. ΠΠΎ ΡΠΈΠΏΠ°ΠΌ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ ΠΎΠ½ΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Ρ Π²Π΅ΠΊΡΠΎΡΠ°ΠΌΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°, ΠΈ Π²ΡΠ΅ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΡ Π²Π΅ΠΊΡΠΎΡΠ° ΡΠ°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΈΠΌΠ΅ΡΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠΉ ΡΠΈΠΏ. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΠΎ, ΡΡΠΎ ΠΌΡ Π½Π΅ ΠΏΠΎΠΌΠ΅ΡΡΠΈΠ»ΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ ΠΊΠ»Π°ΡΡΠ° Num Π² Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΡ ΡΠΈΠΏΠ° Π΄Π°Π½Π½ΡΡ , ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π½Π°ΠΌ Π²ΡΡ ΡΠ°Π²Π½ΠΎ Π±Ρ ΠΏΡΠΈΡΠ»ΠΎΡΡ ΠΏΠΎΠ²ΡΠΎΡΡΡΡ Π΅Π³ΠΎ Π² ΡΡΠ½ΠΊΡΠΈΡΡ .
ΠΡΡ ΡΠ°Π· ΠΏΠΎΠ²ΡΠΎΡΡ: ΠΎΡΠ΅Π½Ρ Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡΡ ΡΠ°Π·Π½ΠΈΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ°ΠΌΠΈ ΡΠΈΠΏΠΎΠ² ΠΈ Π΄Π°Π½Π½ΡΡ . ΠΡΠΈ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠΈ ΡΠΈΠΏΠ° Π΄Π°Π½Π½ΡΡ ΡΠ°ΡΡΡ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡ Π΄ΠΎ Π·Π½Π°ΠΊΠ° = ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΡΠΈΠΏΠ°, Π° ΡΠ°ΡΡΡ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡ ΠΏΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ Π·Π½Π°ΠΊΠ° β ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ Π΄Π°Π½Π½ΡΡ (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠΎΠ², ΡΠ°Π·Π΄Π΅Π»ΡΠ½Π½ΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠΌ |). ΠΠΎΠΏΡΡΠΊΠ° Π΄Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠΈΠΏ Vector a a a -> Vector a a a -> a Π±ΡΠ΄Π΅Ρ Π½Π΅ΡΠ΄Π°ΡΠ½ΠΎΠΉ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΠΎΠΌΠ΅ΡΠ°ΡΡ ΡΠΈΠΏΡ Π² Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΡ ΡΠΈΠΏΠ°, ΠΈ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΡΠΈΠΏΠ° Π΄Π»Ρ Π²Π΅ΠΊΡΠΎΡΠ° ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ, Π² ΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠ°ΠΊ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ Π΄Π°Π½Π½ΡΡ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΡΡΠΈ. ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΡΠΏΡΠ°ΠΆΠ½ΡΠ΅ΠΌΡΡ Ρ Π½Π°ΡΠΈΠΌΠΈ Π²Π΅ΠΊΡΠΎΡΠ°ΠΌΠΈ:
ghci> Vector 3 5 8 `vplus` Vector 9 2 8
Vector 12 7 16
ghci> Vector 3 5 8 `vplus` Vector 9 2 8 `vplus` Vector 0 2 3
Vector 12 9 19
ghci> Vector 3 9 7 `vmult` 10
Vector 30 90 70
ghci> Vector 4 9 5 `scalarProd` Vector 9.0 2.0 4.0
74.0
ghci> Vector 2 9 3 `vmult` (Vector 4 9 5 `scalarProd`
Vector 9 2 4) Vector 148 666 222
ΠΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΡΠ΅ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ
Π ΡΠ°Π·Π΄Π΅Π»Π΅ Β«ΠΠ»Π°ΡΡΡ ΡΠΈΠΏΠΎΠ²Β» Π³Π»Π°Π²Ρ 2 ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΠ»ΠΈΡΡ Π±Π°Π·ΠΎΠ²ΡΠ΅ ΡΠ²Π΅Π΄Π΅Π½ΠΈΡ ΠΎ ΠΊΠ»Π°ΡΡΠ°Ρ ΡΠΈΠΏΠΎΠ². ΠΡ ΡΠΏΠΎΠΌΡΠ½ΡΠ»ΠΈ, ΡΡΠΎ ΠΊΠ»Π°ΡΡ ΡΠΈΠΏΠΎΠ² β ΡΡΠΎ Π½Π΅ΡΡΠΎ Π²ΡΠΎΠ΄Π΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅. Π’ΠΈΠΏ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ΄Π΅Π»Π°Π½ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠΌ ΠΊΠ»Π°ΡΡΠ°, Π΅ΡΠ»ΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΡΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅. ΠΡΠΈΠΌΠ΅Ρ: ΡΠΈΠΏ Int Π΅ΡΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠ»Π°ΡΡΠ° ΡΠΈΠΏΠΎΠ² Eq, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΊΠ»Π°ΡΡ Eq ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π΄Π»Ρ ΡΡΡΠ½ΠΎΡΡΠ΅ΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½Ρ Π½Π° ΡΠ°Π²Π΅Π½ΡΡΠ²ΠΎ. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΡΠ΅Π»ΡΠ΅ ΡΠΈΡΠ»Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ Π½Π° ΡΠ°Π²Π΅Π½ΡΡΠ²ΠΎ, ΡΠΈΠΏ Int ΠΈΠΌΠ΅Π΅Ρ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Π΄Π»Ρ ΠΊΠ»Π°ΡΡΠ° Eq. Π Π΅Π°Π»ΡΠ½Π°Ρ ΠΏΠΎΠ»ΡΠ·Π° ΠΎΡ ΡΡΠΎΠ³ΠΎ Π²ΠΈΠ΄Π½Π° ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ»ΡΠΆΠ°Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠΌ ΠΊΠ»Π°ΡΡΠ° Eq, β ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ² == ΠΈ /=. ΠΡΠ»ΠΈ ΡΠΈΠΏ ΠΈΠΌΠ΅Π΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΠΉ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠ»Π°ΡΡΠ° Eq, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ == ΠΊ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌ ΡΡΠΎΠ³ΠΎ ΡΠΈΠΏΠ°. ΠΠΎΡ ΠΏΠΎΡΠ΅ΠΌΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ 4 == 4 ΠΈ "ΡΠ°Π·" /= "Π΄Π²Π°" ΠΏΡΠΎΡ ΠΎΠ΄ΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΡ ΡΠΈΠΏΠΎΠ².