readFile :: FilePath β> IO String
Π° ΡΡΠ½ΠΊΡΠΈΡ readFile ΠΈΠ· ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ Π΄Π»Ρ ΡΡΡΠΎΠΊ Π±Π°ΠΉΡΠΎΠ² ΠΈΠΌΠ΅Π΅Ρ ΡΠΈΠΏ
readFile :: FilePath β> IO ByteString
ΠΠ ΠΠΠΠ§ΠΠΠΠ. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ Π΅ΡΠ»ΠΈ Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ ΡΡΡΠΎΠ³ΠΈΠ΅ ΡΡΡΠΎΠΊΠΈ ΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΠ΅ ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»Π°, ΠΎΠ½ Π±ΡΠ΄Π΅Ρ ΡΡΠΈΡΠ°Π½ Π² ΠΏΠ°ΠΌΡΡΡ ΡΠ΅Π»ΠΈΠΊΠΎΠΌ! ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Π»Π΅Π½ΠΈΠ²ΡΡ Π±Π°ΠΉΡΠΎΠ²ΡΡ ΡΡΡΠΎΠΊ ΡΠ°ΠΉΠ» Π±ΡΠ΄Π΅Ρ ΡΠΈΡΠ°ΡΡΡΡ Π°ΠΊΠΊΡΡΠ°ΡΠ½ΡΠΌΠΈ ΠΏΠΎΡΡΠΈΡΠΌΠΈ.
ΠΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ Bytestring
ΠΠ°Π²Π°ΠΉΡΠ΅ Π½Π°ΠΏΠΈΡΠ΅ΠΌ ΠΏΡΠΎΡΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π΄Π²Π° ΠΈΠΌΠ΅Π½ΠΈ ΡΠ°ΠΉΠ»Π° Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠ΅ ΠΈ ΠΊΠΎΠΏΠΈΡΡΠ΅Ρ ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠ°ΠΉΠ» Π²ΠΎ Π²ΡΠΎΡΠΎΠΉ. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΠΌΠΎΠ΄ΡΠ»Ρ System.Directory ΡΠΆΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΡΠ½ΠΊΡΠΈΡ copyFile, Π½ΠΎ ΠΌΡ ΡΠΎΠ±ΠΈΡΠ°Π΅ΠΌΡΡ ΡΠΎΠ·Π΄Π°ΡΡ Π½Π°ΡΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ.
import System.Environment
import qualified Data.ByteString.Lazy as B
main = do
(fileName1:fileName2:_) <β getArgs
copy fileName1 fileName2
copy :: FilePath β> FilePath β> IO ()
copy source dest = do
contents <β B.readFile source
bracketOnError
(openTemplFile "." "temp")
(\(tempName, tempHandle) -> do
hClose templHandle
removeFile tempName)
(\(tempName, tempHandle) -> do
B.hPutStr tempHandle contents
hClose tempHandle
renameFile tempName dest)
Π ΡΡΠ½ΠΊΡΠΈΠΈ main ΠΌΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ ΠΈ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ copy, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ Π²ΡΡ Π²ΠΎΠ»ΡΠ΅Π±ΡΡΠ²ΠΎ ΠΈ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ. ΠΠΎΠΎΠ±ΡΠ΅ Π³ΠΎΠ²ΠΎΡΡ, ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π±Ρ ΠΏΡΠΎΡΡΠΎ ΠΏΡΠΎΡΠΈΡΠ°ΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° ΠΈ Π·Π°ΠΏΠΈΡΠ°ΡΡ Π΅Π³ΠΎ Π² Π΄ΡΡΠ³ΠΎΠΉ. ΠΠ΄Π½Π°ΠΊΠΎ Π΅ΡΠ»ΠΈ Π±Ρ ΡΡΠΎ-ΡΠΎ ΠΏΠΎΡΠ»ΠΎ Π½Π΅ ΡΠ°ΠΊ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π·Π°ΠΊΠΎΠ½ΡΠΈΠ»ΠΎΡΡ Π±Ρ ΠΌΠ΅ΡΡΠΎ Π½Π° Π΄ΠΈΡΠΊΠ΅), Ρ Π½Π°Ρ Π² ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π΅ ΠΎΡΡΠ°Π»ΡΡ Π±Ρ ΡΠ°ΠΉΠ» Ρ Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΡΠΌ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΡΠΌ. ΠΠΎΡΡΠΎΠΌΡ ΠΌΡ ΠΏΠΈΡΠ΅ΠΌ Π²ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΉ ΡΠ°ΠΉΠ», ΠΊΠΎΡΠΎΡΡΠΉ Π² ΡΠ»ΡΡΠ°Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΡ ΠΎΡΠΈΠ±ΠΊΠΈ ΠΏΡΠΎΡΡΠΎ ΡΠ΄Π°Π»ΡΠ΅ΡΡΡ.
Π‘Π½Π°ΡΠ°Π»Π° Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ³ΠΎ Π²Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ B.readFile. ΠΠ°ΡΠ΅ΠΌ Ρ ΠΏΠΎΠΌΠΎΡΡΡ bracketOnError ΠΎΡΠ³Π°Π½ΠΈΠ·ΡΠ΅ΠΌ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΠΎΡΠΈΠ±ΠΎΠΊ. ΠΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΡΠ΅ΡΡΡΡ ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²ΠΎΠΌ Π²ΡΠ·ΠΎΠ²Π° openTemplFile "." "temp", ΠΊΠΎΡΠΎΡΡΠΉ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΏΠ°ΡΡ ΠΈΠ· ΠΈΠΌΠ΅Π½ΠΈ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° ΠΈ Π΅Π³ΠΎ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ°. ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ, ΡΡΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΡΠΈ ΠΏΡΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ. Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΌΡ Π·Π°ΠΊΡΠΎΠ΅ΠΌ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΠΈ ΡΠ΄Π°Π»ΠΈΠΌ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΉ ΡΠ°ΠΉΠ». ΠΠ°ΠΊΠΎΠ½Π΅Ρ, Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅. ΠΠ»Ρ Π·Π°ΠΏΠΈΡΠΈ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ³ΠΎ Π²ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΉ ΡΠ°ΠΉΠ» ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ B.hPutStr. ΠΡΠ΅ΠΌΠ΅Π½Π½ΡΠΉ ΡΠ°ΠΉΠ» Π·Π°ΠΊΡΡΠ²Π°Π΅ΡΡΡ, ΠΈ Π΅ΠΌΡ Π΄Π°ΡΡΡΡ ΠΈΠΌΡ, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅ΡΡ Π² ΠΈΡΠΎΠ³Π΅.
ΠΠ°ΠΌΠ΅ΡΡΡΠ΅, ΡΡΠΎ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ B.readFile ΠΈ B.hPutStr Π²ΠΌΠ΅ΡΡΠΎ ΠΈΡ ΠΎΠ±ΡΡΠ½ΡΡ Π²Π΅ΡΡΠΈΠΉ. ΠΠ»Ρ ΠΎΡΠΊΡΡΡΠΈΡ, Π·Π°ΠΊΡΡΡΠΈΡ ΠΈ ΠΏΠ΅ΡΠ΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ² ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π΅ ΡΡΠ΅Π±ΡΡΡΡΡ. ΠΠ½ΠΈ Π½ΡΠΆΠ½Ρ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ ΠΈ Π·Π°ΠΏΠΈΡΠΈ.
ΠΡΠΎΠ²Π΅ΡΠΈΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ:
$ ./bytestringcopy bart.txt bort.txt
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°, Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠ°Ρ ΡΡΡΠΎΠΊΠΈ Π±Π°ΠΉΡΠΎΠ², ΠΌΠΎΠ³Π»Π° Π±Ρ Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ ΡΠΎΡΠ½ΠΎ ΡΠ°ΠΊ ΠΆΠ΅. ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ ΠΎΡΠ»ΠΈΡΠΈΠ΅ β ΡΠΎ, ΡΡΠΎ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ B.readFile ΠΈ B.hPutStr Π²ΠΌΠ΅ΡΡΠΎ readFile ΠΈ hPutStr. ΠΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ ΡΠ»ΡΡΠ°ΡΡ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Β«ΠΏΠ΅ΡΠ΅ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠΎΠ²Π°ΡΡΒ» ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΠΎΠ±ΡΡΠ½ΡΠ΅ ΡΡΡΠΎΠΊΠΈ, Π½Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΡΠΎΠΊ Π±Π°ΠΉΡΠΎΠ², ΠΏΡΠΎΡΡΠΎ ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°Π² Π½ΡΠΆΠ½ΡΠ΅ ΠΌΠΎΠ΄ΡΠ»ΠΈ ΠΈ ΠΏΡΠΎΡΡΠ°Π²ΠΈΠ² ΠΈΠΌΡ ΠΌΠΎΠ΄ΡΠ»Ρ ΠΏΠ΅ΡΠ΅Π΄ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ. Π ΡΡΠ΄Π΅ ΡΠ»ΡΡΠ°Π΅Π² Π²Π°ΠΌ ΠΏΡΠΈΠ΄ΡΡΡΡ ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ²ΠΎΠΈ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΡΡΠΎΠΊ Π±Π°ΠΉΡΠΎΠ², Π½ΠΎ ΡΡΠΎ Π½Π΅ΡΠ»ΠΎΠΆΠ½ΠΎ.
ΠΡΠ»ΠΈ Π²Ρ Ρ ΠΎΡΠΈΡΠ΅ ΡΠ»ΡΡΡΠΈΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΡΠΈΡΡΠ²Π°Π΅Ρ ΠΌΠ½ΠΎΠ³ΠΎ Π΄Π°Π½Π½ΡΡ Π² ΡΡΡΠΎΠΊΠΈ, ΠΏΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΡΠΎΠΊΠΈ Π±Π°ΠΉΡΠΎΠ²; ΡΠΊΠΎΡΠ΅Π΅ Π²ΡΠ΅Π³ΠΎ, Π²Ρ Π΄ΠΎΠ±ΡΡΡΠ΅ΡΡ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ»ΡΡΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ, Π·Π°ΡΡΠ°ΡΠΈΠ² ΡΠΎΠ²ΡΠ΅ΠΌ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΡΠΈΠ»ΠΈΠΉ. ΠΠ±ΡΡΠ½ΠΎ Ρ ΠΏΠΈΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΎΠ±ΡΡΠ½ΡΠ΅ ΡΡΡΠΎΠΊΠΈ, Π° Π·Π°ΡΠ΅ΠΌ ΠΏΠ΅ΡΠ΅Π΄Π΅Π»ΡΠ²Π°Ρ ΠΈΡ Π½Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΡΠΎΠΊ Π±Π°ΠΉΡΠΎΠ², Π΅ΡΠ»ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΌΠ΅Π½Ρ Π½Π΅ ΡΡΡΡΠ°ΠΈΠ²Π°Π΅Ρ.
ΠΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ[11]
Π Π»ΡΠ±ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΡΡΠ΅ΡΠΈΡΡΡΡ ΡΡΠ°Π³ΠΌΠ΅Π½Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ΅Ρ ΠΎΡΡΠ°Π±ΠΎΡΠ°ΡΡ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ. Π Π°Π·Π½ΡΠ΅ ΡΠ·ΡΠΊΠΈ ΠΏΡΠ΅Π΄Π»Π°Π³Π°ΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΡΠΏΠΎΡΠΎΠ±Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΡ ΠΎΡΠΈΠ±ΠΎΠΊ. Π ΡΠ·ΡΠΊΠ΅ Π‘ ΠΌΡ ΠΎΠ±ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ΅ Π·Π°Π²Π΅Π΄ΠΎΠΌΠΎ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠ΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, β1 ΠΈΠ»ΠΈ ΠΏΡΡΡΠΎΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ), ΡΡΠΎΠ±Ρ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡΡΡ ΠΊΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅. Π―Π·ΡΠΊΠΈ Java ΠΈ Π‘#, Ρ Π΄ΡΡΠ³ΠΎΠΉ ΡΡΠΎΡΠΎΠ½Ρ, ΠΏΡΠ΅Π΄Π»Π°Π³Π°ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΎΡΠΈΠ±ΠΎΠΊ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ. ΠΠΎΠ³Π΄Π° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΡΠΈΡΡΠ°ΡΠΈΡ, Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ Π½Π΅ΠΊΠΎΠ΅ΠΌΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΠΎΠΌΡ Π½Π°ΠΌΠΈ ΡΡΠ°ΡΡΠΊΡ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΡΡΠ΄ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ ΠΏΠΎ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡΠ½ΠΎΠ²Π° Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅, ΡΡΠΎΠ±Ρ Π΄ΡΡΠ³ΠΎΠΉ ΠΊΠΎΠ΄ Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΎΡΠΈΠ±ΠΎΠΊ ΠΌΠΎΠ³ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡΡΡ ΠΈ ΠΏΠΎΠ·Π°Π±ΠΎΡΠΈΡΡΡΡ ΠΎ ΠΊΠ°ΠΊΠΈΡ -Π»ΠΈΠ±ΠΎ Π΄ΡΡΠ³ΠΈΡ Π²Π΅ΡΠ°Ρ .
Π ΡΠ·ΡΠΊΠ΅ Haskell ΠΎΡΠ΅Π½Ρ Ρ ΠΎΡΠΎΡΠ°Ρ ΡΠΈΡΡΠ΅ΠΌΠ° ΡΠΈΠΏΠΎΠ². ΠΠ»Π³Π΅Π±ΡΠ°ΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠΈΠΏΡ Π΄Π°Π½Π½ΡΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ ΠΎΠ±ΡΡΠ²ΠΈΡΡ ΡΠ°ΠΊΠΈΠ΅ ΡΠΈΠΏΡ Π΄Π°Π½Π½ΡΡ , ΠΊΠ°ΠΊ Maybe ΠΈ Either; ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΡΠΈΡ ΡΠΈΠΏΠΎΠ² Π΄Π»Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ ΠΎΡΡΡΡΡΡΠ²ΠΎΠ²Π°ΡΡ. Π ΡΠ·ΡΠΊΠ΅ C Π²ΡΠ±ΠΎΡ, ΡΠΊΠ°ΠΆΠ΅ΠΌ, β1 Π΄Π»Ρ ΡΠΈΠ³Π½Π°Π»Π° ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅ β ΡΡΠΎ ΠΏΡΠΎΡΡΠΎ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½Π°Ρ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡΡΠ½Π½ΠΎΡΡΡ. ΠΡΠ° ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ° ΠΈΠΌΠ΅Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΡΠ΅Π»ΠΎΠ²Π΅ΠΊΠ°. ΠΡΠ»ΠΈ ΠΌΡ Π½Π΅ ΠΎΡΠ΅Π½Ρ Π°ΠΊΠΊΡΡΠ°ΡΠ½Ρ, ΡΠΎ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡΠ°ΠΊΡΠΎΠ²Π°ΡΡ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΠ΅ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΊΠ°ΠΊ Π΄ΠΎΠΏΡΡΡΠΈΠΌΡΠ΅, ΠΈ Π·Π°ΡΠ΅ΠΌ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡΡ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΊ ΡΠΏΠ°Π΄ΠΊΡ ΠΈ ΡΠ°Π·ΠΎΡΠ΅Π½ΠΈΡ Π²Π°ΡΠ΅Π³ΠΎ ΠΊΠΎΠ΄Π°. Π‘ΠΈΡΡΠ΅ΠΌΠ° ΡΠΈΠΏΠΎΠ² ΡΠ·ΡΠΊΠ° Haskell Π΄Π°ΡΡ Π½Π°ΠΌ ΡΡΠΎΠ»Ρ ΠΆΠ΅Π»Π°Π½Π½ΡΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ Π² ΡΡΠΎΠΌ Π°ΡΠΏΠ΅ΠΊΡΠ΅. Π€ΡΠ½ΠΊΡΠΈΡ a β> Maybe b ΡΠ²Π½ΠΎ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΡΡΠΎ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠΌ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΈΠΏΠ° b, Π·Π°Π²ΡΡΠ½ΡΡΠΎΠ΅ Π² ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ Just, ΠΈΠ»ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Nothing. Π’ΠΈΠΏ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΠΎΡ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ a β> b, ΠΈ Π΅ΡΠ»ΠΈ ΠΌΡ ΠΏΠΎΠΏΡΡΠ°Π΅ΠΌΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠΈΠΏ Π²ΠΌΠ΅ΡΡΠΎ Π΄ΡΡΠ³ΠΎΠ³ΠΎ, ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π±ΡΠ΄Π΅Ρ Β«ΠΆΠ°Π»ΠΎΠ²Π°ΡΡΡΡΒ» Π½Π° Π½Π°Ρ.
ΠΡΠΎΠΌΠ΅ Π°Π»Π³Π΅Π±ΡΠ°ΠΈΡΠ΅ΡΠΊΠΈΡ ΡΠΈΠΏΠΎΠ², Ρ ΠΎΡΠΎΡΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡΠΈΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ Π·Π°ΠΊΠΎΠ½ΡΠΈΡΡΡΡ Π½Π΅ΡΠ΄Π°ΡΠ΅ΠΉ, ΡΠ·ΡΠΊ Haskell ΠΈΠΌΠ΅Π΅Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΡΡ ΡΠΈΡΡΠ°ΡΠΈΠΉ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΠΏΡΠΈΠΎΠ±ΡΠ΅ΡΠ°ΡΡ ΠΎΡΠΎΠ±ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π°. ΠΡΡ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠΉΡΠΈ Π²ΠΊΡΠΈΠ²Ρ ΠΈ Π²ΠΊΠΎΡΡ, Π΅ΡΠ»ΠΈ Π²Ρ ΡΠ°Π±ΠΎΡΠ°Π΅ΡΠ΅ Ρ Π²Π½Π΅ΡΠ½ΠΈΠΌ ΠΌΠΈΡΠΎΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΡΠΎΠ»Ρ Π½Π΅Π½Π°Π΄ΡΠΆΠ΅Π½! ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΈ ΠΎΡΠΊΡΡΡΠΈΠΈ ΡΠ°ΠΉΠ»Π° ΠΌΠΎΠΆΠ΅Ρ ΡΠ»ΡΡΠΈΡΡΡΡ Π²ΡΡΠΊΠΎΠ΅. ΠΠ½ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½, Π΅Π³ΠΎ ΠΌΠΎΠΆΠ΅Ρ Π½Π΅ ΠΎΠΊΠ°Π·Π°ΡΡΡΡ ΠΏΠΎ Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡ ΠΏΡΡΠΈ, ΠΈΠ»ΠΈ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΡΠ°ΠΊΠΎΠ³ΠΎ Π΄ΠΈΡΠΊΠ°, ΠΈΠ»ΠΈ Π΅ΡΡ ΡΡΠΎ-Π½ΠΈΠ±ΡΠ΄Ρβ¦
ΠΡΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΡΠΈΡΡΠ°ΡΠΈΠΈ Ρ ΠΎΡΠΎΡΠΎ Π±Ρ ΠΈΠΌΠ΅ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΠ΅ΡΠ΅ΠΉΡΠΈ Π½Π° Π½Π΅ΠΊΠΎΡΠΎΡΡΠΉ ΠΊΠΎΠ΄ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΎΡΠΈΠ±ΠΊΠΈ. Π₯ΠΎΡΠΎΡΠΎ, ΠΊΠΎΠ΄ Π΄Π»Ρ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π° (ΡΠΎ Π΅ΡΡΡ Β«Π³ΡΡΠ·Π½ΡΠΉΒ» ΠΊΠΎΠ΄) ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠ·ΡΠ²Π°ΡΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ. ΠΠΌΠ΅Π΅Ρ ΡΠΌΡΡΠ». ΠΡ Π° ΠΊΠ°ΠΊ Π½Π°ΡΡΡΡ ΡΠΈΡΡΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°? ΠΠ½ ΡΠΎΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠ·ΡΠ²Π°ΡΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ! ΠΡΠΏΠΎΠΌΠ½ΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ div ΠΈ head. ΠΡ ΡΠΈΠΏΡ β (Integral a) => a β> a β> a ΠΈ [a] β> a ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ. ΠΠΈΠΊΠ°ΠΊΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΡΠΈΠΏΠ° Maybe ΠΈΠ»ΠΈ Either Π² Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠΌ ΡΠΈΠΏΠ΅, ΠΈ ΡΠ΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡΡ Π²ΡΠ·Π²Π°ΡΡ ΠΎΡΠΈΠ±ΠΊΡ! Π€ΡΠ½ΠΊΡΠΈΡ div Π²Π·ΠΎΡΠ²ΡΡΡΡ Ρ Π²Π°Ρ Π² ΡΡΠΊΠ°Ρ , Π΅ΡΠ»ΠΈ Π²Ρ ΠΏΠΎΠΏΡΡΠ°Π΅ΡΠ΅ΡΡ ΡΠ°Π·Π΄Π΅Π»ΠΈΡΡ Π½Π° Π½ΡΠ»Ρ, Π° ΡΡΠ½ΠΊΡΠΈΡ head Π²ΡΠΏΠ°Π΄Π΅Ρ Π² ΠΎΡΠ°Π΄ΠΎΠΊ, Π΅ΡΠ»ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π΅ΠΉ ΠΏΡΡΡΠΎΠΉ ΡΠΏΠΈΡΠΎΠΊ.
ghci> 4 `div` 0
*** Exception: divide by zero
ghci> head []
*** Exception: Prelude.head: empty list
Π§ΠΈΡΡΡΠΉ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠ±ΡΠ°ΡΡΠ²Π°ΡΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ, Π½ΠΎ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΠ΅Π½Ρ ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΠ°ΡΡΠΈ ΠΊΠΎΠ΄Π°, ΡΠ°Π±ΠΎΡΠ°ΡΡΠ΅ΠΉ Ρ ΡΠΈΡΡΠ΅ΠΌΠΎΠΉ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π° (ΠΊΠΎΠ³Π΄Π° ΠΌΡ Π²Π½ΡΡΡΠΈ Π±Π»ΠΎΠΊΠ° do Π² ΡΡΠ½ΠΊΡΠΈΠΈ main). ΠΡΠΈΡΠΈΠ½Π° Π² ΡΠΎΠΌ, ΡΡΠΎ Π²Ρ Π½Π΅ Π·Π½Π°Π΅ΡΠ΅, ΠΊΠΎΠ³Π΄Π° ΡΡΠΎ-ΡΠΎ Π±ΡΠ΄Π΅Ρ (Π΅ΡΠ»ΠΈ Π²ΠΎΠΎΠ±ΡΠ΅ Π±ΡΠ΄Π΅Ρ!) Π²ΡΡΠΈΡΠ»Π΅Π½ΠΎ Π² ΡΠΈΡΡΠΎΠΌ ΠΊΠΎΠ΄Π΅, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ Π»Π΅Π½ΠΈΠ² ΠΈ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ ΠΆΡΡΡΠΊΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΠΎΠ³ΠΎ ΠΏΠΎΡΡΠ΄ΠΊΠ° Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ, Π² ΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠ°ΠΊ ΠΊΠΎΠ΄ Π΄Π»Ρ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π° ΡΠ°ΠΊΠΎΠΉ ΠΏΠΎΡΡΠ΄ΠΎΠΊ ΠΈΠΌΠ΅Π΅Ρ.
Π Π°Π½ΡΡΠ΅ ΠΌΡ Π³ΠΎΠ²ΠΎΡΠΈΠ»ΠΈ, ΡΡΠΎ Π½Π°ΠΌ ΠΆΠ΅Π»Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΏΡΠΎΠ²ΠΎΠ΄ΠΈΡΡ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠ΅Π½ΡΡΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π² ΡΠ°ΡΡΠΈ Π½Π°ΡΠ΅ΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΏΠΎΡΠ²ΡΡΡΠ½Π½ΠΎΠΉ Π²Π²ΠΎΠ΄Ρ-Π²ΡΠ²ΠΎΠ΄Ρ. ΠΠΎΠ³ΠΈΠΊΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠ°ΡΠΏΠΎΠ»Π°Π³Π°ΡΡΡΡ Π³Π»Π°Π²Π½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ Π² ΡΠΈΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΡΡ , ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΈΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π·Π°Π²ΠΈΡΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ², Ρ ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π±ΡΠ»ΠΈ Π²ΡΠ·Π²Π°Π½Ρ. ΠΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Ρ ΡΠΈΡΡΡΠΌΠΈ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ Π²Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ Π΄ΡΠΌΠ°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Π½Π΅ ΠΌΠΎΠ³ΡΡ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ΅Π³ΠΎ-Π»ΠΈΠ±ΠΎ Π΄ΡΡΠ³ΠΎΠ³ΠΎ. ΠΡΠΎ ΠΎΠ±Π»Π΅Π³ΡΠΈΡ Π²Π°ΠΌ ΠΆΠΈΠ·Π½Ρ!.. ΠΠ°ΠΆΠ΅ Π½Π΅ΡΠΌΠΎΡΡΡ Π½Π° ΡΠΎ, ΡΡΠΎ Π½Π΅ΠΊΠΎΡΠΎΡΠ°Ρ Π»ΠΎΠ³ΠΈΠΊΠ° Π² ΠΊΠΎΠ΄Π΅ Π΄Π»Ρ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ° (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΎΡΠΊΡΡΡΠΈΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΈ Ρ. ΠΏ.), ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ ΡΠ²Π΅Π΄Π΅Π½Π° ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡΠΌΡ. Π§ΠΈΡΡΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π»Π΅Π½ΠΈΠ²Ρ; ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, ΠΌΡ Π½Π΅ Π·Π½Π°Π΅ΠΌ, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ Π±ΡΠ΄ΡΡ Π²ΡΡΠΈΡΠ»Π΅Π½Ρ β ΡΡΠΎ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΈΠΌΠ΅ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ. ΠΠΎ ΠΊΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΈΡΡΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π°ΡΠΈΠ½Π°ΡΡ Π²ΡΠ·ΡΠ²Π°ΡΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ, ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π²Π°ΠΆΠ½ΡΠΌ ΠΌΠΎΠΌΠ΅Π½Ρ ΠΈΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ. ΠΠΎΡ ΠΏΠΎΡΠ΅ΠΌΡ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΡΠ²Π°ΡΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΈΠ· ΡΠΈΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ Π² ΡΠ°ΡΡΠΈ ΠΊΠΎΠ΄Π°, ΠΏΠΎΡΠ²ΡΡΡΠ½Π½ΠΎΠΉ Π²Π²ΠΎΠ΄Ρ-Π²ΡΠ²ΠΎΠ΄Ρ. Π ΡΡΠΎ ΠΏΠ»ΠΎΡ ΠΎ: Π²Π΅Π΄Ρ ΠΌΡ ΡΡΡΠ΅ΠΌΠΈΠΌΡΡ ΠΎΡΡΠ°Π²ΠΈΡΡ ΡΠ°ΠΊΡΡ ΡΠ°ΡΡΡ Π½Π°ΡΡΠΎΠ»ΡΠΊΠΎ ΠΌΠ°Π»Π΅Π½ΡΠΊΠΎΠΉ, Π½Π°ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ!β¦ ΠΠ΄Π½Π°ΠΊΠΎ Π΅ΡΠ»ΠΈ ΠΌΡ Π½Π΅ ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΡΠ²Π°Π΅ΠΌ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ, Π½Π°ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Β«ΠΏΠ°Π΄Π°Π΅ΡΒ». Π Π΅ΡΠ΅Π½ΠΈΠ΅? ΠΠ΅ Π½Π°Π΄ΠΎ ΠΌΠ΅ΡΠ°ΡΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΈ ΡΠΈΡΡΡΠΉ ΠΊΠΎΠ΄! ΠΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ΡΡ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π°ΠΌΠΈ ΡΠΈΡΡΠ΅ΠΌΡ ΡΠΈΠΏΠΎΠ² ΡΠ·ΡΠΊΠ° Haskell ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΡΠΈΠΏΡ Π²ΡΠΎΠ΄Π΅ Either ΠΈ Maybe Π΄Π»Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ², ΠΏΡΠΈ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΈ ΠΊΠΎΡΠΎΡΡΡ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΡΠΈ ΠΎΡΠΈΠ±ΠΊΠ°.
ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ, Π²ΠΎΠ·Π½ΠΈΠΊΡΠΈΡ Π² ΡΠΈΡΡΠΎΠΌ ΠΊΠΎΠ΄Π΅
Π ΡΡΠ°Π½Π΄Π°ΡΡΠ΅ ΡΠ·ΡΠΊΠ° Haskell 98 Π³ΠΎΠ΄Π° ΠΏΡΠΈΡΡΡΡΡΠ²ΡΠ΅Ρ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π°, ΠΊΠΎΡΠΎΡΡΠΉ Π² Π½Π°ΡΡΠΎΡΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ ΡΡΠΈΡΠ°Π΅ΡΡΡ ΡΡΡΠ°ΡΠ΅Π²ΡΠΈΠΌ. Π‘ΠΎΠ³Π»Π°ΡΠ½ΠΎ ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΌΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Ρ Π²ΡΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ, Π²ΠΎΠ·Π½ΠΈΠΊΡΠΈΠ΅ ΠΊΠ°ΠΊ ΠΏΡΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΡΠΈΡΡΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, ΡΠ°ΠΊ ΠΈ ΠΏΡΠΈ ΠΎΡΡΡΠ΅ΡΡΠ²Π»Π΅Π½ΠΈΠΈ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π°, Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΡΡ Π΅Π΄ΠΈΠ½ΠΎΠΎΠ±ΡΠ°Π·Π½ΠΎ. ΠΡΠΎΠΉ ΡΠ΅Π»ΠΈ ΡΠ»ΡΠΆΠΈΡ Π΅Π΄ΠΈΠ½Π°Ρ ΠΈΠ΅ΡΠ°ΡΡ ΠΈΡ ΡΠΈΠΏΠΎΠ² ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ ΠΈΠ· ΠΌΠΎΠ΄ΡΠ»Ρ Control.Exception, Π² ΠΊΠΎΡΠΎΡΡΡ Π»Π΅Π³ΠΊΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΊΠ»ΡΡΠ°ΡΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ ΡΠΈΠΏΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ. ΠΡΠ±ΠΎΠΉ ΡΠΈΠΏ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²ΡΠ²Π°ΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠ»Π°ΡΡΠ° ΡΠΈΠΏΠΎΠ² Exception. Π ΠΌΠΎΠ΄ΡΠ»Π΅ Control.Exception ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΡ ΡΠΈΠΏΠΎΠ² ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ, ΡΡΠ΅Π΄ΠΈ ΠΊΠΎΡΠΎΡΡΡ IOException (ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π°), ArithException (Π°ΡΠΈΡΠΌΠ΅ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° Π½ΠΎΠ»Ρ), ErrorCall (Π²ΡΠ·ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΈ error), PatternMatchFail (Π½Π΅ ΡΠ΄Π°Π»ΠΎΡΡ Π²ΡΠ±ΡΠ°ΡΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠΈΠΉ ΠΎΠ±ΡΠ°Π·Π΅Ρ Π² ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ) ΠΈ Π΄ΡΡΠ³ΠΈΠ΅.