ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Ρ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠΌΠΈ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π° ΡΡΠ½ΠΊΡΠΈΡ sequenceA ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅, ΡΡΠΎ ΠΈ ΡΡΠ½ΠΊΡΠΈΡ sequence! ΠΠ½Π° ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΡΠΏΠΈΡΠΎΠΊ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π° ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π°, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π²ΡΠΏΠΎΠ»Π½ΠΈΡ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΈΠ· ΡΡΠΈΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ ΠΈ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠ²ΠΎΠ΅Π³ΠΎ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ° Π±ΡΠ΄Π΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ ΡΠΏΠΈΡΠΎΠΊ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ² ΡΡΠΈΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π°. Π’Π°ΠΊ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΡΡΠΎΠ±Ρ ΠΏΡΠ΅Π²ΡΠ°ΡΠΈΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ [IO a] Π² Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ IO [a], ΡΡΠΎΠ±Ρ ΡΠΎΠ·Π΄Π°ΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π°, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΠ΅Π΅ ΡΠΏΠΈΡΠΎΠΊ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ² ΠΏΡΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ, Π²ΡΠ΅ ΡΡΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π° Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½Ρ Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ, Π° Π·Π°ΡΠ΅ΠΌ Π±ΡΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½Π½ΡΠΌΠΈ ΠΎΠ΄Π½ΠΎ Π·Π° Π΄ΡΡΠ³ΠΈΠΌ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ. ΠΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π°, Π½Π΅ Π²ΡΠΏΠΎΠ»Π½ΠΈΠ² Π΅Π³ΠΎ!
ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΠΌΠ΅ΡΡΠΈΠΌ ΡΡΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π° getLine Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ:
ghci> sequenceA [getLine, getLine, getLine]
ΡΠΉ
Ρ ΠΎ
ΡΡ
["ΡΠΉ","Ρ ΠΎ","ΡΡ "]
Π Π·Π°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΎΡΠΌΠ΅ΡΡ, ΡΡΠΎ Π°ΠΏΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠ²Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΎΡΡ Π½Π΅ ΠΏΡΠΎΡΡΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Ρ, Π½ΠΎ ΠΈ ΠΏΠΎΠ»Π΅Π·Π½Ρ. ΠΠ½ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ Π½Π°ΠΌ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΡΡΡ ΡΠ°Π·Π½ΡΠ΅ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ β ΠΊΠ°ΠΊ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π°, Π½Π΅Π΄Π΅ΡΠ΅ΡΠΌΠΈΠ½ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ, Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³Π»ΠΈ ΠΎΠΊΠΎΠ½ΡΠΈΡΡΡΡ Π½Π΅ΡΡΠΏΠ΅ΡΠ½ΠΎ, ΠΈ Ρ. Π΄., β ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π°ΠΏΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠ²Π½ΡΠΉ ΡΡΠΈΠ»Ρ. ΠΡΠΎΡΡΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ² <$> ΠΈ <*> ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ ΠΎΠ±ΡΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ, ΡΡΠΎΠ±Ρ Π΅Π΄ΠΈΠ½ΠΎΠΎΠ±ΡΠ°Π·Π½ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ Π»ΡΠ±ΡΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ Π°ΠΏΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠ²Π½ΡΡ ΡΡΠ½ΠΊΡΠΎΡΠΎΠ² ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π° ΡΠ΅ΠΌΠ°Π½ΡΠΈΠΊΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ .
12
ΠΠΎΠ½ΠΎΠΈΠ΄Ρ
Π ΡΡΠΎΠΉ Π³Π»Π°Π²Π΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ Π΅ΡΡ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΠΈ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΠΉ ΠΊΠ»Π°ΡΡ ΡΠΈΠΏΠΎΠ² Monoid. ΠΠ½ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π΄Π»Ρ ΡΠΈΠΏΠΎΠ², Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΊΠΎΡΠΎΡΡΡ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½Ρ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ Π±ΠΈΠ½Π°ΡΠ½ΠΎΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ. ΠΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ, ΡΡΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡ ΡΠΎΠ±ΠΎΠΉ ΠΌΠΎΠ½ΠΎΠΈΠ΄Ρ ΠΈ ΡΡΠΎ ΡΡΠ²Π΅ΡΠΆΠ΄Π°ΡΡ ΠΈΡ Π·Π°ΠΊΠΎΠ½Ρ. ΠΠ°ΡΠ΅ΠΌ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ½ΠΎΠΈΠ΄Ρ Π² ΡΠ·ΡΠΊΠ΅ Haskell ΠΈ ΠΎΠ±ΡΡΠ΄ΠΈΠΌ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡΡ Π½Π°ΠΌ ΠΏΡΠΈΠ³ΠΎΠ΄ΠΈΡΡΡΡ.
Π ΠΏΡΠ΅ΠΆΠ΄Π΅ Π²ΡΠ΅Π³ΠΎ Π΄Π°Π²Π°ΠΉΡΠ΅ Π²Π·Π³Π»ΡΠ½Π΅ΠΌ Π½Π° ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ newtype: ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΡΠ°ΡΡΠΎ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ, ΠΊΠΎΠ³Π΄Π° ΡΠ³Π»ΡΠ±ΠΈΠΌΡΡ Π² ΡΠ΄ΠΈΠ²ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΠΌΠΈΡ ΠΌΠΎΠ½ΠΎΠΈΠ΄ΠΎΠ².
ΠΠ±ΠΎΡΠ°ΡΠΈΠ²Π°Π½ΠΈΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠ΅Π³ΠΎ ΡΠΈΠΏΠ° Π² Π½ΠΎΠ²ΡΠΉ ΡΠΈΠΏ
ΠΠΎΠΊΠ° ΡΡΠΎ Π²Ρ Π½Π°ΡΡΠΈΠ»ΠΈΡΡ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΡΠ²ΠΎΠΈ Π°Π»Π³Π΅Π±ΡΠ°ΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠΈΠΏΡ Π΄Π°Π½Π½ΡΡ , ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ data. ΠΡ ΡΠ°ΠΊΠΆΠ΅ ΡΠ²ΠΈΠ΄Π΅Π»ΠΈ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π°Π²Π°ΡΡ ΡΠΈΠ½ΠΎΠ½ΠΈΠΌΡ ΠΈΠΌΠ΅ΡΡΠΈΠΌΡΡ ΡΠΈΠΏΠ°ΠΌ Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ³ΠΎ ΡΠ»ΠΎΠ²Π° type. Π ΡΡΠΎΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°ΡΡΡΡ Π½ΠΎΠ²ΡΠ΅ ΡΠΈΠΏΡ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΈΠΌΠ΅ΡΡΠΈΡ ΡΡ ΡΠΈΠΏΠΎΠ² Π΄Π°Π½Π½ΡΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ³ΠΎ ΡΠ»ΠΎΠ²Π° newtype. Π Π² ΠΏΠ΅ΡΠ²ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, ΠΏΠΎΠ³ΠΎΠ²ΠΎΡΠΈΠΌ ΠΎ ΡΠΎΠΌ, ΡΠ΅ΠΌ Π²ΡΡ ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π½Π°ΠΌ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ.
Π Π³Π»Π°Π²Π΅ 11 ΠΌΡ ΠΎΠ±ΡΡΠ΄ΠΈΠ»ΠΈ ΠΏΠ°ΡΡ ΡΠΏΠΎΡΠΎΠ±ΠΎΠ², ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΠΊΠΎΡΠΎΡΡΡ ΡΠΏΠΈΡΠΊΠΎΠ²ΡΠΉ ΡΠΈΠΏ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π°ΠΏΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠ²Π½ΡΠΌ ΡΡΠ½ΠΊΡΠΎΡΠΎΠΌ. ΠΠ΄ΠΈΠ½ ΠΈΠ· ΡΡΠΈΡ ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² ΡΠΎΡΡΠΎΠΈΡ Π² ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ Π·Π°ΡΡΠ°Π²ΠΈΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ <*> Π±ΡΠ°ΡΡ ΠΊΠ°ΠΆΠ΄ΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΈΠ· ΡΠΏΠΈΡΠΊΠ°, ΡΠ²Π»ΡΡΡΠ΅Π³ΠΎΡΡ Π΅Π³ΠΎ Π»Π΅Π²ΡΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ, ΠΈ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ Π΅Ρ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π² ΡΠΏΠΈΡΠΊΠ΅, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ ΡΠΏΡΠ°Π²Π°, ΡΡΠΎ Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π²ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΠΈ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈΠ· Π»Π΅Π²ΠΎΠ³ΠΎ ΡΠΏΠΈΡΠΊΠ° ΠΊ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π² ΠΏΡΠ°Π²ΠΎΠΌ:
ghci> [(+1),(*100),(*5)] <*> [1,2,3]
[2,3,4,100,200,300,5,10,15]
ΠΡΠΎΡΠΎΠΉ ΡΠΏΠΎΡΠΎΠ± Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ Π²Π·ΡΡΡ ΠΏΠ΅ΡΠ²ΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΈΠ· ΡΠΏΠΈΡΠΊΠ° ΡΠ»Π΅Π²Π° ΠΎΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° <*> ΠΈ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ Π΅Ρ ΠΊ ΠΏΠ΅ΡΠ²ΠΎΠΌΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠΏΡΠ°Π²Π°, Π·Π°ΡΠ΅ΠΌ Π²Π·ΡΡΡ Π²ΡΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΈΠ· ΡΠΏΠΈΡΠΊΠ° ΡΠ»Π΅Π²Π° ΠΈ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ Π΅Ρ ΠΊΠΎ Π²ΡΠΎΡΠΎΠΌΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠΏΡΠ°Π²Π°, ΠΈ Ρ. Π΄. Π ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠΌ ΡΡΡΡΠ΅ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ Π½Π΅ΡΡΠΎ Π²ΡΠΎΠ΄Π΅ Π·Π°ΡΡΡΠ³ΠΈΠ²Π°Π½ΠΈΡ Π΄Π²ΡΡ ΡΠΏΠΈΡΠΊΠΎΠ².
ΠΠΎ ΡΠΏΠΈΡΠΊΠΈ ΡΠΆΠ΅ ΠΈΠΌΠ΅ΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠ»Π°ΡΡΠ° Applicative, ΠΏΠΎΡΡΠΎΠΌΡ ΠΊΠ°ΠΊ Π½Π°ΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ Π΄Π»Ρ ΡΠΏΠΈΡΠΊΠΎΠ² Π²ΡΠΎΡΠΎΠΉ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠ»Π°ΡΡΠ° Applicative? ΠΠ°ΠΊ Π²Ρ ΡΠ·Π½Π°Π»ΠΈ, Π΄Π»Ρ ΡΡΠΎΠΉ ΡΠ΅Π»ΠΈ Π±ΡΠ» Π²Π²Π΅Π΄ΡΠ½ ΡΠΈΠΏ ZipList a. ΠΠ½ ΠΈΠΌΠ΅Π΅Ρ ΠΎΠ΄ΠΈΠ½ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ Π΄Π°Π½Π½ΡΡ ZipList, Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½ΠΎ ΠΏΠΎΠ»Π΅. ΠΡ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅ΠΌ ΠΎΠ±ΠΎΡΠ°ΡΠΈΠ²Π°Π΅ΠΌΡΠΉ Π½Π°ΠΌΠΈ ΡΠΏΠΈΡΠΎΠΊ Π² ΡΡΠΎ ΠΏΠΎΠ»Π΅. ΠΠ°Π»Π΅Π΅ Π΄Π»Ρ ΡΠΈΠΏΠ° ZipList ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠ»Π°ΡΡΠ° Applicative, ΡΡΠΎΠ±Ρ, ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΏΠΈΡΠΊΠΈ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°ΠΏΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠ²Π½ΡΡ ΡΡΠ½ΠΊΡΠΎΡΠΎΠ² Π΄Π»Ρ Π·Π°ΡΡΡΠ³ΠΈΠ²Π°Π½ΠΈΡ, ΠΌΡ ΠΌΠΎΠ³Π»ΠΈ ΠΏΡΠΎΡΡΠΎ ΠΎΠ±Π΅ΡΠ½ΡΡΡ ΠΈΡ Ρ ΠΏΠΎ ΠΌΠΎΡΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ° ZipList. ΠΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ ΠΌΡ Π·Π°ΠΊΠΎΠ½ΡΠΈΠ»ΠΈ, ΡΠ°Π·Π²ΠΎΡΠ°ΡΠΈΠ²Π°Π΅ΠΌ ΠΈΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ getZipList:
ghci> getZipList $ ZipList [(+1),(*100),(*5)] <*> ZipList [1,2,3]
[2,200,15]
ΠΡΠ°ΠΊ, ΠΊΠ°ΠΊΠΎΠ΅ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ ΡΡΠΎ ΠΈΠΌΠ΅Π΅Ρ ΠΊ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠΌΡ ΡΠ»ΠΎΠ²Ρ newtype? Π₯ΠΎΡΠΎΡΠΎ, ΠΏΠΎΠ΄ΡΠΌΠ°ΠΉΡΠ΅, ΠΊΠ°ΠΊ Π±Ρ ΠΌΡ ΠΌΠΎΠ³Π»ΠΈ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ data Π΄Π»Ρ Π½Π°ΡΠ΅Π³ΠΎ ΡΠΈΠΏΠ° ZipList a! ΠΠΎΡ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΡΠΏΠΎΡΠΎΠ±ΠΎΠ²:
data ZipList a = ZipList [a]
ΠΡΠΎ ΡΠΈΠΏ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ Π»ΠΈΡΡ ΠΎΠ΄Π½ΠΈΠΌ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠΎΠΌ Π΄Π°Π½Π½ΡΡ , ΠΈ ΡΡΠΎΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ Π΄Π°Π½Π½ΡΡ ΠΈΠΌΠ΅Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½ΠΎ ΠΏΠΎΠ»Π΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΏΠΈΡΠΊΠΎΠΌ ΡΡΡΠ½ΠΎΡΡΠ΅ΠΉ. ΠΡ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ Ρ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΠΌΠΈ ΠΏΠΎΠ»ΡΠΌΠΈ, ΡΡΠΎΠ±Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ, ΠΈΠ·Π²Π»Π΅ΠΊΠ°ΡΡΡΡ ΡΠΏΠΈΡΠΎΠΊ ΠΈΠ· ΡΠΈΠΏΠ° ZipList:
data ZipList a = ZipList { getZipList :: [a] }
ΠΡΠΎ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ½ΠΎ ΡΠΌΠΎΡΡΠΈΡΡΡ ΠΈ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΎΡΠ΅Π½Ρ Ρ ΠΎΡΠΎΡΠΎ. Π£ Π½Π°Ρ Π±ΡΠ»ΠΎ Π΄Π²Π° ΡΠΏΠΎΡΠΎΠ±Π° ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠΉ ΡΠΈΠΏ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠΌ ΠΊΠ»Π°ΡΡΠ° ΡΠΈΠΏΠΎΠ², ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ data, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΡΡΠΎ ΠΎΠ±Π΅ΡΠ½ΡΡΡ ΡΡΠΎΡ ΡΠΈΠΏ Π² Π΄ΡΡΠ³ΠΎΠΉ, ΠΈ ΡΠ΄Π΅Π»Π°Π»ΠΈ Π΄ΡΡΠ³ΠΎΠΉ ΡΠΈΠΏ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠΌ Π²ΡΠΎΡΡΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ.
ΠΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ newtype Π² ΡΠ·ΡΠΊΠ΅ Haskell ΡΠΎΠ·Π΄Π°Π½ΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎ Π΄Π»Ρ ΡΠ΅Ρ ΡΠ»ΡΡΠ°Π΅Π², ΠΊΠΎΠ³Π΄Π° ΠΌΡ Ρ ΠΎΡΠΈΠΌ ΠΏΡΠΎΡΡΠΎ Π²Π·ΡΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠΈΠΏ ΠΈ ΠΎΠ±Π΅ΡΠ½ΡΡΡ Π΅Π³ΠΎ Π²ΠΎ ΡΡΠΎ-Π»ΠΈΠ±ΠΎ, ΡΡΠΎΠ±Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΡ Π΅Π³ΠΎ ΠΊΠ°ΠΊ Π΄ΡΡΠ³ΠΎΠΉ ΡΠΈΠΏ. Π ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΡ ΡΠ΅ΠΉΡΠ°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°Ρ ΡΠΈΠΏ ZipList a ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½ Π²ΠΎΡ ΡΠ°ΠΊ:
newtype ZipList a = ZipList { getZipList :: [a] }
ΠΠΌΠ΅ΡΡΠΎ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ³ΠΎ ΡΠ»ΠΎΠ²Π° data ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ newtype. Π’Π΅ΠΏΠ΅ΡΡ ΡΠ°Π·Π±Π΅ΡΡΠΌΡΡ, ΠΏΠΎΡΠ΅ΠΌΡ. ΠΡ, ΠΊ ΠΏΡΠΈΠΌΠ΅ΡΡ, Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΡ newtype Π±ΡΡΡΡΠ΅Π΅. ΠΡΠ»ΠΈ Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ data Π΄Π»Ρ ΠΎΠ±ΠΎΡΠ°ΡΠΈΠ²Π°Π½ΠΈΡ ΡΠΈΠΏΠ°, ΠΏΠΎΡΠ²Π»ΡΡΡΡΡ Β«Π½Π°ΠΊΠ»Π°Π΄Π½ΡΠ΅ ΡΠ°ΡΡ ΠΎΠ΄ΡΒ» Π½Π° Π²ΡΠ΅ ΡΡΠΈ ΠΎΠ±ΠΎΡΠ°ΡΠΈΠ²Π°Π½ΠΈΡ ΠΈ ΡΠ°Π·Π²ΠΎΡΠ°ΡΠΈΠ²Π°Π½ΠΈΡ, ΠΊΠΎΠ³Π΄Π° Π²Π°ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ. ΠΠΎ Π΅ΡΠ»ΠΈ Π²Ρ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈΡΡ ΠΊΠ»ΡΡΠ΅Π²ΡΠΌ ΡΠ»ΠΎΠ²ΠΎΠΌ newtype, ΡΠ·ΡΠΊ Haskell Π·Π½Π°Π΅Ρ, ΡΡΠΎ Π²Ρ ΠΏΡΠΎΡΡΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΠ΅ Π΅Π³ΠΎ Π΄Π»Ρ ΠΎΠ±ΠΎΡΠ°ΡΠΈΠ²Π°Π½ΠΈΡ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠ΅Π³ΠΎ ΡΠΈΠΏΠ° Π² Π½ΠΎΠ²ΡΠΉ ΡΠΈΠΏ (ΠΎΡΡΡΠ΄Π° Π½Π°Π·Π²Π°Π½ΠΈΠ΅), ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Ρ ΠΎΡΠΈΡΠ΅, ΡΡΠΎΠ±Ρ Π²Π½ΡΡΡΠ΅Π½Π½Π΅ ΠΎΠ½ ΠΎΡΡΠ°Π»ΡΡ ΡΠ΅ΠΌ ΠΆΠ΅, Π½ΠΎ ΠΈΠΌΠ΅Π» ΠΈΠ½ΠΎΠΉ ΡΠΈΠΏ. ΠΠΎ ΡΡΠΎΠΉ ΠΏΡΠΈΡΠΈΠ½Π΅ ΡΠ·ΡΠΊ Haskell ΠΌΠΎΠΆΠ΅Ρ ΠΈΠ·Π±Π°Π²ΠΈΡΡΡΡ ΠΎΡ ΠΎΠ±ΠΎΡΠ°ΡΠΈΠ²Π°Π½ΠΈΡ ΠΈ ΡΠ°Π·Π²ΠΎΡΠ°ΡΠΈΠ²Π°Π½ΠΈΡ, ΠΊΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΡΠΈΡ, ΠΊΠ°ΠΊΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊΠΎΠ³ΠΎ ΡΠΈΠΏΠ°.
Π’Π°ΠΊ ΠΏΠΎΡΠ΅ΠΌΡ Π±Ρ Π²ΡΠ΅Π³Π΄Π° Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ newtype Π²ΠΌΠ΅ΡΡΠΎ data? ΠΠΎΠ³Π΄Π° Π²Ρ ΡΠΎΠ·Π΄Π°ΡΡΠ΅ Π½ΠΎΠ²ΡΠΉ ΡΠΈΠΏ ΠΈΠ· ΠΈΠΌΠ΅ΡΡΠ΅Π³ΠΎΡΡ ΡΠΈΠΏΠ°, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ newtype, Ρ Π²Π°Ρ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΠΌΠ΅Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½ΠΎ ΠΏΠΎΠ»Π΅. ΠΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ³ΠΎ ΡΠ»ΠΎΠ²Π° data Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΡΠΈΠΏΡ Π΄Π°Π½Π½ΡΡ , ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠΌΠ΅ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠΎΠ² Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΠΈ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ Π½ΠΎΠ»Ρ ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ»Π΅ΠΉ:
data Profession = Fighter | Archer | Accountant
data Race = Human | Elf | Orc | Goblin
data PlayerCharacter = PlayerCharacter Race Profession
ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ³ΠΎ ΡΠ»ΠΎΠ²Π° newtype ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ deriving β ΡΠΎΡΠ½ΠΎ ΡΠ°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΌΡ Π±Ρ Π΄Π΅Π»Π°Π»ΠΈ ΡΡΠΎ Ρ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠ΅ΠΉ data. ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠΎΡΠΎΠΆΠ΄Π°ΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ Π΄Π»Ρ ΠΊΠ»Π°ΡΡΠΎΠ² Eq, Ord, Enum, Bounded, Show ΠΈ Read. ΠΡΠ»ΠΈ ΠΌΡ ΠΏΠΎΡΠΎΠ΄ΠΈΠΌ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Π΄Π»Ρ ΠΊΠ»Π°ΡΡΠ° ΡΠΈΠΏΠ°, ΡΠΎ ΠΎΠ±ΠΎΡΠ°ΡΠΈΠ²Π°Π΅ΠΌΡΠΉ Π½Π°ΠΌΠΈ ΡΠΈΠΏ ΡΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅ΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Π΄Π»Ρ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ° ΡΠΈΠΏΠΎΠ². ΠΡΠΎ Π»ΠΎΠ³ΠΈΡΠ½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ newtype Π²ΡΠ΅Π³ΠΎ Π»ΠΈΡΡ ΠΎΠ±ΠΎΡΠ°ΡΠΈΠ²Π°Π΅Ρ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠΉ ΡΠΈΠΏ. ΠΠΎΡΡΠΎΠΌΡ ΡΠ΅ΠΏΠ΅ΡΡ ΠΌΡ ΡΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅ΡΠ°ΡΠ°ΡΡ ΠΈ ΡΡΠ°Π²Π½ΠΈΠ²Π°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π½Π°ΡΠ΅Π³ΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°, Π΅ΡΠ»ΠΈ ΡΠ΄Π΅Π»Π°Π΅ΠΌ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅:
newtype CharList = CharList { getCharList :: [Char] } deriving (Eq, Show)
ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΠΏΡΠΎΠ±ΡΠ΅ΠΌ:
ghci> CharList "ΠΠΎΡ ΡΡΠΎ ΠΌΡ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ!"
CharList {getCharList = "ΠΠΎΡ ΡΡΠΎ ΠΌΡ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ!"}
ghci> CharList "Π±Π΅Π½Π½ΠΈ" == CharList "Π±Π΅Π½Π½ΠΈ"
True
ghci> CharList "Π±Π΅Π½Π½ΠΈ" == CharList "ΡΡΡΡΠΈΡΡ"
False
Π Π΄Π°Π½Π½ΠΎΠΌ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ³ΠΎ ΡΠ»ΠΎΠ²Π° newtype ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ Π΄Π°Π½Π½ΡΡ ΠΈΠΌΠ΅Π΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠΈΠΏ:
CharList :: [Char] β> CharList
ΠΠ½ Π±Π΅ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΈΠΏΠ° [Char] ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΈΠΏΠ° CharList. ΠΠ· ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΡ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠ², Π³Π΄Π΅ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ Π΄Π°Π½Π½ΡΡ CharList, Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ°ΠΊ ΠΎΠ½ΠΎ ΠΈ Π΅ΡΡΡ. Π Π½Π°ΠΎΠ±ΠΎΡΠΎΡ, ΡΡΠ½ΠΊΡΠΈΡ getCharList, ΠΊΠΎΡΠΎΡΠ°Ρ Π±ΡΠ»Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π° Π·Π° Π½Π°Ρ (ΠΏΠΎΡΠΎΠΌΡ ΠΊΠ°ΠΊ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ Ρ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΠΌΠΈ ΠΏΠΎΠ»ΡΠΌΠΈ Π² Π½Π°ΡΠ΅ΠΉ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠΈ newtype), ΠΈΠΌΠ΅Π΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠΈΠΏ:
getCharList :: CharList β> [Char]
ΠΠ½Π° Π±Π΅ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΈΠΏΠ° CharList ΠΈ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅Ρ Π΅Π³ΠΎ Π² Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΈΠΏΠ° [Char]. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΠΎΡΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ ΡΡΠΎ ΠΊΠ°ΠΊ ΠΎΠ±ΠΎΡΠ°ΡΠΈΠ²Π°Π½ΠΈΠ΅ ΠΈ ΡΠ°Π·Π²ΠΎΡΠ°ΡΠΈΠ²Π°Π½ΠΈΠ΅, Π½ΠΎ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ ΡΡΠΎ ΠΊΠ°ΠΊ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ° Π² Π΄ΡΡΠ³ΠΎΠΉ.
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ³ΠΎ ΡΠ»ΠΎΠ²Π° newtype Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠ² ΠΊΠ»Π°ΡΡΠΎΠ² ΡΠΈΠΏΠΎΠ²
Π§Π°ΡΡΠΎ ΠΌΡ Ρ ΠΎΡΠΈΠΌ ΡΠ΄Π΅Π»Π°ΡΡ Π½Π°ΡΠΈ ΡΠΈΠΏΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ°ΠΌΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΡ ΠΊΠ»Π°ΡΡΠΎΠ² ΡΠΈΠΏΠΎΠ², Π½ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΡΠΈΠΏΠ° ΠΏΡΠΎΡΡΠΎ Π½Π΅ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡ ΡΠΎΠΌΡ, ΡΡΠΎ Π½Π°ΠΌ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ. Π‘Π΄Π΅Π»Π°ΡΡ Π΄Π»Ρ ΡΠΈΠΏΠ° Maybe ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠ»Π°ΡΡΠ° Functor Π»Π΅Π³ΠΊΠΎ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΊΠ»Π°ΡΡ ΡΠΈΠΏΠΎΠ² Functor ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½ Π²ΠΎΡ ΡΠ°ΠΊ:
class Functor f where
fmap :: (a -> b) -> f a -> f b
ΠΠΎΡΡΠΎΠΌΡ ΠΌΡ ΠΏΡΠΎΡΡΠΎ Π½Π°ΡΠΈΠ½Π°Π΅ΠΌ Ρ ΡΡΠΎΠ³ΠΎ:
instance Functor Maybe where
Π ΠΏΠΎΡΠΎΠΌ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ fmap.
ΠΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΡΠΈΠΏΠ° ΡΠΎΠ³Π»Π°ΡΡΡΡΡΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΡΠΈΠΏ Maybe Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ ΠΌΠ΅ΡΡΠΎ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ° f Π² ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΊΠ»Π°ΡΡΠ° ΡΠΈΠΏΠΎΠ² Functor. ΠΡΠ»ΠΈ Π²Π·Π³Π»ΡΠ½ΡΡΡ Π½Π° ΡΡΠ½ΠΊΡΠΈΡ fmap, ΠΊΠ°ΠΊ Π΅ΡΠ»ΠΈ Π±Ρ ΠΎΠ½Π° ΡΠ°Π±ΠΎΡΠ°Π»Π° ΡΠΎΠ»ΡΠΊΠΎ Ρ ΡΠΈΠΏΠΎΠΌ Maybe, Π² ΠΈΡΠΎΠ³Π΅ ΠΎΠ½Π° Π²Π΅Π΄ΡΡ ΡΠ΅Π±Ρ Π²ΠΎΡ ΡΠ°ΠΊ: