ÍÉÎÉÓÔÅÒÓÔ×Ï ÏÂÒÁÚÏ×ÁÎÉÑ ÒÆ ÉÎÓÔÉÔÕÔ ÉÎÆÏ
î.á. òÏÇÁÎÏ×Á
æÕÎË ÉÏÎÁÌØÎÏÅ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÅ ÕÞÅÂÎÏÅ ÏÓÏÂÉÅ ÄÌÑ ×ÙÓÛÉÈ ÕÞÅ...
3 downloads
133 Views
1MB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
ÍÉÎÉÓÔÅÒÓÔ×Ï ÏÂÒÁÚÏ×ÁÎÉÑ ÒÆ ÉÎÓÔÉÔÕÔ ÉÎÆÏ
î.á. òÏÇÁÎÏ×Á
æÕÎË ÉÏÎÁÌØÎÏÅ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÅ ÕÞÅÂÎÏÅ ÏÓÏÂÉÅ ÄÌÑ ×ÙÓÛÉÈ ÕÞÅÂÎÙÈ ÚÁ×ÅÄÅÎÉÊ ÄÌÑ ÓÔÕÄÅÎÔÏ× ÚÁÏÞÎÏÊ (ÄÉÓÔÁÎ ÉÏÎÎÏÊ) ÆÏÒÍÙ ÏÂÕÞÅÎÉÑ
çéîæï íÏÓË×Á 2002
ââë 32.97 õäë 681.3 òÏÇÁÎÏ×Á î.á. æÕÎË ÉÏÎÁÌØÎÏÅ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÅ: õÞÅÂÎÏÅ ÏÓÏÂÉÅ ÄÌÑ ÓÔÕÄÅÎÔÏ× ×ÙÓÛÉÈ ÕÞÅÂÎÙÈ ÚÁ×ÅÄÅÎÉÊ
2002. 260 Ó.
í.: çéîæï,
õÞÅÂÎÏÅ ÏÓÏÂÉÅ ÒÅÄÎÁÚÎÁÞÅÎÏ ÄÌÑ ÓÔÕÄÅÎÔÏ× ×ÙÓÛÉÈ ÕÞÅ ÎÙÈ ÚÁ×ÅÄÅÎÉÊ ÓÅ ÉÁÌØÎÏÓÔÅÊ 351500 É 510200 É ÓÏÏÔ×ÅÔÓÔ×ÕÅÔ ÒÏÇÒÁÍÍÅ ËÕÒÓÁ ¾æÕÎË ÉÏÎÁÌØÎÏÅ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÅ¿, ÉÚÕÞÁÅ ÍÏÇÏ × ÔÅÞÅÎÉÉ ×ÏÓØÍÏÇÏ ÓÅÍÅÓÔÒÁ. äÁÎÎÏÅ ÏÓÏÂÉÅ ÍÏÖÅÔ ÂÙÔØ ÏÌÅÚÎÏ ×ÓÅÍ ÖÅÌÁÀÝÉÍ ÕÇÌÕÂÉÔØ Ó×ÏÅ ÒÅÄÓÔÁ×ÌÅÎÉÅ Ï ×ÏÚÍÏÖÎÏ ÓÔÑÈ ÓÏ×ÒÅÍÅÎÎÙÈ ÑÚÙËÏ× ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÑ. ðÏÓÏÂÉÅ ÚÎÁËÏÍÉÔ Ó ÄÉÒÅËÔÉ×ÎÙÍ ÓÔÉÌÅÍ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÑ, ÉÓÏÌØÚÕÑ × ËÁÞÅÓÔ×Å ÑÚÙËÁ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÑ Haskell, ËÏÔÏÒÙÊ ÓÏÞÅÔÁÅÔ ÞÅÒÔÙ ÞÉÓÔÏ ÆÕÎË ÉÏÎÁÌØÎÏÇÏ ÑÚÙËÁ Ó ×ÏÚÍÏÖÎÏÓÔÑÍÉ ÏÂßÅËÔÎÏ-ÏÒÉÅÎÔÉÒÏ×ÁÎÎÏÇÏ ÓÔÉÌÑ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÑ. éÚÌÏÖÅÎÉÅ ÎÁÞÉÎÁÅÔÓÑ Ó ÒÁÓÓÍÏÔÒÅÎÉÑ ÏÓÎÏ× ÆÕÎË ÉÏÎÁÌØÎÏÇÏ ÒÏÇÒÁÍÍÉÒÏ ×ÁÎÉÑ, ÒÏÄÏÌÖÁÅÔÓÑ ÉÚÌÏÖÅÎÉÅÍ ÍÅÔÏÄÏ× ÎÁÉÓÁÎÉÑ ÒÏÓÔÅÊÛÉÈ ÒÏÇÒÁÍÍ ÎÁ ÑÚÙËÅ Haskell, É ÚÁ×ÅÒÛÁÅÔÓÑ ËÒÁÔËÉÍ ÚÎÁËÏÍÓÔ×ÏÍ ÓÏ ÓÒÅÄÓÔ×ÁÍÉ ××ÏÄÁ É ×Ù×ÏÄÁ ÉÎÆÏÒÍÁ ÉÉ. ïÓÏÂÅÎÎÏÓÔØÀ ËÕÒÓÁ Ñ×ÌÑÅÔÓÑ ÔÏ, ÞÔÏ ÒÁÓÓÍÁÔÒÉ×ÁÅÍÙÊ ÍÁÔÅ ÒÉÁÌ ÎÅ ÒÉ×ÑÚÙ×ÁÅÔÓÑ ÖÅÓÔËÏ Ë ÏÒÅÄÅÌÅÎÎÏÊ ÏÅÒÁ ÉÏÎÎÏÊ ÓÉ ÓÔÅÍÅ. ðÒÉ×ÅÄÅÎÎÙÅ × ÕÞÅÂÎÏÍ ÏÓÏÂÉÉ ÒÏÇÒÁÍÍÙ ÒÁÂÏÔÏÓÏÓÏ ÎÙ × Ä×ÕÈ ÎÁÉÂÏÌÅÅ ÒÁÓÒÏÓÔÒÁÎÅÎÎÙÈ ÎÁ ÓÅÇÏÄÎÑÛÎÉÊ ÄÅÎØ ÏÅ ÒÁ ÉÏÎÎÙÈ ÓÉÓÔÅÍÁÈ: Windows É Linux.
ðÏÄÇÏÔÏ×ÌÅÎÏ É ÉÚÄÁÅÔÓÑ Ï ÚÁËÁÚÕ éÎÓÔÉÔÕÔÁ éîæï ðÅÞÁÔÁÅÔÓÑ × Á×ÔÏÒÓËÏÊ ÒÅÄÁË ÉÉ ðÏÄÉÓÁÎÏ × ÅÞÁÔØ 20.12.02 æÏÒÍÁÔ ÂÕÍÁÇÉ 60x90/16 õÓÌ.ÅÞ.Ì. 16,25 õÞ.-ÉÚÄ.Ì. 17,3 ÉÒÁÖ 300
óÄÁÎÏ × ÒÏÉÚ×ÏÄÓÔ×Ï 21.12.02 âÕÍ. ÍÎÏÖ. ÅÍ. ÌÁÎ 2002 Ç., 1-11/02 úÁËÁÚ 474
ïïð çéîæï, 109280, íÏÓË×Á, á×ÔÏÚÁ×ÏÄÓËÁÑ, 16
î.á. òÏÇÁÎÏ×Á, 2002
éÎÓÔÉÔÕÔ éîæï, 2002
óÏÄÅÒÖÁÎÉÅ ðÒÅÄÉÓÌÏ×ÉÅ
6
çÌÁ×Á I. æÕÎË ÉÏÎÁÌØÎÁÑ ÁÒÁÄÉÇÍÁ × ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÉ 1. óÔÉÌÉ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÑ 2. æÕÎÄÁÍÅÎÔÁÌØÎÙÅ ËÏÎ Å ÉÉ 2.1. ÷ÅÌÉÞÉÎÙ 2.2. æÕÎË ÉÉ 2.3. ëÏÍÏÚÉ ÉÑ ÆÕÎË ÉÊ 3. ÷ÉÄÙ ×ÙÞÉÓÌÅÎÉÊ 3.1. ìÅÎÉ×ÙÅ É ÜÎÅÒÇÉÞÎÙÅ ×ÙÞÉÓÌÅÎÉÑ 3.2. óÔÒÏÇÉÅ ÆÕÎË ÉÉ 4. Haskell ËÁË ÑÚÙË æð
8 8 9 11 11 12 13 14 14 16
çÌÁ×Á II. úÎÁËÏÍÓÔ×Ï Ó ÑÚÙËÏÍ Haskell 1. îÁÞÁÌÏ ÒÁÂÏÔÙ Ó Hugs 1.1. ëÏÍÁÎÄÙ ÉÎÔÅÒÒÅÔÁÔÏÒÁ 1.2. óÅÓÓÉÉ É ÓËÒÉÔÙ 1.3. ¾Literate style¿ 2. âÁÚÏ×ÙÅ ÔÉÙ ÑÚÙËÁ Haskell 2.1. æÕÎË ÉÉ 2.2. þÉÓÌÁ 2.3. ìÏÇÉÞÅÓËÉÅ ×ÅÌÉÞÉÎÙ 2.4. óÉÍ×ÏÌÙ 2.5. óÉÓËÉ 2.6. õÏÒÑÄÏÞÅÎÎÙÅ ÍÎÏÖÅÓÔ×Á (tuples) 3. úÁÄÁÎÉÅ ÆÕÎË ÉÊ 3.1. ëÏÍÂÉÎÁ ÉÉ ÆÕÎË ÉÊ 3.2. þÁÓÔÎÙÅ ÏÒÅÄÅÌÅÎÉÑ 3.3. ïÒÅÄÅÌÅÎÉÑ Ó ÁÌØÔÅÒÎÁÔÉ×ÁÍÉ 3.4. ïÈÒÁÎÎÙÅ ×ÙÒÁÖÅÎÉÑ 3.5. óÏÏÓÔÁ×ÌÅÎÉÅ Ó ÏÂÒÁÚ ÏÍ 3.6. ïÒÅÄÅÌÅÎÉÅ ÒÅËÕÒÓÉÅÊ ÉÌÉ ÉÎÄÕË ÉÑ
18 18 18 19 23 27 28 29 34 36 40 43 46 47 48 51 52 54 58
3
óÏÄÅÒÖÁÎÉÅ
4 3.7. óÎÏ×Á Ï Ä×ÕÍÅÒÎÏÍ ÓÉÎÔÁËÓÉÓÅ
61
çÌÁ×Á III. æÕÎË ÉÉ × ÑÚÙËÅ Haskell 1. ðÏÌÉÍÏÒÆÉÚÍ É ÅÒÅÇÒÕÚËÁ ÆÕÎË ÉÊ 2. ïÅÒÁÔÏÒÙ 2.1. ðÒÅÆÉËÓÎÁÑ É ÉÎÆÉËÓÎÁÑ ÎÏÔÁ ÉÉ 2.2. ðÒÉÏÒÉÔÅÔ ÏÅÒÁÔÏÒÏ× 2.3. áÓÓÏ ÉÁÔÉ×ÎÏÓÔØ ÏÅÒÁÔÏÒÏ× 2.4. ïÒÅÄÅÌÅÎÉÅ ÏÅÒÁÔÏÒÏ× 3. ëÁÒÒÉÎÇ ( urrying) 3.1. þÁÓÔÉÞÎÁÑ ÁÒÁÍÅÔÒÉÚÁ ÉÑ 3.2. óËÏÂËÉ × ÆÕÎË ÉÏÎÁÌØÎÏÊ ÚÁÉÓÉ 3.3. ïÅÒÁÔÏÒÎÙÅ ÓÅË ÉÉ
64 64 71 71 72 73 74 77 77 79 81
çÌÁ×Á IV. æÕÎË ÉÉ ×ÙÓÛÅÇÏ ÏÒÑÄËÁ 1. æÕÎË ÉÉ ÎÁ ÓÉÓËÁÈ 2. éÔÅÒÁ ÉÑ 3. ëÏÍÏÚÉ ÉÑ ÆÕÎË ÉÊ 4. ìÑÍÂÄÁ ÆÕÎË ÉÉ
84 84 90 91 94
çÌÁ×Á V. þÉÓÌÏ×ÙÅ ÆÕÎË ÉÉ 1. òÁÂÏÔÁ Ó ÅÌÙÍÉ ÞÉÓÌÁÍÉ 1.1. ðÏÌÕÞÅÎÉÅ ÓÉÓËÁ ÒÏÓÔÙÈ ÞÉÓÅÌ 1.2. ïÒÅÄÅÌÅÎÉÅ ÄÎÑ ÎÅÄÅÌÉ 1.3. óÔÒÁÔÅÇÉÉ ÒÁÚÒÁÂÏÔËÉ ÒÏÇÒÁÍÍ 2. þÉÓÌÅÎÎÙÅ ×ÙÞÉÓÌÅÎÉÑ 2.1. þÉÓÌÅÎÎÏÅ ÄÉÆÆÅÒÅÎ ÉÒÏ×ÁÎÉÅ 2.2. ÷ÙÞÉÓÌÅÎÉÅ Ë×ÁÄÒÁÔÎÏÇÏ ËÏÒÎÑ 2.3. îÕÌÉ ÆÕÎË ÉÉ 2.4. ïÂÒÁÔÎÁÑ ÆÕÎË ÉÑ
96 96 97 98 100 101 101 102 104 105
çÌÁ×Á VI. óÔÒÕËÔÕÒÙ ÄÁÎÎÙÈ 1. óÉÓËÉ 1.1. ïÒÅÄÅÌÅÎÉÅ ÓÉÓËÁ 1.2. æÕÎË ÉÉ ÎÁ ÓÉÓËÁÈ 1.3. óÏÒÔÉÒÏ×ËÁ ÓÉÓËÏ× 1.4. æÕÎË ÉÉ ×ÙÓÛÅÇÏ ÏÒÑÄËÁ ÎÁ ÓÉÓËÁÈ 2. áÂÓÔÒÁË ÉÉ ÓÉÓËÏ× 3. âÅÓËÏÎÅÞÎÙÅ ÓÉÓËÉ 3.1. óÏÚÄÁÎÉÅ ÂÅÓËÏÎÅÞÎÙÈ ÓÉÓËÏ× 3.2. æÕÎË ÉÉ ÎÁ ÂÅÓËÏÎÅÞÎÙÈ ÓÉÓËÁÈ 3.3. ðÒÉÍÅÒÙ ÒÉÍÅÎÅÎÉÑ ÂÅÓËÏÎÅÞÎÙÈ ÓÉÓËÏ× 4. ëÏÒÔÅÖÉ
108 108 108 110 117 120 132 136 136 139 141 147
5 4.1. éÓÏÌØÚÏ×ÁÎÉÅ ËÏÒÔÅÖÅÊ 4.2. ëÏÒÔÅÖÉ É ÓÉÓËÉ 4.3. ëÏÒÔÅÖÉ É ËÁÒÒÉÎÇ 5. óÉÎÏÎÉÍÙ 5.1. òÁ ÉÏÎÁÌØÎÙÅ ÞÉÓÌÁ
147 150 152 152 157
çÌÁ×Á VII. Haskell ËÁË ÑÚÙË ïïð 1. ïÂßÅËÔÎÏ-ÏÒÉÅÎÔÉÒÏ×ÁÎÎÏÅ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÅ 1.1. éÎËÁÓÕÌÑ ÉÑ É ÎÁÓÌÅÄÏ×ÁÎÉÅ 1.2. ëÌÁÓÓÙ É ÅÒÅÇÒÕÚËÁ 2. ÷ÓÔÒÏÅÎÎÙÅ ËÌÁÓÓÙ 2.1. ëÌÁÓÓ Eq 2.2. ëÌÁÓÓ Ord 2.3. ëÌÁÓÓÙ Show É Read 2.4. ëÌÁÓÓ Enum 2.5. ëÌÁÓÓÙ ÞÉÓÅÌ 3. áÌÇÅÂÒÁÉÞÅÓËÉÅ ÔÉÙ ÄÁÎÎÙÈ 3.1. ïÒÅÄÅÌÅÎÉÅ ÎÏ×ÙÈ ÔÉÏ× ÄÁÎÎÙÈ 3.2. ðÅÒÅÞÉÓÌÑÅÍÙÅ ÔÉÙ 3.3. ðÏÌÉÍÏÒÆÎÙÅ ÔÉÙ ÄÁÎÎÙÈ 3.4. ïÂßÑ×ÌÅÎÉÅ ÒÅËÕÒÓÉ×ÎÙÈ ÔÉÏ× ÄÁÎÎÙÈ 3.5. íÅÔËÉ ÏÌÅÊ 3.6. óÔÒÏÇÉÊ ËÏÎÓÔÒÕËÔÏÒ × data ÄÅËÌÁÒÁ ÉÉ 3.7. îÏ×ÙÅ ÔÉÙ: ÄÅËÌÁÒÁ ÉÑ newtype 4. ðÒÉÍÅÒÙ ÓÔÒÕËÔÕÒÉÒÏ×ÁÎÎÙÈ ÔÉÏ× ÄÁÎÎÙÈ 4.1. É Angle 4.2. É Day 4.3. ÷ÅËÔÏÒÁ É ÍÁÔÒÉ Ù 5. éÎËÁÓÕÌÑ ÉÑ ÄÁÎÎÙÈ × ÍÏÄÕÌÑÈ 5.1. îÅÏÂÈÏÄÉÍÏÓÔØ ÓÏËÒÙÔÉÑ ÄÁÎÎÙÈ 5.2. íÏÄÕÌÉ: ÜËÓÏÒÔ É ÉÍÏÒÔ 5.3. ëÏÎÔÒÏÌØ ÒÏÓÔÒÁÎÓÔ×Á ÉÍÅÎ 5.4. íÏÄÕÌØ ËÁË ÓÏÓÏ ÒÅÁÌÉÚÁ ÉÉ áä 5.5. âÉÂÌÉÏÔÅËÉ ÒÏÇÒÁÍÍ
163 163 164 166 168 168 171 173 175 176 177 177 177 183 185 195 198 201 206 206 208 211 223 223 224 229 231 238
çÌÁ×Á VIII. ÷×ÏÄ É ×Ù×ÏÄ ÉÎÆÏÒÍÁ ÉÉ 1. éÎÔÅÒÁËÔÉ×ÎÙÊ ××ÏÄ É ×Ù×ÏÄ 2. èÒÁÎÅÎÉÅ ÉÎÆÏÒÍÁ ÉÉ × ÆÁÊÌÁÈ 3. çÒÁÆÉÞÅÓËÉÊ ÉÎÔÅÒÆÅÊÓ (GUI)
244 244 250 254
ìÉÔÅÒÁÔÕÒÁ
257
ðÒÅÄÍÅÔÎÙÊ ÕËÁÚÁÔÅÌØ
258
ðÒÅÄÉÓÌÏ×ÉÅ ïÂÝÉÊ ÒÉÎ É ÒÁÓÒÏÓÔÒÁÎÅÎÉÑ ÚÎÁÎÉÊ: ÎÏ×ÏÅ ÏÂÅÖÄÁÅÔ ÎÅ ÏÔÏÍÕ, ÞÔÏ ÓÔÁÒÉËÉ ÅÇÏ ×ÙÕÞÉ ×ÁÀÔ, Á ÏÔÏÍÕ ÞÔÏ ÒÉÈÏÄÑÔ ÎÏ×ÙÅ ÏËÏÌÅÎÉÑ, ËÏÔÏÒÙÅ ÅÇÏ ÚÎÁÀÔ.
ëÎÉÇÁ Ñ×ÌÑÅÔÓÑ ÕÞÅÂÎÙÍ ÏÓÏÂÉÅÍ Ï ÏÓÎÏ×ÁÍ ÒÏÇÒÁÍÍÉÒÏ×Á ÎÉÑ × ÔÁË ÎÁÚÙ×ÁÅÍÏÍ ÆÕÎË ÉÏÎÁÌØÎÏÍ ÓÔÉÌÅ. ÷ ËÁÞÅÓÔ×Å ÏÓÎÏ×ÎÏ ÇÏ ÑÚÙËÁ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÑ ÉÓÏÌØÚÕÅÔÓÑ Haskell ÓÏ×ÒÅÍÅÎÎÙÊ ÑÚÙË, ÏÚ×ÏÌÑÀÝÉÊ ÒÏÉÌÌÀÓÔÒÉÒÏ×ÁÔØ ×ÓÅ ÏÓÎÏ×ÎÙÅ ËÏÎ Å ÉÉ ÆÕÎË ÉÏÎÁÌØÎÏÇÏ ÓÔÉÌÑ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÑ. ðÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÅ × ÆÕÎË ÉÏÎÁÌØÎÏÍ ÓÔÉÌÅ ÚÎÁÞÉÔÅÌØÎÏ ÏÔ ÌÉÞÁÅÔÓÑ ÏÔ ÂÏÌÅÅ ÛÉÒÏËÏ ÒÁÓÒÏÓÔÒÁÎÅÎÎÏÇÏ ÉÍÅÒÁÔÉ×ÎÏÇÏ (ÄÉ ÒÅËÔÉ×ÎÏÇÏ) ÓÔÉÌÑ. ðÏ ÉÓÔÏÒÉÞÅÓËÉÍ ÒÉÞÉÎÁÍ ÅÒ×ÙÅ ÒÏÇÒÁÍ ÍÙ ÓÏÓÔÏÑÌÉ ÉÚ ÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔÉ ÍÁÛÉÎÎÙÈ ÉÎÓÔÒÕË ÉÊ ÒÏ ÇÒÁÍÍÙ ÞÁÝÅ ×ÓÅÇÏ ÒÅÄÓÔÁ×ÌÑÀÔ ÓÏÂÏÊ ÎÁÂÏÒ ÉÎÓÔÒÕË ÉÊ ÄÌÑ ÒÁÂÏÔÙ Ó ÑÞÅÊËÁÍÉ ËÏÍØÀÔÅÒÎÏÊ ÁÍÑÔÉ. ðÒÉÓ×ÁÉ×ÁÎÉÑ, ÉÚÍÅ ÎÅÎÉÅ ÓÏÄÅÒÖÉÍÏÇÏ ÑÞÅÅË, ÅÒÅÄÁÞÁ ÕÒÁ×ÌÅÎÉÑ ÎÁ ÄÒÕÇÉÅ ÂÌÏËÉ ÉÎÓÔÒÕË ÉÊ ×ÏÔ ÏÓÎÏ×ÎÙÅ ÞÁÓÔÉ ÒÏÇÒÁÍÍ, ÎÁÉÓÁÎÎÙÈ × ÒÏ Å ÄÕÒÎÏÍ ÓÔÉÌÅ. ðÒÏÇÒÁÍÍÙ, ÎÁÉÓÁÎÎÙÅ × ÞÉÓÔÏ ÆÕÎË ÉÏÎÁÌØÎÏÍ ÓÔÉÌÅ, ÓÏ ÓÔÏÑÔ ÌÉÛØ ÉÚ ÏÂßÑ×ÌÅÎÉÊ É ÏÒÅÄÅÌÅÎÉÊ ÆÕÎË ÉÊ, ÏÎÉ ÎÅ ÓÏÄÅÒ ÖÁÔ ÏÅÒÁÔÏÒÏ× ÒÉÓ×ÁÉ×ÁÎÉÑ É ÏÜÔÏÍÕ ÎÅ ÍÏÇÕÔ ÉÍÅÔØ ÏÂÏÞÎÙÈ ÜÆÆÅËÔÏ×, Ó×ÑÚÁÎÎÙÈ Ó ÉÚÍÅÎÅÎÉÅÍ ÚÎÁÞÅÎÉÊ ÅÒÅÍÅÎÎÙÈ. òÅÚÕÌØ ÔÁÔÏÍ ÒÁÂÏÔÙ ÔÁËÏÊ ÒÏÇÒÁÍÍÙ Ñ×ÌÑÀÔÓÑ ×ÙÞÉÓÌÅÎÎÙÅ ÚÎÁÞÅÎÉÑ ÏÄÎÏÊ ÉÌÉ ÎÅÓËÏÌØËÉÈ ÆÕÎË ÉÊ. Haskell Ñ×ÌÑÅÔÓÑ ÑÚÙËÏÍ, ÏÄÄÅÒÖÉ×ÁÀÝÉÍ ÏÌÉÍÏÒ ÆÉÚÍ ÔÉÏ× É ÌÅÎÉ×ÙÅ ×ÙÞÉÓÌÅÎÉÑ, ÏÎ ÏÔÎÏÓÉÔÓÑ Ë ÞÉÓÔÏ ÆÕÎË ÉÏÎÁÌØÎÙÍ ÑÚÙËÁÍ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÑ, ÏÔÌÉÞÁÑÓØ ÒÉ ÜÔÏÍ ÏÔ ×ÓÅÈ ÄÒÕÇÉÈ ÆÕÎË ÉÏÎÁÌØÎÙÈ ÑÚÙËÏ×. Haskell ÂÁÚÉÒÕÅÔÓÑ ÎÁ ÌÑÍÂÄÁ ÉÓÞÉÓÌÅÎÉÉ (lambda al ulus), Ï ÜÔÏÍÕ ÇÒÅÞÅÓËÁÑ ÂÕË×Á Ñ×ÌÑÅÔÓÑ ÅÇÏ ÜÍÂÌÅÍÏÊ.
6
ðÒÅÄÉÓÌÏ×ÉÅ
7
ó×ÏÅ ÉÍÑ ÜÔÏÔ ÑÚÙË ÏÌÕÞÉÌ × ÞÅÓÔØ ÍÁÔÅÍÁÔÉËÁ É ÌÏÇÉËÁ èÁÓ ËÅÌÌÁ âÒÕËÓ ëÁÒÒÉ (Haskell Brooks Curry), ÞØÉ ÒÁÂÏÔÙ Ï ÍÁÔÅ ÍÁÔÉÞÅÓËÏÊ ÌÏÇÉËÅ Ñ×ÉÌÉÓØ ÆÕÎÄÁÍÅÎÔÏÍ ÄÌÑ ÓÅÍÅÊÓÔ×Á ÆÕÎË É ÏÎÁÌØÎÙÈ ÑÚÙËÏ× (ÎÁÒÉÍÅÒ, Curry). ðÒÉ ÉÚÌÏÖÅÎÉÉ ÍÁÔÅÒÉÁÌÁ ÒÅÄÏÌÁÇÁÅÔÓÑ, ÞÔÏ ÞÉÔÁÔÅÌØ ÕÖÅ ÏÂÌÁÄÁÅÔ ÎÅËÏÔÏÒÙÍ ÏÙÔÏÍ ÒÁÂÏÔÙ ÎÁ ËÏÍØÀÔÅÒÅ É ÉÍÅÅÔ ÒÅÄ ÓÔÁ×ÌÅÎÉÅ Ï ÓÏ×ÒÅÍÅÎÎÙÈ ÉÎÆÏÒÍÁ ÉÏÎÎÙÈ ÔÅÈÎÏÌÏÇÉÑÈ (× ÞÁÓÔ ÎÏÓÔÉ, ÚÎÁËÏÍ Ó ÏÎÑÔÉÅÍ ÉÎÆÏÒÍÁ ÉÉ É ÒÉÎ ÉÁÍÉ ÅÅ ËÏÄÉÒÏ×Á ÎÉÑ, ÎÁÚÎÁÞÅÎÉÅÍ ÏÅÒÁ ÉÏÎÎÙÈ ÓÉÓÔÅÍ É ÉÈ ÓÏ×ÒÅÍÅÎÎÏÍ ÓÏÓÔÏÑ ÎÉÅÍ, ÕÍÅÅÔ ÒÁÂÏÔÁÔØ Ó ÒÅÄÁËÔÏÒÁÍÉ ÎÅÆÏÒÍÁÔÉÒÏ×ÁÎÎÏÇÏ ÔÅËÓÔÁ É Ô. Ä.). ÷ ËÎÉÇÅ ÉÓÏÌØÚÕÀÔÓÑ ÎÅËÏÔÏÒÙÅ ÏÂÏÚÎÁÞÅÎÉÑ, ÏÍÏÇÁÀÝÉÅ ÓÔÒÕËÔÕÒÉÒÏ×ÁÔØ ÉÚÌÁÇÁÅÍÙÊ ÍÁÔÅÒÉÁÌ. ÁË, ÎÁÞÁÌÏ ÕÒÁÖÎÅÎÉÊ ÏÍÅÞÅÎÏ ÚÎÁËÏÍ I, Á ÉÈ ÏËÏÎÞÁÎÉÅ ÚÎÁËÏÍ J. îÁÚÎÁÞÅÎÉÅ ÏÍÅ ÔÏË É H ÎÁ ÏÌÑÈ ËÎÉÇÉ Ó×ÑÚÁÎÏ Ó ÏÒÅÄÅÌÅÎÉÑÍÉ É ×ÙÚÙ×ÁÍÉ ÆÕÎË ÉÊ, ÏÎÏ ÂÕÄÅÔ ÕÔÏÞÎÅÎÏ × ÓÌÅÄÕÀÝÅÊ ÇÌÁ×Å.
çÌÁ×Á I
æÕÎË ÉÏÎÁÌØÎÁÑ ÁÒÁÄÉÇÍÁ × ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÉ 1. óÔÉÌÉ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÑ ÷ ÓÏÒÏËÏ×ÙÈ ÇÏÄÁÈ Ä×ÁÄ ÁÔÏÇÏ ×ÅËÁ ÂÙÌÉ ÏÓÔÒÏÅÎÙ ÅÒ×ÙÅ ËÏÍØÀÔÅÒÙ. ïÎÉ ÕÒÁ×ÌÑÌÉÓØ Ó ÏÍÏÝØÀ ÏÇÒÏÍÎÙÈ ÌÁÔ ÅÒÅ ËÌÀÞÁÔÅÌÅÊ, ÎÏ ËÁË ÔÏÌØËÏ ÓÔÁÌÁ ×ÏÚÍÏÖÎÁ ÚÁÉÓØ ÒÏÇÒÁÍÍÙ × ÁÍÑÔØ ËÏÍØÀÔÅÒÁ, ÏÑ×ÉÌÉÓØ É ÅÒ×ÙÅ ÑÚÙËÉ ÒÏÇÒÁÍÍÉÒÏ×Á ÎÉÑ. éÚ-ÚÁ ÔÏÇÏ, ÞÔÏ × ÔÏ ×ÒÅÍÑ ÉÓÏÌØÚÏ×ÁÎÉÅ ËÏÍØÀÔÅÒÁ ÂÙÌÏ ×ÅÓØÍÁ ÄÏÒÏÇÏ, ÏÞÅ×ÉÄÎÙÍ ×ÙÈÏÄÏÍ ÂÙÌÏ ÓÏÚÄÁÎÉÅ ÑÚÙËÁ ÒÏÇÒÁÍ ÍÉÒÏ×ÁÎÉÑ Ó ÁÒÈÉÔÅËÔÕÒÏÊ, ÎÁÓÔÏÌØËÏ ÂÌÉÚËÏÊ Ë ÁÒÈÉÔÅËÔÕÒÅ ËÏÍ ØÀÔÅÒÁ, ÎÁÓËÏÌØËÏ ×ÏÚÍÏÖÎÏ. ïÓÎÏ×ÎÙÍÉ ËÏÍÏÎÅÎÔÁÍÉ ËÏÍØÀ ÔÅÒÁ Ñ×ÌÑÀÔÓÑ ÒÏ ÅÓÓÏÒ É ÁÍÑÔØ. ðÏÜÔÏÍÕ ÒÏÇÒÁÍÍÁ ÓÏÓÔÏÑÌÁ ÉÚ ÉÎÓÔÒÕË ÉÊ, ÉÚÍÅÎÑÀÝÉÈ ÁÍÑÔØ É ÉÓÏÌÎÑÅÍÙÈ ÒÏ ÅÓÓÏÒÏÍ. îÁÓÔÕÉÌÏ ×ÒÅÍÑ .
ÉÍÅÒÁÔÉ×ÎÏÇÏ ÓÔÉÌÑ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÑ
á × ÍÁÔÅÍÁÔÉËÅ, ÕÖÅ ÎÁ ÒÏÔÑÖÅÎÉÉ ÎÅÓËÏÌØËÉÈ ÓÔÏÌÅÔÉÊ, ÁËÔÉ×ÎÏ ÉÓÏÌØÚÏ×ÁÌÏÓØ ÏÎÑÔÉÅ ÆÕÎË ÉÉ. ó ÏÍÏÝØÀ ÆÕÎË ÉÊ ÍÏÖÎÏ ×ÙÒÁÚÉÔØ Ó×ÑÚØ ÍÅÖÄÕ ÁÒÁÍÅÔÒÁÍÉ (ÁÒÇÕÍÅÎÔÁÍÉ, ×ÈÏÄÎÙ ÍÉ ÄÁÎÎÙÍÉ) É ÒÅÚÕÌØÔÁÔÏÍ (×Ù×ÏÄÏÍ) ÏÒÅÄÅÌÅÎÎÏÇÏ ÒÏ ÅÓÓÁ. ÷ ËÁÖÄÏÍ ×ÙÞÉÓÌÅÎÉÉ ÒÅÚÕÌØÔÁÔ ÏÒÅÄÅÌÅÎÎÙÍ ÏÂÒÁÚÏÍ ÚÁ×ÉÓÉÔ ÏÔ ÁÒÁÍÅÔÒÏ×. ðÏÜÔÏÍÕ ÆÕÎË ÉÉ ÈÏÒÏÛÉÊ ÉÎÓÔÒÕÍÅÎÔ ÄÌÑ ÒÏ×Å ÄÅÎÉÑ ×ÙÞÉÓÌÅÎÉÊ. éÈ ÉÓÏÌØÚÏ×ÁÎÉÅ É ÌÅÇÌÏ × ÏÓÎÏ×Õ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÑ. ðÒÏÇÒÁÍÍÁ, ÎÁÉÓÁÎÎÁÑ × ÔÁ ËÏÍ ÓÔÉÌÅ, ÓÏÓÔÏÉÔ ÉÚ ÏÒÅÄÅÌÅÎÉÊ ÏÄÎÏÊ ÉÌÉ ÎÅÓËÏÌØËÉÈ ÆÕÎË ÉÊ. ðÒÉ ×ÙÏÌÎÅÎÉÉ ÒÏÇÒÁÍÍÙ ÆÕÎË ÉÑÍ ÅÒÅÄÁÀÔÓÑ ÁÒÁÍÅÔÒÙ É ×ÙÞÉÓÌÑÅÔÓÑ ÉÈ ÒÅÚÕÌØÔÁÔ.
ÆÕÎË ÉÏ
ÎÁÌØÎÏÇÏ ÓÔÉÌÑ
ðÒÉ ÒÏÄÏÌÖÁÀÝÅÊÓÑ ÔÅÎÄÅÎ ÉÉ ÕÄÅÛÅ×ÌÅÎÉÑ ËÏÍØÀÔÅÒÎÏ ÇÏ ×ÒÅÍÅÎÉ É Õ×ÅÌÉÞÅÎÉÉ ÒÁÓÈÏÄÏ× ÎÁ ÏÌÁÔÕ ÔÒÕÄÁ ÒÁÚÒÁÂÏÔÞÉËÁ 8
2. æÕÎÄÁÍÅÎÔÁÌØÎÙÅ ËÏÎ Å ÉÉ
9
(ÒÏÇÒÁÍÍÉÓÔÁ) ÓÔÁÎÏ×ÉÔÓÑ ×ÓÅ ÂÏÌÅÅ ×ÁÖÎÏÊ ×ÏÚÍÏÖÎÏÓÔØ ÏÉÓÁ ÎÉÑ ×ÙÞÉÓÌÅÎÉÊ × ÑÚÙËÅ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÑ ÔÅÒÍÉÎÁÍÉ ÂÏÌÅÅ ÂÌÉÚ ËÉÍÉ Ë ¾ÞÅÌÏ×ÅÞÅÓËÏÍÕ ÍÉÒÕ¿, ÞÅÍ Ë ÍÉÒÕ ËÏÍØÀÔÅÒÏ×. æÕÎË É ÏÎÁÌØÎÙÅ ÑÚÙËÉ ÓÏÞÅÔÁÀÔ × ÓÅÂÅ ÔÒÁÄÉ ÉÉ ÍÁÔÅÍÁÔÉËÉ É ÎÅÚÁ×É ÓÉÍÏÓÔÉ ÏÔ ËÏÎËÒÅÔÎÏÊ ÁÒÈÉÔÅËÔÕÒÙ ËÏÍØÀÔÅÒÁ. ÅÏÒÅÔÉÞÅÓËÁÑ ÏÓÎÏ×Á ÉÍÅÒÁÔÉ×ÎÙÈ ÑÚÙËÏ× ÂÙÌÁ ÒÁÚÒÁÂÏÔÁÎÁ × ÔÒÉÄ ÁÔÙÈ ÇÏÄÁÈ Ä×ÁÄ ÁÔÏÇÏ ×ÅËÁ áÌÁÎÏÍ ØÀÒÉÎÇÏÍ (× áÎÇÌÉÉ) É äÖÏÎÏÍ ÆÏÎ îØÀÍÁÎÏÍ (× óûá). ÅÏÒÉÑ ÆÕÎË ÉÊ, ËÁË ÍÏÄÅÌØ ÄÌÑ ×ÙÞÉÓÌÅÎÉÊ, ÔÁËÖÅ ÒÉÛÌÁ ÉÚ Ä×ÁÄ ÁÔÙÈ É ÔÒÉÄ ÁÔÙÈ ÇÏÄÏ×. óÒÅÄÉ ÏÓÎÏ×ÁÔÅÌÅÊ ÂÙÌÉ í. ûÏÎÆÉÎËÅÌØ (× çÅÒÍÁÎÉÉ É òÏÓÓÉÉ), èÁÓËÅÌÌ ëÁÒÒÉ (× áÎÇÌÉÉ) É áÌÏÎÓÏ þÅÒÞ (× óûá). ÷ ÎÁÞÁÌÅ ÑÔÉÄÅÓÑÔÙÈ ÇÏÄÏ× ÏÑ×ÉÌÉÓØ ÉÄÅÉ ÒÅÁÌØÎÏÇÏ ÉÓÏÌØ ÚÏ×ÁÎÉÑ ÜÔÏÊ ÔÅÏÒÉÉ × ËÁÞÅÓÔ×Å ÏÓÎÏ×Ù ÄÌÑ ÑÚÙËÁ ÒÏÇÒÁÍÍÉÒÏ×Á ÎÉÑ. ñÚÙË Lisp äÖÏÎÁ íÁËëÁÒÔÉ ÂÙÌ ÅÒ×ÙÍ ÆÕÎË ÉÏÎÁÌØÎÙÍ ÑÚÙËÏÍ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÑ É ÏÎ ÏÓÔÁ×ÁÌÓÑ ÅÄÉÎÓÔ×ÅÎÎÙÍ ÄÏÌÇÉÅ ÇÏÄÙ. îÅÓÍÏÔÒÑ ÎÁ ÔÏ, ÞÔÏ Lisp ÄÏ ÓÉÈ ÏÒ ÉÓÏÌØÚÕÅÔÓÑ, ÏÎ ÎÅ ÕÄÏ×ÌÅÔ×ÏÒÑÅÔ ÍÎÏÇÉÍ ÓÏ×ÒÅÍÅÎÎÙÈ ÏÔÒÅÂÎÏÓÔÑÍ. ÷ 80-È ÏÑ×É ÌÏÓØ ÂÏÌØÛÏÅ ÞÉÓÌÏ ÆÕÎË ÉÏÎÁÌØÎÙÈ ÑÚÙËÏ× ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÑ: ML, S heme (ÍÏÄÉÆÉ ÉÒÏ×ÁÎÎÙÊ Lisp), Miranda ×ÏÔ ÎÅÓËÏÌØËÏ ÏÄÏÂÎÙÈ ÑÚÙËÏ×. ðÒÁËÔÉÞÅÓËÉ ËÁÖÄÙÊ ÕÞÅÎÙÊ ÔÏÇÏ ×ÒÅÍÅÎÉ ÙÔÁÌÓÑ ÒÁÚÒÁÂÏ ÔÁÔØ Ó×ÏÊ ÑÚÙË. ïÂßÅÄÉÎÉ×ÛÉÓØ ×ÍÅÓÔÅ ÂÏÌØÛÁÑ ÇÒÕÁ ×ÙÄÁÀ ÝÉÈÓÑ ÕÞÅÎÙÈ ÓÏÚÄÁÌÁ ÎÏ×ÙÊ ÑÚÙË, ÓÏÞÅÔÁÀÝÉÊ ÌÕÞÛÉÅ ÓÔÏÒÏ ÎÙ ÒÁÚÌÉÞÎÙÈ ÑÚÙËÏ×. ðÅÒ×ÙÅ ×ÅÒÓÉÉ ÜÔÏÇÏ ÑÚÙËÁ, ÎÁÚ×ÁÎÎÏÇÏ Haskell, ÏÑ×ÉÌÉÓØ × ÎÁÞÁÌÅ 90-È, É ÏÎ ÂÙÓÔÒÏ ÓÔÁÌ ÏÕÌÑÒÎÙÍ.
2. æÕÎÄÁÍÅÎÔÁÌØÎÙÅ ËÏÎ Å ÉÉ æÕÎË ÉÏÎÁÌØÎÏÅ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÅ ÏÂÑÚÁÎÏ Ó×ÏÉÍ ÎÁÚ×ÁÎÉÅÍ ÔÏÍÕ ÆÁËÔÕ, ÞÔÏ ÒÏÇÒÁÍÍÙ ÏÌÎÏÓÔØÀ ÓÏÓÔÏÑÔ ÉÚ ÆÕÎË ÉÊ. èÁ ÒÁËÔÅÒÎÏÊ ÞÅÒÔÏÊ ÆÕÎË ÉÏÎÁÌØÎÏÇÏ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÑ Ñ×ÌÑÅÔÓÑ ÔÏÔ ÆÁËÔ, ÞÔÏ, ÎÅÓÍÏÔÒÑ ÎÁ ÏÔÓÕÔÓÔ×ÉÅ ÚÁÄÁÎÎÏÇÏ ÏÒÑÄËÁ ×ÙÞÉÓÌÅ ÎÉÊ, ÒÅÚÕÌØÔÁÔ ÏÒÅÄÅÌÅÎ ÏÄÎÏÚÎÁÞÎÏ. äÒÕÇÉÍÉ ÓÌÏ×ÁÍÉ: ÚÎÁÞÅÎÉÅ ×ÙÒÁÖÅÎÉÑ (ÆÕÎË ÉÉ) ÜÔÏ ×ÅÌÉÞÉÎÁ É ÚÁÄÁÞÁ ËÏÍØÀÔÅÒÁ ÕÒÏ ÓÔÉÔØ ×ÙÒÁÖÅÎÉÅ É ×ÙÞÉÓÌÉÔØ ÅÇÏ ÚÎÁÞÅÎÉÅ. ðÒÏ ÅÄÕÒÎÁÑ ÒÏÇÒÁÍÍÁ ÓÏÓÔÏÉÔ ÉÚ ÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔÉ ÏÅÒÁ ÔÏÒÏ× É ÒÅÄÌÏÖÅÎÉÊ, ÕÒÁ×ÌÑÀÝÉÈ ÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔØÀ ÉÈ ×Ù ÏÌÎÅÎÉÑ. ÉÉÞÎÙÍÉ ÏÅÒÁÔÏÒÁÍÉ Ñ×ÌÑÀÔÓÑ ÏÅÒÁÔÏÒÙ ÒÉÓ×Á É×ÁÎÉÑ É ÅÒÅÄÁÞÉ ÕÒÁ×ÌÅÎÉÑ, ÏÅÒÁÔÏÒÙ ××ÏÄÁ/×Ù×ÏÄÁ É ÓÅ É ÁÌØÎÙÅ ÒÅÄÌÏÖÅÎÉÑ ÄÌÑ ÏÒÇÁÎÉÚÁ ÉÉ ÉËÌÏ×. éÚ ÎÉÈ ÍÏÖÎÏ ÓÏ ÓÔÁ×ÌÑÔØ ÆÒÁÇÍÅÎÔÙ ÒÏÇÒÁÍÍ É ÏÄÒÏÇÒÁÍÍÙ. ÷ ÏÓÎÏ×Å ÔÁËÏÇÏ
10
I. æÕÎË ÉÏÎÁÌØÎÁÑ ÁÒÁÄÉÇÍÁ × ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÉ
ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÑ ÌÅÖÁÔ ×ÚÑÔÉÅ ÚÎÁÞÅÎÉÅ ËÁËÏÊ-ÔÏ ÅÒÅÍÅÎÎÏÊ, ÓÏ×ÅÒÛÅÎÉÅ ÎÁÄ ÎÉÍ ÄÅÊÓÔ×ÉÑ É ÓÏÈÒÁÎÅÎÉÅ ÎÏ×ÏÇÏ ÚÎÁÞÅÎÉÑ Ó Ï ÍÏÝØÀ ÏÅÒÁÔÏÒÁ ÒÉÓ×ÁÉ×ÁÎÉÑ. üÔÏÔ ÒÏ ÅÓÓ ÒÏÄÏÌÖÁÅÔÓÑ ÄÏ ÔÅÈ ÏÒ ÏËÁ ÎÅ ÂÕÄÅÔ ÏÌÕÞÅÎÏ (É, ×ÏÚÍÏÖÎÏ, ÎÁÅÞÁÔÁÎÏ) ÖÅÌÁÅ ÍÏÅ ÏËÏÎÞÁÔÅÌØÎÏÅ ÚÎÁÞÅÎÉÅ. æÕÎË ÉÏÎÁÌØÎÁÑ ÒÏÇÒÁÍÍÁ ÓÏÓÔÏÉÔ ÉÚ ÓÏ×ÏËÕÎÏÓÔÉ ÏÒÅÄÅ ÌÅÎÉÊ ÆÕÎË ÉÊ. æÕÎË ÉÉ, × Ó×ÏÀ ÏÞÅÒÅÄØ, ÒÅÄÓÔÁ×ÌÑÀÔ ÓÏÂÏÊ ×ÙÚÏ×Ù ÄÒÕÇÉÈ ÆÕÎË ÉÊ É ÒÅÄÌÏÖÅÎÉÊ, ÕÒÁ×ÌÑÀÝÉÈ ÏÓÌÅÄÏ×Á ÔÅÌØÎÏÓÔØÀ ×ÙÚÏ×Ï×. ÷ÙÞÉÓÌÅÎÉÑ ÎÁÞÉÎÁÀÔÓÑ Ó ×ÙÚÏ×Á ÎÅËÏÔÏÒÏÊ ÆÕÎË ÉÉ, ËÏÔÏÒÁÑ × Ó×ÏÀ ÏÞÅÒÅÄØ ×ÙÚÙ×ÁÅÔ ÆÕÎË ÉÉ, ×ÈÏÄÑÝÉÅ × ÅÅ ÏÒÅÄÅÌÅÎÉÅ É Ô. Ä. × ÓÏÏÔ×ÅÔÓÔ×ÉÉ Ó ÉÅÒÁÒÈÉÅÊ ÏÒÅÄÅÌÅÎÉÊ É ÓÔÒÕËÔÕÒÏÊ ÕÓÌÏ×ÎÙÈ ÒÅÄÌÏÖÅÎÉÊ. æÕÎË ÉÉ ÞÁÓÔÏ ÌÉÂÏ ÒÑÍÏ, ÌÉÂÏ ÏÏÓÒÅÄÏ×ÁÎÎÏ ×ÙÚÙ×ÁÀÔ ÓÁÍÉ ÓÅÂÑ (ÒÅËÕÒÓÉÑ). ëÁÖÄÙÊ ×ÙÚÏ× ×ÏÚ×ÒÁÝÁÅÔ ÎÅËÏÔÏÒÏÅ ÚÎÁÞÅÎÉÅ × ×ÙÚ×Á×ÛÕÀ ÅÇÏ ÆÕÎË ÉÀ, ×ÙÞÉÓÌÅÎÉÅ ËÏÔÏÒÏÊ ÏÓÌÅ ÜÔÏÇÏ ÒÏÄÏÌÖÁÅÔÓÑ; ÜÔÏÔ ÒÏ ÅÓÓ Ï×ÔÏÒÑÅÔÓÑ ÄÏ ÔÅÈ ÏÒ, ÏËÁ ÚÁÕÓÔÉ×ÛÁÑ ×ÙÞÉÓÌÅÎÉÑ ÆÕÎË ÉÑ ÎÅ ×ÅÒÎÅÔ ËÏÎÅÞÎÙÊ ÒÅÚÕÌØÔÁÔ ÏÌØÚÏ×ÁÔÅÌÀ. ¾þÉÓÔÏÅ¿ ÆÕÎË ÉÏÎÁÌØÎÏÅ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÅ ÎÅ ÒÉÚÎÁÅÔ ÒÉÓ×ÁÉ×ÁÎÉÊ É ÅÒÅÄÁÞ ÕÒÁ×ÌÅÎÉÑ. þÁÓÔÏ ÏÒÅÄÅÌÑÀÔ ÆÕÎË ÉÏÎÁÌØÎÏÅ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÅ ÞÅÒÅÚ ÏÔÒÉ ÁÎÉÅ, ÇÏ×ÏÒÑ, ÞÔÏ ÆÕÎË ÉÏÎÁÌØÎÏÅ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÅ ÜÔÏ:
ðÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÅ, × ËÏÔÏÒÏÍ ÎÅÔ ÏÂÏÞÎÙÈ ÜÆÆÅËÔÏ× (side
effe ts), × ÔÏÍ ÞÉÓÌÅ ÔÒÁÄÉ ÉÏÎÎÏÇÏ ÒÉÓ×ÁÉ×ÁÎÉÑ. åÄÉÎ ÓÔ×ÅÎÎÙÍ ¾ÜÆÆÅËÔÏÍ¿ ×ÙÏÌÎÅÎÉÑ ÌÀÂÏÊ ÆÕÎË ÉÉ Ñ×ÌÑÅÔÓÑ ×ÙÞÉÓÌÅÎÎÙÊ ÒÅÚÕÌØÔÁÔ.
âÙ×ÁÀÔ ÒÅÄËÉÅ ÉÓËÌÀÞÅÎÉÑ, ÎÁÒÉÍÅÒ, ÏÅÒÁ ÉÉ ××ÏÄÁ-×Ù×ÏÄÁ, ËÏÔÏÒÙÅ, ÅÓÔÅÓÔ×ÅÎÎÏ, ÉÚÍÅÎÑÀÔ ÆÉÚÉÞÅÓËÏÅ ÓÏÓÔÏÑÎÉÅ ×ÎÅÛÎÉÈ ÕÓÔÒÏÊÓÔ×.
ðÏÓËÏÌØËÕ ÎÅÔ ÒÉÓ×ÁÉ×ÁÎÉÑ, ÅÒÅÍÅÎÎÙÅ, ÏÌÕÞÉ× ÚÎÁÞÅÎÉÅ
× ÎÁÞÁÌÅ ÂÌÏËÁ ×ÙÞÉÓÌÅÎÉÊ, ÂÏÌØÛÅ ÎÉËÏÇÄÁ ÅÇÏ ÎÅ ÍÅÎÑÀÔ.
üÔÏ ÏÈÏÖÅ ÎÁ ÒÏÌØ ÅÒÅÍÅÎÎÏÊ × ÍÁÔÅÍÁÔÉÞÅÓËÉÈ ÆÏÒÍÕÌÁÈ É × ÍÁÔÅÍÁÔÉËÅ ×ÏÏÂÝÅ. ÁËÉÍ ÏÂÒÁÚÏÍ, ÅÒÅÍÅÎÎÙÅ ÜÔÏ ÒÏÓÔÏ ÓÏËÒÁÝÅÎÎÁÑ ÚÁÉÓØ ÉÈ ÚÎÁÞÅÎÉÊ, É ÎÁ ÍÅÓÔÏ ÅÒÅÍÅÎÎÙÈ × ÒÏ ÇÒÁÍÍÅ ×ÓÅÇÄÁ ÍÏÖÎÏ ×ÓÔÁ×ÉÔØ ÓÁÍÉ ÚÎÁÞÅÎÉÑ).
îÅÔ Ñ×ÎÏÇÏ ÕÒÁ×ÌÅÎÉÑ ÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔØÀ ×ÙÏÌÎÅÎÉÑ
ÏÅÒÁ ÉÊ (flow ontrol).
2. æÕÎÄÁÍÅÎÔÁÌØÎÙÅ ËÏÎ Å ÉÉ
11
ïÔÓÕÔÓÔ×ÉÅ ÏÂÏÞÎÙÈ ÜÆÆÅËÔÏ× ×ÅÄÅÔ Ë ÔÏÍÕ, ÞÔÏ ÏÒÑÄÏË ÒÏ×Å ÄÅÎÉÑ ×ÙÞÉÓÌÅÎÉÊ ÓÔÁÎÏ×ÉÔÓÑ ÎÅÓÕÝÅÓÔ×ÅÎÎÙÍ: ÏÓËÏÌØËÕ ÎÁ ×Ù ÞÉÓÌÑÅÍÙÊ ÒÅÚÕÌØÔÁÔ ÎÅ ×ÌÉÑÀÔ ÎÉËÁËÉÅ ÏÂÏÞÎÙÅ ÜÆÆÅËÔÙ, ÎÅ ×ÁÖÎÏ, ËÏÇÄÁ ×ÙÞÉÓÌÑÔØ ÜÔÏÔ ÒÅÚÕÌØÔÁÔ. ðÒÁËÔÉÞÅÓËÉ ×ÓÅÇÄÁ ÒÏÇÒÁÍÍÁ, ÎÁÉÓÁÎÎÁÑ × ÆÕÎË ÉÏÎÁÌØ ÎÏÍ ÓÔÉÌÅ, ÂÙ×ÁÅÔ ÎÁ ÏÒÑÄÏË ËÏÒÏÞÅ ÒÏÇÒÁÍÍÙ × ÓÔÉÌÅ ÉÍÅ ÒÁÔÉ×ÎÏÍ.
2.1. ÷ÅÌÉÞÉÎÙ ÷ ÆÕÎË ÉÏÎÁÌØÎÏÍ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÉ, ËÁË × ÍÁÔÅÍÁÔÉËÅ, ×Ù ÒÁÖÅÎÉÅ ÉÓÏÌØÚÕÅÔÓÑ ÔÏÌØËÏ ÄÌÑ ÏÉÓÁÎÉÑ (ÉÌÉ ÏÂÏÚÎÁÞÅÎÉÑ) ×Å ÌÉÞÉÎÙ. óÒÅÄÉ ÔÉÏ× ×ÅÌÉÞÉÎ × ×ÙÒÁÖÅÎÉÑÈ ÍÏÇÕÔ ×ÓÔÒÅÞÁÔØÓÑ ÓÌÅÄÕÀÝÉÅ: ÞÉÓÌÁ ÒÁÚÌÉÞÎÙÈ ÔÉÏ×, ÌÏÇÉÞÅÓËÉÅ ×ÅÌÉÞÉÎÙ (truth values), ÓÉÍ×ÏÌÙ, ÕÏÒÑÄÏÞÅÎÎÙÅ ÍÎÏÖÅÓÔ×Á (tuples), ÆÕÎË ÉÉ É ÓÉÓËÉ. ÷ÓÅ ÏÎÉ ÂÕÄÕÔ ÏÉÓÁÎÙ × ÎÁÄÌÅÖÁÝÅÍ ÍÅÓÔÅ ËÕÒÓÁ. ëÁË ÍÙ ÄÁÌÅÅ Õ×ÉÄÉÍ, ×ÏÚÍÏÖÎÏ ÓÏÚÄÁÎÉÅ ÎÏ×ÙÈ ÔÉÏ× ×ÅÌÉÞÉÎ É ÏÒÅ ÄÅÌÅÎÉÅ ÏÅÒÁ ÉÊ ÄÌÑ ÇÅÎÅÒÁ ÉÉ É ÍÁÎÉÕÌÑ ÉÉ ÜÔÉÍÉ ÔÉÁÍÉ. íÏÖÅÔ ÂÙÔØ ÎÅÓËÏÌØËÏ ÒÅÄÓÔÁ×ÌÅÎÉÊ ÏÄÎÏÊ É ÔÏÊ ÖÅ ×ÅÌÉÞÉ ÎÙ. îÁÒÉÍÅÒ ÁÂÓÔÒÁËÔÎÏÅ ÞÉÓÌÏ ÓÏÒÏË ÄÅ×ÑÔØ ÍÏÖÅÔ ÂÙÔØ ÒÅÄ ÓÔÁ×ÌÅÎÏ ÄÅÓÑÔÉÞÎÙÍ ÞÉÓÌÏÍ 49 ÉÌÉ ×ÙÒÁÖÅÎÉÅÍ 7 7. ëÏÍØÀÔÅÒ ÏÂÙÞÎÏ ÏÅÒÉÒÕÅÔ Ó Ä×ÏÉÞÎÙÍ ÒÅÄÓÔÁ×ÌÅÎÉÅÍ ÞÉÓÅÌ (110001).
2.2. æÕÎË ÉÉ îÁÉÂÏÌÅÅ ×ÁÖÎÙÍ ÔÉÏÍ ÄÁÎÎÙÈ × ÆÕÎË ÉÏÎÁÌØÎÏÍ ÒÏÇÒÁÍ ÍÉÒÏ×ÁÎÉÉ Ñ×ÌÑÀÔÓÑ ÆÕÎË ÉÉ. íÙ ÍÏÖÅÍ ÒÉÍÅÎÉÔØ ÆÕÎË ÉÀ Ë ËÁËÉÍ-ÌÉÂÏ ÁÒÇÕÍÅÎÔÁÍ É ×Ù×ÅÓÔÉ ÒÅÚÕÌØÔÁÔÙ (× ÒÅÄÏÌÏÖÅÎÉÉ, ÞÔÏ ÒÅÚÕÌØÔÁÔ ÍÏÖÅÔ ÂÙÔØ ÏËÁÚÁÎ). çÏ×ÏÒÑ ÑÚÙËÏÍ ÍÁÔÅÍÁÔÉËÉ, ÆÕÎË ÉÑ f ÜÔÏ ÚÁËÏÎ ÓÏÏÔ×ÅÔÓÔ×ÉÑ, ËÏÔÏÒÙÊ ÓÏÏÓÔÁ×ÌÑÅÔ ËÁ ÖÄÏÍÕ ÜÌÅÍÅÎÔÕ ÉÚ ÄÁÎÎÏÇÏ ÍÎÏÖÅÓÔ×Á A ÏÄÉÎ ÅÄÉÎÓÔ×ÅÎÎÙÊ ÜÌÅÍÅÎÔ ÉÚ ÍÎÏÖÅÓÔ×Á B . É ÜÌÅÍÅÎÔÏ× ÉÚ ÍÎÏÖÅÓÔ×Á A ÎÁÚÙ×Á ÅÔÓÑ ÉÓÈÏÄÎÙÍ (sour e) ÔÉÏÍ, ÔÉ ÜÌÅÍÅÎÔÏ× ÉÚ ÍÎÏÖÅÓÔ×Á B ÅÌÅ×ÙÍ (target) ÔÉÏÍ ÆÕÎË ÉÉ. óÏËÒÁÝÅÎÎÏ ÍÙ ÂÕÄÅÍ ÚÁÉÓÙ ×ÁÔØ ÜÔÕ ÉÎÆÏÒÍÁ ÉÀ ËÁË f :: A ! B . îÁÒÉÍÅÒ, ÆÕÎË ÉÑ square, ÁÓÓÏ ÉÉÒÕÀÝÁÑ Ó ËÁÖÄÙÍ ÅÌÙÍ ÞÉÓÌÏÍ ÅÇÏ Ë×ÁÄÒÁÔ, ÉÍÅÅÔ ÓÌÅ ÄÕÀÝÉÊ ÔÉ:
square :: Integer -> Integer
ï ÆÕÎË ÉÉ f :: A ! B ÇÏ×ÏÒÑÔ, ÞÔÏ ÏÎÁ ÂÅÒÅÔ ÁÒÇÕÍÅÎÔ ÉÚ A É ×ÏÚ×ÒÁÝÁÅÔ ÒÅÚÕÌØÔÁÔ ÉÚ B . åÓÌÉ x ÅÓÔØ ÜÌÅÍÅÎÔ ÉÚ ÍÎÏÖÅÓÔ×Á A,
I. æÕÎË ÉÏÎÁÌØÎÁÑ ÁÒÁÄÉÇÍÁ × ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÉ
12
ÔÏÇÄÁ ÍÙ ÉÛÅÍ f (x) ÉÌÉ ÒÏÓÔÏ f x ÄÌÑ ÕËÁÚÁÎÉÑ ÒÅÚÕÌØÔÁÔÁ ÒÉ ÍÅÎÅÎÉÑ ÆÕÎË ÉÉ f Ë x. ÷ÔÏÒÁÑ ÆÏÒÍÁ ÚÁÉÓÉ ÎÅ ÉÓÏÌØÚÕÅÔÓÑ, ËÏ ÇÄÁ ÁÒÇÕÍÅÎÔ ÎÅ Ñ×ÌÑÅÔÓÑ ÒÏÓÔÏÊ ËÏÎÓÔÁÎÔÏÊ ÉÌÉ ×ÅÌÉÞÉÎÏÊ. ÁË, ÓÌÅÄÕÅÔ ÚÁÉÓÁÔØ square (3 + 4), ÏÔÏÍÕ ÞÔÏ square 3 + 4 ÏÚÎÁÞÁÅÔ (square 3) + 4. üÔÏ Ó×ÑÚÁÎÏ Ó ÂÏÌÅÅ ×ÙÓÏËÉÍ ÒÉÏÒÉÔÅÔÏÍ ÒÉÍÅÎÅ ÎÉÑ ÆÕÎË ÉÉ Ë ×ÙÒÁÖÅÎÉÀ Ï ÓÒÁ×ÎÅÎÉÀ Ó ÏÅÒÁ ÉÅÊ ÓÌÏÖÅÎÉÑ. ä×Å ÆÕÎË ÉÉ ÒÁ×ÎÙ, ÅÓÌÉ ÏÎÉ ÄÁÀÔ ÒÁ×ÎÙÅ ÒÅÚÕÌØÔÁÔÙ ÎÁ ÒÁ× ÎÙÈ ÁÒÇÕÍÅÎÔÁÈ. ÁË f = g , ÔÏÇÄÁ É ÔÏÌØËÏ ÔÏÇÄÁ, ËÏÇÄÁ f x = g x ÄÌÑ ÌÀÂÏÇÏ x. üÔÏ ÏÒÅÄÅÌÅÎÉÅ ÒÁ×ÅÎÓÔ×Á (ÜËÓÔÅÎÓÉÏÎÁÌØÎÏÓÔÉ, extensionality) ÆÕÎË ÉÊ Ó×ÉÄÅÔÅÌØÓÔ×ÕÅÔ Ï ÔÁËÏÊ ×ÁÖÎÏÊ ×ÅÝÉ, ËÁË ÓÏÏÔ×ÅÔÓÔ×ÉÅ ÍÅÖÄÕ ÁÒÇÕÍÅÎÔÁÍÉ É ÒÅÚÕÌØÔÁÔÁÍÉ, ÎÏ ÎÉÞÅÇÏ ÎÅ ÇÏ ×ÏÒÉÔ Ï ÔÏÍ, ËÁË ÜÔÏ ÓÏÏÔ×ÅÔÓÔ×ÉÅ ÏÉÓÙ×ÁÅÔÓÑ. ÷ ËÁÞÅÓÔ×Å ÒÉÍÅÒÁ ÒÉ×ÅÄÅÍ Ä×Á ÒÁÚÌÉÞÎÙÈ ÓÏÓÏÂÁ ÏÒÅÄÅ ÌÅÎÉÑ ÆÕÎË ÉÉ, Õ×ÅÌÉÞÉ×ÁÀÝÕÀ Ó×ÏÊ ÁÒÇÕÍÅÎÔ × ÔÒÉ ÒÁÚÁ:
three_times' x = x + x + x three_times'' x = 3 * x 2.3. ëÏÍÏÚÉ ÉÑ ÆÕÎË ÉÊ äÌÑ ÏÌÕÞÅÎÉÑ ÒÅÚÕÌØÔÁÔÁ ÒÏÇÒÁÍÍÙ ÒÉÈÏÄÉÔÓÑ ÒÉÍÅÎÑÔØ ÆÕÎË ÉÉ Ë ÒÅÚÕÌØÔÁÔÁÍ ×ÙÞÉÓÌÅÎÉÑ ÄÒÕÇÉÈ ÆÕÎË ÉÊ. ÷ ÍÁÔÅÍÁ ÔÉËÅ ÜÔÏÔ ÒÏ ÅÓÓ ÎÁÚÙ×ÁÀÔ ËÏÍÏÚÉ ÉÅÊ ÆÕÎË ÉÊ. ëÏÍÏÚÉ ÉÑ Ä×ÕÈ ÆÕÎË ÉÊ f É g ÏÂÏÚÎÁÞÁÅÔÓÑ f g É ÏÒÅÄÅÌÑÅÔÓÑ ÔÁË (f
g) x = f (g x)
f.g
X x
z
g f y
Y òÉÓ. 1.
ëÏÍÏÚÉ ÉÑ ÆÕÎË ÉÊ
Z
3. ÷ÉÄÙ ×ÙÞÉÓÌÅÎÉÊ
13
äÒÕÇÉÍÉ ÓÌÏ×ÁÍÉ, f g ÒÉÍÅÎÅÎÎÁÑ Ë x ÏÒÅÄÅÌÑÅÔÓÑ ËÁË ÒÉÍÅÎÅÎÉÅ ÓÎÁÞÁÌÁ ÆÕÎË ÉÉ g Ë x, É ÚÁÔÅÍ ÒÉÍÅÎÅÎÉÅ f Ë ÒÅ ÚÕÌØÔÁÔÕ. îÅ ËÁÖÄÁÑ ÁÒÁ ÆÕÎË ÉÊ ÍÏÖÅÔ ÓÏÓÔÁ×ÉÔØ ËÏÍÏÚÉ ÉÀ ÆÕÎË ÉÊ, ÎÕÖÎÏ ÓÏÏÔ×ÅÔÓÔ×ÉÅ ÔÉÏ×: ÍÙ ÔÒÅÂÕÅÍ, ÞÔÏÂÙ g ÉÍÅÌÏ ÔÉ g :: X ! Y , ÄÌÑ ÎÅËÏÔÏÒÙÈ ÔÉÏ× X É Y , É ÞÔÏÂÙ f ÉÍÅ ÌÏ ÔÉ f :: Y ! Z , ÄÌÑ ÎÅËÏÔÏÒÏÇÏ ÔÉÁ Z . ÏÇÄÁ ÍÙ ÏÌÕÞÉÍ f g :: X ! Z . ëÏÍÏÚÉ ÉÑ ÆÕÎË ÉÊ ÁÓÓÏ ÉÁÔÉ×ÎÁÑ ÏÅÒÁ ÉÑ. üÔÏ ÏÚÎÁÞÁ ÅÔ, ÞÔÏ ÏÒÑÄÏË ÒÁÓÓÔÁÎÏ×ËÉ ÓËÏÂÏË ÄÌÑ ×ÓÅÈ ÆÕÎË ÉÊ f , g É h, ÉÍÅÀÝÉÈ ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÉÊ ÔÉ, ÎÅ ×ÁÖÅÎ É ÉÈ ÍÏÖÎÏ ÏÕÓÔÉÔØ: (f
g) h = f (g h) = f g h
ÄÌÑ ×ÓÅÈ ÆÕÎË ÉÊ f , g É h, ÉÍÅÀÝÉÈ ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÉÊ ÔÉ. ðÏ ÜÔÏÍÕ ÎÅ ÎÕÖÎÏ ÄÏÂÁ×ÌÑÔØ ÓËÏÂËÉ ÒÉ ÚÁÉÓÉ ÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔÉ ËÏÍÏÚÉ ÉÊ. ÷ ÑÚÙËÅ Haskell, ÇÄÅ ËÏÍÏÚÉ ÉÑ ÆÕÎË ÉÊ ×ÓÔÒÅÞÁÅÔÓÑ ÒÁË ÔÉÞÅÓËÉ × ÌÀÂÏÊ ÒÏÇÒÁÍÍÅ, ÄÌÑ ÕËÁÚÁÎÉÑ ÏÅÒÁ ÉÉ ËÏÍÏÚÉ ÉÉ ÆÕÎË ÉÊ ÕÏÔÒÅÂÌÑÅÔÓÑ ÓÉÍ×ÏÌ . (ÔÏÞËÁ).
3. ÷ÉÄÙ ×ÙÞÉÓÌÅÎÉÊ ÷ ÉÍÅÒÁÔÉ×ÎÙÈ (ÄÅËÌÁÒÁÔÉ×ÎÙÈ) ÑÚÙËÁÈ ÒÉ ÒÉÍÅÎÅÎÉÉ ÆÕÎË ÉÉ Ë ÁÒÇÕÍÅÎÔÕ ÏÓÌÅÄÎÉÊ ÓÎÁÞÁÌÁ ×ÙÞÉÓÌÑÅÔÓÑ, Á ÚÁÔÅÍ ÕÖÅ ÅÒÅÄÁÅÔÓÑ ÆÕÎË ÉÉ. ÷ ÜÔÏÍ ÓÌÕÞÁÅ ÇÏ×ÏÒÑÔ, ÞÔÏ ÁÒÇÕÍÅÎÔ ÅÒÅÄÁÅÔÓÑ Ï ÚÎÁÞÅÎÉÀ, ÏÄÒÁÚÕÍÅ×ÁÑ ÒÉ ÜÔÏÍ, ÞÔÏ ÔÏÌØËÏ ÅÇÏ ÚÎÁÞÅÎÉÅ ÅÒÅÄÁÅÔÓÑ ÆÕÎË ÉÉ. ÁËÏÅ ÒÁ×ÉÌÏ ×ÙÞÉÓÌÅÎÉÊ ÉÌÉ ÍÅ ÈÁÎÉÚÍ ×ÙÚÏ×Á ÎÁÚÙ×ÁÅÔÓÑ ×ÙÚÏ×ÏÍ Ï ÚÎÁÞÅÎÉÀ. ðÒÅÉÍÕÝÅÓÔ×Ï ×ÙÚÏ×Á Ï ÚÎÁÞÅÎÉÀ ÚÁËÌÀÞÁÅÔÓÑ × ÔÏÍ, ÞÔÏ ÜÆÆÅËÔÉ×ÎÁÑ ÒÅÁÌÉÚÁ ÉÑ ÒÏÓÔÁ: ÓÎÁÞÁÌÁ ×ÙÞÉÓÌÑÅÔÓÑ ÁÒÇÕÍÅÎÔ, Á ÚÁÔÅÍ ×ÙÚÙ×ÁÅÔÓÑ ÆÕÎË ÉÑ. îÅÄÏÓÔÁÔËÏÍ Ñ×ÌÑÅÔÓÑ ÉÚÂÙÔÏÞÎÏÅ ×ÙÞÉÓÌÅÎÉÅ, ËÏÇÄÁ ÚÎÁÞÅÎÉÅ ÁÒÇÕÍÅÎÔÁ ÎÅ ÔÒÅÂÕÅÔÓÑ ×ÙÚÙ×ÁÅÍÏÊ ÆÕÎË ÉÉ. áÌØÔÅÒÎÁÔÉ×ÏÊ ×ÙÚÏ×Õ Ï ÚÎÁÞÅÎÉÀ Ñ×ÌÑÅÔÓÑ ×ÙÚÏ× Ï ÎÅÏÂÈÏÄÉÍÏÓÔÉ, × ËÏÔÏÒÏÍ ×ÓÅ ÁÒÇÕÍÅÎÔÙ ÅÒÅÄÁÀÔÓÑ ÆÕÎË ÉÉ × ÎÅ×ÙÞÉÓÌÅÎÎÏÍ ×ÉÄÅ É ×ÙÞÉÓÌÑÀÔÓÑ ÔÏÌØËÏ ÔÏÇÄÁ, ËÏÇÄÁ × ÎÉÈ ×ÏÚ ÎÉËÁÅÔ ÎÅÏÂÈÏÄÉÍÏÓÔØ ×ÎÕÔÒÉ ÔÅÌÁ ÆÕÎË ÉÉ. ðÒÅÉÍÕÝÅÓÔ×Ï ÜÔÏÇÏ ×ÙÚÏ×Á ÓÏÓÔÏÉÔ × ÔÏÍ, ÞÔÏ ÎÉËÁËÉÅ ÚÁÔÒÁÔÙ ÎÅ ÒÏÁÄÕÔ ÏÕÓÔÕ × ÓÌÕÞÁÅ, ÅÓÌÉ ÚÎÁÞÅÎÉÅ ÁÒÇÕÍÅÎÔÁ, × ËÏÎ Å ËÏÎ Ï×, ÎÅ ÏÔÒÅÂÕÅÔ ÓÑ. á ÎÅÄÏÓÔÁÔÏË × ÔÏÍ, ÞÔÏ Ï ÓÒÁ×ÎÅÎÉÀ Ó ×ÙÚÏ×ÏÍ Ï ÚÎÁÞÅ ÎÉÀ ×ÙÚÏ× Ï ÎÅÏÂÈÏÄÉÍÏÓÔÉ Ñ×ÌÑÅÔÓÑ ÂÏÌÅÅ ÄÏÒÏÇÉÍ, ÏÓËÏÌØËÕ ÆÕÎË ÉÑÍ ÅÒÅÄÁÀÔÓÑ ÎÅ ÚÎÁÞÅÎÉÑ ÔÅÈ ÉÌÉ ÉÎÙÈ ÁÒÁÍÅÔÒÏ×, Á ÎÅ×ÙÞÉÓÌÅÎÎÙÅ ×ÙÒÁÖÅÎÉÑ.
14
I. æÕÎË ÉÏÎÁÌØÎÁÑ ÁÒÁÄÉÇÍÁ × ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÉ
÷ ËÏÎÔÅËÓÔÅ ÆÕÎË ÉÏÎÁÌØÎÙÈ ÑÚÙËÏ× ÍÏÖÎÏ ÇÏ×ÏÒÉÔØ Ï Ä×ÕÈ ×ÉÄÁÈ ×ÙÞÉÓÌÅÎÉÑ, ÜÎÅÒÇÉÞÎÏÍ É ÌÅÎÉ×ÏÍ, ÈÏÔÑ ×ÏÚÍÏÖÎÙ É ÄÒÕ ÇÉÅ ×ÁÒÉÁÎÔÙ. ÷ ÔÅÒÍÉÎÁÈ ÔÒÁÄÉ ÉÏÎÎÏÇÏ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÑ ÜÎÅÒ ÇÉÞÎÏÅ ×ÙÞÉÓÌÅÎÉÅ ÍÏÖÎÏ ÒÉÂÌÉÚÉÔÅÌØÎÏ ÓÏÏÔÎÅÓÔÉ Ó ×ÙÚÏ×ÏÍ Ï ÚÎÁÞÅÎÉÀ, Á ÌÅÎÉ×ÏÅ Ó ÍÅÈÁÎÉÚÍÏÍ ×ÙÚÏ×Á Ï ÎÅÏÂÈÏÄÉÍÏÓÔÉ. ïÄÎÁËÏ ÍÅÖÄÕ ÜÔÉÍÉ ÏÎÑÔÉÑÍÉ ÎÅÔ ÔÏÖÄÅÓÔ×ÅÎÎÏÇÏ ÒÁ×ÅÎÓÔ×Á.
3.1. ìÅÎÉ×ÙÅ É ÜÎÅÒÇÉÞÎÙÅ ×ÙÞÉÓÌÅÎÉÑ óÔÒÁÔÅÇÉÑ ×ÙÞÉÓÌÅÎÉÊ (Ô. Å. ÓÏÓÏ ×ÙÞÉÓÌÅÎÉÑ ×ÙÒÁÖÅÎÉÊ), ÒÉÍÅÎÑÅÍÁÑ × Haskell, ÎÁÚÙ×ÁÅÔÓÑ ÓÔÒÁÔÅÇÉÅÊ , ÔÁËÖÅ ÎÁÚÙ×ÁÅÍÙÈ ×ÙÞÉÓÌÅÎÉÑÍÉ. ðÒÉ ÌÅ ÎÉ×ÏÍ ×ÙÞÉÓÌÅÎÉÉ ×ÙÒÁÖÅÎÉÑ (ÉÌÉ ÅÇÏ ÞÁÓÔÉ) ÏÎÏ ÒÏÉÚ×ÏÄÉÔÓÑ ÔÏÌØËÏ ÔÏÇÄÁ, ËÏÇÄÁ ÅÇÏ ÒÅÚÕÌØÔÁÔ ÄÅÊÓÔ×ÉÔÅÌØÎÏ ÎÅÏÂÈÏÄÉÍ. ðÒÉÎ É ÌÅÎÉ×ÙÈ ×ÙÞÉÓÌÅÎÉÊ ¾ ¿. ðÒÏÔÉ×ÏÏÌÏÖÎÏÓÔØÀ ÜÔÏÊ ÓÔÒÁÔÅÇÉÉ Ñ×ÌÑÀÔÓÑ (ÖÁÄÎÙÅ) . ðÒÉÎ É ÜÎÅÒÇÉÞÎÏÇÏ ×ÙÞÉÓÌÅÎÉÑ ¾ ¿. äÒÕÇÉÍÉ ÓÌÏ×ÁÍÉ, ÎÅ ÎÁÄÏ ÚÁÂÏÔÉÔÓÑ Ï ÔÏÍ, ÒÉÇÏÄÉÔÓÑ ÌÉ × ËÏÎÅÞÎÏÍ ÓÌÕÞÁÅ ÏÌÕÞÅÎÎÙÊ ÒÅÚÕÌØÔÁÔ.
ÎÉÊ
ÏÔÌÏÖÅÎÎÙÍÉ
ÂÕÅÔÓÑ ÎÙÅ ×ÙÞÉÓÌÅÎÉÑ ÄÅÌÁÊ ×ÓÅ, ÞÔÏ ÍÏÖÅÛØ
ÌÅÎÉ×ÙÈ ×ÙÞÉÓÌÅ
ÎÅ ÄÅÌÁÊ ÎÉÞÅÇÏ, ÏËÁ ÜÔÏ ÎÅ ÏÔÒÅ ÜÎÅÒÇÉÞ
ñÚÙËÉ, ÒÅÁÌÉÚÕÀÝÉÅ ÓÔÒÁÔÅÇÉÀ ÜÎÅÒÇÉÞÎÙÈ ×ÙÞÉÓÌÅÎÉÊ (Á ÔÁ ËÏ×ÙÍÉ Ñ×ÌÑÀÔÓÑ ÂÏÌØÛÉÎÓÔ×Ï ÉÍÅÒÁÔÉ×ÎÙÈ ÑÚÙËÏ× É ÎÅËÏÔÏÒÙÅ ÉÚ ÑÚÙËÏ× ÆÕÎË ÉÏÎÁÌØÎÏÇÏ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÑ), ÎÅ ÍÏÇÕÔ ÏÅÒÉ ÒÏ×ÁÔØ ÂÅÓËÏÎÅÞÎÙÍÉ ÓÔÒÕËÔÕÒÁÍÉ ÄÁÎÎÙÈ, ËÏÔÏÒÙÅ ÛÉÒÏËÏ ÒÉ ÍÅÎÑÀÔÓÑ × ÑÚÙËÅ Haskell. þÔÏÂÙ ÍÏÖÎÏ ÂÙÌÏ ÇÏ×ÏÒÉÔØ ×ÓÅ ÇÄÁ, ÂÅÚ ÉÓËÌÀÞÅÎÉÊ Ï ×ÙÞÉÓÌÅÎÉÉ ÒÁ ×ÉÌØÎÏ ÏÒÅÄÅÌÅÎÎÙÈ ×ÙÒÁÖÅÎÉÊ, ××Ï ÄÉÔÓÑ ÓÉÍ×ÏÌ ? (bottom, ÏÓÎÏ×ÁÎÉÅ), ÄÌÑ ÏÂÏÚÎÁÞÅÎÉÑ ÎÅÏÒÅÄÅÌÅÎÎÏÊ ×ÅÌÉ ÞÉÎÙ ÌÀÂÏÇÏ ÔÉÁ. ÷ ÞÁÓÔÎÏÓÔÉ ÞÉÓÌÏ 1 (ÂÅÓËÏÎÅÞÎÏÓÔØ) ÅÓÔØ ÎÅÏÒÅÄÅÌÅÎÎÁÑ ×ÅÌÉÞÉÎÁ ÔÉÁ Integer, 1/0 ÅÓÔØ ÎÅÏÒÅÄÅÌÅÎÎÁÑ ×ÅÌÉÞÉÎÁ ÔÉÁ Float, Ô. Å. 1=0 = ?. ìÅÎÉ ×ÏÓÔØ ÑÚÙËÁ Haskell ÒÉ×ÏÄÉÔ Ë ÔÏÍÕ, ÞÔÏ ×ÓÅ ÔÉÙ ÄÁÎÎÙÈ ÜÔÏÇÏ ÑÚÙËÁ ×ËÌÀÞÁÀÔ ÚÎÁÞÅÎÉÅ ?.
÷ ÑÚÙËÅ Haskell × ËÁ ÞÅÓÔ×Å ×ÅÌÉÞÉÎÙ ? ÉÓÏÌØÚÕÅÔÓÑ ÆÕÎË ÉÑ undefined.
3.2. óÔÒÏÇÉÅ ÆÕÎË ÉÉ çÏ×ÏÒÑÔ, ÞÔÏ ÆÕÎË ÉÑ, ËÏÔÏÒÁÑ ×ÓÅÇÄÁ ÔÒÅÂÕÅÔ ÚÎÁÞÅÎÉÅ ÏÄÎÏ ÇÏ ÉÚ Ó×ÏÉÈ ÁÒÇÕÍÅÎÔÏ×, Ñ×ÌÑÅÔÓÑ ÓÔÒÏÇÏÊ Ï ÏÔÎÏÛÅÎÉÀ Ë ÜÔÏÍÕ ÁÒÇÕÍÅÎÔÕ. äÒÕÇÉÍÉ ÓÌÏ×ÁÍÉ, ÅÓÌÉ f ? = ?, ÔÏ ÇÏ×ÏÒÑÔ, ÞÔÏ f ÅÓÔØ
3. ÷ÉÄÙ ×ÙÞÉÓÌÅÎÉÊ
15
ÓÔÒÏÇÁÑ, ÔÏÞÎÏ ÏÒÅÄÅÌÅÎÎÁÑ ÆÕÎË ÉÑ, × ÒÏÔÉ×ÎÏÍ ÓÌÕÞÁÅ ÇÏ×Ï ÒÑÔ Ï ÎÅÓÔÒÏÇÏ ÏÒÅÄÅÌÅÎÎÏÊ ÆÕÎË ÉÉ. îÅ×ÏÚÍÏÖÎÏ ÒÉÍÅÎÉÔØ ÏÅÒÁ ÉÀ +, ÏËÁ ÏÂÁ ÅÅ ÜÌÅÍÅÎÔÁ ÎÅ ÂÕÄÕÔ ×ÙÞÉÓÌÅÎÙ, ÏÜÔÏÍÕ ÏÎÁ Ñ×ÌÑÅÔÓÑ ÓÔÒÏÇÏÊ Ï ÏÔÎÏÛÅÎÉÀ Ë ÏÂÏÉÍ ÁÒÇÕÍÅÎÔÁÍ. ïÄÎÁËÏ ÎÅËÏÔÏÒÙÅ ÆÕÎË ÉÉ ÍÏÇÕÔ ×ÏÚ×ÒÁÝÁÔØ ÒÅÚÕÌØÔÁÔ, É ÎÅ ÚÎÁÑ ÚÎÁÞÅÎÉÊ ÏÄÎÏÇÏ ÉÌÉ ÎÅÓËÏÌØËÉÈ Ó×ÏÉÈ ÁÒÇÕ ÍÅÎÔÏ×. îÁÒÉÍÅÒ, ÏÒÅÄÅÌÅÎÎÁÑ ÏÌØÚÏ×ÁÔÅÌÅÍ ÆÕÎË ÉÑ ×ÉÄÁ
f (x, y) = if x < 10 then x else y ÎÅ ×ÓÅÇÄÁ ÔÒÅÂÕÅÔ, ÞÔÏÂÙ ÂÙÌÁ ÉÚ×ÅÓÔÎÁ ×ÅÌÉÞÉÎÁ y. ÷ ÔÏ ÖÅ ×ÒÅÍÑ ×ÅÌÉÞÉÎÕ x ÚÎÁÔØ ÎÅÏÂÈÏÄÉÍÏ, ÏÓËÏÌØËÕ ÔÒÅÂÕÅÔÓÑ ÏÒÅÄÅÌÉÔØ ÉÓ ÔÉÎÎÏÓÔØ ÎÅÒÁ×ÅÎÓÔ×Á x < 10. ðÏÜÔÏÍÕ ÆÕÎË ÉÑ f Ñ×ÌÑÅÔÓÑ ÓÔÒÏ ÇÏÊ Ï ÏÔÎÏÛÅÎÉÀ Ë x É ÎÅ ÓÔÒÏÇÏÊ Ï ÏÔÎÏÛÅÎÉÀ Ë y; ÜÔÏ ÏÚÎÁÞÁÅÔ, ÞÔÏ ×ÅÌÉÞÉÎÁ x ÔÒÅÂÕÅÔÓÑ ÏÂÑÚÁÔÅÌØÎÏ, Á ×ÅÌÉÞÉÎÁ y ÎÅÔ. éÔÁË, ÅÓÌÉ × ÔÏÞËÅ ×ÙÚÏ×Á ×ÙÞÉÓÌÑÀÔÓÑ ×ÓÅ ÁÒÇÕÍÅÎÔÙ (Ô. Å. ÏÎÉ ÅÒÅÄÁÀÔÓÑ Ï ÚÎÁÞÅÎÉÀ, ÞÔÏ ÓÏÏÔ×ÅÔÓÔ×ÕÅÔ ÜÎÅÒÇÉÞÎÏÍÕ ×ÙÞÉÓÌÅ ÎÉÀ), ÔÏ ÎÅËÏÔÏÒÙÅ ÉÚ ÒÏÄÅÌÁÎÎÙÈ ×ÙÞÉÓÌÅÎÉÊ ÍÏÇÕÔ ÏËÁÚÁÔØÓÑ ÌÉÛÎÉÍÉ. åÝÅ ÂÏÌØÛÁÑ ÎÅÒÉÑÔÎÏÓÔØ ÍÏÖÅÔ ÓÌÕÞÉÔØÓÑ × ÓÌÕÞÁÅ, ÅÓÌÉ ÒÏÇÒÁÍÍÁ ÎÅ ÓÍÏÖÅÔ ×ÙÞÉÓÌÉÔØ ÚÎÁÞÅÎÉÅ ÔÏÇÏ ÁÒÇÕÍÅÎÔÁ, Ï ÏÔÎÏÛÅÎÉÀ Ë ËÏÔÏÒÏÍÕ ÆÕÎË ÉÑ ÎÅ Ñ×ÌÑÅÔÓÑ ÓÔÒÏÇÏÊ. îÁÒÉÍÅÒ, ÒÉ ×ÙÞÉÓÌÅÎÉÉ ÏÄÏÂÎÏÇÏ ÁÒÇÕÍÅÎÔÁ ÍÏÖÅÔ ÒÏÉÚÏÊÔÉ ÚÁ ÉËÌÉ ×ÁÎÉÅ É ÏËÁÖÅÔÓÑ ÎÅ×ÏÚÍÏÖÎÙÍ ×ÙÞÉÓÌÉÔØ ÁÒÇÕÍÅÎÔ ÚÁ ËÏÎÅÞÎÏÅ ×ÒÅÍÑ, ÔÏÇÄÁ ËÁË ÅÓÌÉ ÂÙ ÚÎÁÞÅÎÉÑ ÅÒÅÄÁ×ÁÌÉÓØ Ï ÎÅÏÂÈÏÄÉÍÏ ÓÔÉ, ÔÏ ÁÒÇÕÍÅÎÔ, ËÏÔÏÒÙÊ ÎÅ×ÏÚÍÏÖÎÏ ×ÙÞÉÓÌÉÔØ, ÍÏÇ ÂÙ É ÎÅ ÏÔÒÅÂÏ×ÁÔØÓÑ, É ÔÏÇÄÁ ÒÏÇÒÁÍÍÁ ÂÌÁÇÏÏÌÕÞÎÏ ÚÁ×ÅÒÛÉÌÁÓØ ÂÙ ÚÁ ËÏÎÅÞÎÏÅ ×ÒÅÍÑ:
f (4, <ÚÁ ÉËÌÅÎÎÏÅ ×ÙÒÁÖÅÎÉÅ>) = 4 ëÏÎÅÞÎÏ, ÜÔÏ ÎÅ ÏÚÎÁÞÁÅÔ, ÞÔÏ ÒÉ ÌÅÎÉ×ÏÍ ×ÙÞÉÓÌÅÎÉÉ ÍÏÖÎÏ ×ÓÅÇÄÁ ÉÚÂÅÖÁÔØ ÚÁ ÉËÌÉ×ÁÎÉÑ: ÒÉÍÅÒÏÍ ÜÔÏÇÏ ÍÏÖÅÔ ÓÌÕÖÉÔØ ×ÙÒÁÖÅÎÉÅ
f (<ÚÁ ÉËÌÅÎÎÏÅ ×ÙÒÁÖÅÎÉÅ>, 4) ËÏÔÏÒÏÅ ÎÅ ÍÏÖÅÔ ÚÁ×ÅÒÛÉÔØÓÑ ÚÁ ËÏÎÅÞÎÏÅ ×ÒÅÍÑ ÎÅ ÚÁ×ÉÓÉÍÏ ÏÔ ÓÏÓÏÂÁ ×ÙÞÉÓÌÅÎÉÑ. òÁÓÓÍÏÔÒÉÍ ÏÒÅÄÅÌÅÎÉÑ ÎÅÓËÏÌØËÉÈ ÆÕÎË ÉÊ:
infinity = infinity + 1 three x = 3 square x = x*x
16
I. æÕÎË ÉÏÎÁÌØÎÁÑ ÁÒÁÄÉÇÍÁ × ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÉ
ïÒÅÄÅÌÅÎÉÅ ÆÕÎË ÉÉ infinity (ÂÅÓËÏÎÅÞÎÏÓÔØ) ÎÅ Ñ×ÌÑÅÔÓÑ ÄÏ ÓÔÁÔÏÞÎÏ ËÏÒÒÅËÔÎÙÍ. îÏ ËÏÍØÀÔÅÒ ÍÏÖÅÔ, ÔÅÍ ÎÅ ÍÅÎÅÅ, ÉÓÏÌØ ÚÏ×ÁÔØ ÅÇÏ. òÁÓÓÍÏÔÒÉÍ ×ÙÒÁÖÅÎÉÅ three infinity. ÷ ÓÌÕÞÁÅ ÖÁÄ ÎÙÈ ×ÙÞÉÓÌÅÎÉÊ ÒÅÄ×ÁÒÉÔÅÌØÎÏ ÔÒÅÂÕÅÔÓÑ ×ÙÞÉÓÌÉÔØ ÁÒÇÕÍÅÎÔ ÆÕÎË ÉÉ three, ÒÉÍÅÎÉ× ÒÁ×ÉÌÏ ÅÇÏ ×ÙÞÉÓÌÅÎÉÑ:
infinity = infinity + 1 =
× ×ÙÒÁÖÅÎÉÉ ×ÓÔÒÅÔÉÌÁÓØ ÆÕÎË ÉÑ infinity, ÓÌÅÄÏ×ÁÔÅÌØÎÏ ÓÎÏ×Á ÒÉÍÅÎÑÅÍ ÒÁ×ÉÌÏ ÅÅ ×ÙÞÉÓÌÅÎÉÑ (infinity + 1) +1 = ((infinity + 1) + 1) + 1 = ... ðÒÏ ÅÓÓ ×ÙÞÉÓÌÅÎÉÑ ÁÒÇÕÍÅÎÔÁ ÆÕÎË ÉÉ three ÎÅ ÓÕÍÅÅÔ ÚÁ×ÅÒ ÛÉÔØÓÑ, ÏÜÔÏÍÕ É ÓÁÍ ×ÙÚÏ× ÆÕÎË ÉÉ ÎÅ ÚÁ×ÅÒÛÉÔØÓÑ. ðÒÉ ÓÔÒÁÔÅÇÉÉ ÏÔÌÏÖÅÎÎÙÈ ×ÙÞÉÓÌÅÎÉÊ ÒÉ ×ÙÚÏ×Å three infinity ÎÅ ÏÔÒÅÂÕÅÔÓÑ ×ÙÞÉÓÌÑÔØ ÁÒÇÕÍÅÎÔ, ÔÁË ËÁË × ÌÀÂÏÍ ÓÌÕÞÁÅ ÏÔ×ÅÔ ÂÕÄÅÔ ÒÁ×ÅÎ 3. îÏ ÒÉ ÏÙÔËÅ ×ÙÞÉÓÌÅÎÉÑ square infinity ÄÁÖÅ ÌÅÎÉ×ÁÑ ÓÔÒÁÔÅÇÉÑ ÎÅ ÓÕÍÅÅÔ ÏÍÏÞØ × ×ÙÞÉÓÌÅÎÉÉ ×ÙÒÁÖÅÎÉÑ, ÔÁË ËÁË ÄÌÑ ÔÏÇÏ, ÞÔÏÂÙ ×ÏÚ×ÅÓÔÉ ÁÒÇÕÍÅÎÔ ÆÕÎË ÉÉ × Ë×ÁÄÒÁÔ, ÅÇÏ ÎÅÏÂÈÏÄÉÍÏ ÒÅÄ×ÁÒÉÔÅÌØÎÏ ×ÙÞÉÓÌÉÔØ. ÷ ÎÁÛÅÍ ÒÉÍÅÒÅ square ÓÔÒÏÇÏ ÏÒÅÄÅÌÅÎÎÁÑ ÆÕÎË ÉÑ, Á three ÎÅÓÔÒÏÇÁÑ. ìÅÎÉ×ÙÅ ×ÙÞÉÓÌÅÎÉÑ ÄÏÕÓËÁÀÔ ÎÅÓÔÒÏÇÏÅ ÏÒÅÄÅÌÅÎÉÅ ÆÕÎË ÉÊ, ÄÒÕÇÉÅ ÓÔÒÁÔÅÇÉÉ ÎÅÔ.
4. Haskell ËÁË ÑÚÙË æð äÁÌØÎÅÊÛÅÅ ÉÚÌÏÖÅÎÉÅ ÍÁÔÅÒÉÁÌÁ ÏÓÎÏ×ÁÎÏ ÎÁ ÉÓÏÌØÚÏ×ÁÎÉÉ ÑÚÙËÁ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÑ Haskell. Haskell ÅÓÔØ ÞÉÓÔÏ ÆÕÎË ÉÏ ÎÁÌØÎÙÊ ÑÚÙË ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÑ. òÅÚÕÌØÔÁÔ ×ÙÞÉÓÌÅÎÉÑ ÌÀÂÏÇÏ ×ÙÒÁÖÅÎÉÑ ÅÓÔØ ÉÎ×ÁÒÉÁÎÔ, ÎÅ ÚÁ×ÉÓÑÝÉÊ ÏÔ ÏÒÑÄËÁ ×ÙÞÉÓÌÅ ÎÉÑ ÅÇÏ ÏÄ×ÙÒÁÖÅÎÉÊ, ÞÔÏ ×ÅÓØÍÁ ÕÒÏÝÁÅÔ ÏÂÓÕÖÄÅÎÉÅ Ó×ÏÊÓÔ× ÒÏÇÒÁÍÍ. äÁÎÎÙÊ ÑÚÙË ÉÓÏÌØÚÕÅÔ ÓÔÒÁÔÅÇÉÀ ÌÅÎÉ×ÙÈ ×ÙÞÉÓÌÅ ÎÉÊ ÏÄ×ÙÒÁÖÅÎÉÑ ÎÅ ×ÙÞÉÓÌÑÀÔÓÑ ÄÏ ÔÅÈ ÏÒ, ÏËÁ ÏÎÉ Ñ×ÎÏ ÎÅ ÏÔÒÅÂÕÀÔÓÑ. Haskell Ñ×ÉÌÓÑ ÒÅÚÕÌØÔÁÔÏÍ ÏÙÔÏË ×ÙÏÌÎÅÎÉÑ ÏÂÑÚÁÔÅÌØÓÔ× Ï ÒÁÚÒÁÂÏÔËÅ Ó×ÏÂÏÄÎÏ-ÒÁÓÒÏÓÔÒÁÎÑÅÍÏÇÏ ÎÅ ÓÔÒÏÇÏÇÏ, ÞÉÓÔÏ ÆÕÎË ÉÏÎÁÌØÎÏÇÏ ÑÚÙËÁ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÑ. Haskell ÏÞÅÎØ ÏÕÌÑ ÒÅÎ × ÁËÁÄÅÍÉÞÅÓËÉÈ ËÒÕÇÁÈ. íÎÏÇÉÅ ÓÔÁÔØÉ É ËÎÉÇÉ, ÏÓ×ÑÝÅÎÎÙÅ
4. Haskell ËÁË ÑÚÙË æð
17
ÒÏÂÌÅÍÁÍ ÍÅÔÏÄÏÌÏÇÉÉ ÒÁÚÒÁÂÏÔËÉ ÒÏÇÒÁÍÍ, ÒÅÄÏÌÁÇÁÀÔ ÚÎÁ ÎÉÅ ÜÔÏÇÏ ÑÚÙËÁ. ÅÍ ÎÅ ÍÅÎÅÅ, ÏÎ ÍÁÌÏ ÒÁÓÒÏÓÔÒÁÎÅÎ × ÒÏÉÚ×ÏÄ ÓÔ×Å (ÈÏÔÑ ÅÓÔØ ÒÏÍÙÛÌÅÎÎÙÅ ÜËÓÅÒÔÎÙÅ ÓÉÓÔÅÍÙ, ÎÁÉÓÁÎÎÙÅ ÎÁ Haskell). ïÄÎÏÊ ÉÚ ÒÉÞÉÎ Ñ×ÌÑÅÔÓÑ ÌÏÈÁÑ ÏÓ×ÅÄÏÍÌÅÎÎÏÓÔØ Ï ÜÔÏÍ ÑÚÙËÅ É ÆÕÎË ÉÏÎÁÌØÎÏÊ ÍÅÔÏÄÏÌÏÇÉÉ ÓÒÅÄÉ ÒÏÇÒÁÍÍÉÓÔÏ× ÒÁËÔÉËÏ× É ÎÁÞÉÎÁÀÝÉÈ ÒÏÇÒÁÍÍÉÓÔÏ×. üÔÏÔ ÒÏÂÅÌ É ÒÉÚ×ÁÎÏ ÉÓÒÁ×ÉÔØ ÄÁÎÎÏÅ ÕÞÅÂÎÏÅ ÏÓÏÂÉÅ. óÏ×ÒÅÍÅÎÎÏÅ ÓÏÓÔÏÑÎÉÅ ÑÚÙËÁ Haskell ÏÉÓÙ×ÁÅÔÓÑ ÓÔÁÎÄÁÒÔÏÍ Haskell 98. âÏÌØÛÏÅ ËÏÌÉÞÅÓÔ×Ï ÍÁÔÅÒÉÁÌÏ×, ÏÓ×ÑÝÅÎÎÙÈ ÜÔÏÍÕ ÑÚÙËÕ, ÍÏÖÎÏ ÎÁÊÔÉ ÎÁ ÓÁÊÔÅ http://www.haskell.org. äÁÌØÎÅÊÛÅÅ ÉÚÌÏÖÅÎÉÅ ÍÁÔÅÒÉÁÌÁ × ÏÓÎÏ×ÎÏÍ ÏÒÉÅÎÔÉÒÏ×ÁÎÎÏ ÎÁ ÉÓÏÌØÚÏ×ÁÎÉÅ ÉÎÔÅÒÒÅÔÁÔÏÒÁ Hugs 98 (ÓÏËÒÁÝÅÎÉÅ ÏÔ Haskell User's Gofer System) × ÓÒÅÄÅ ïó Linux. Hugs Ñ×ÌÑÅÔÓÑ ÓÁÍÏÊ ÒÏ ÓÔÏÊ ÒÅÁÌÉÚÁ ÉÅÊ ÑÚÙËÁ Haskell É ÉÄÅÁÌØÎÏ ÏÄÈÏÄÉÔ ÄÌÑ ÅÌÅÊ ÏÂÕÞÅÎÉÑ. ðÏÒÔÙ Hugs 98 ÏÂÅÓÅÞÉ×ÁÀÔ ÒÁÂÏÔÕ Haskell-ËÏÄÁ ÎÁ ×ÓÅÈ ÏÓÎÏ× ÎÙÈ ÌÁÔÆÏÒÍÁÈ, × ÔÏÍ ÞÉÓÌÅ É ÄÌÑ ïó Windows É Linux. éÓÏÌØ ÚÏ×ÁÎÉÅ ÜÔÏÇÏ ÉÎÔÅÒÒÅÔÁÔÏÒÁ × Windows ÒÁËÔÉÞÅÓËÉ ÎÉÞÅÍ ÎÅ ÏÔÌÉÞÁÅÔÓÑ ÏÔ ÒÁÂÏÔÙ Ó ÎÉÍ × ïó Linux. ïÔËÒÙÔÏÓÔØ ÓÔÁÎÄÁÒÔÁ É ×ÏÚÍÏÖÎÏÓÔØ ÓËÁÞÁÔØ ÉÓÈÏÄÎÙÅ ËÏÄÙ ÑÚÙËÁ ÒÉ×ÅÌÉ Ë ÏÑ×ÌÅÎÉÀ ÂÏÌØÛÏÇÏ ÞÉÓÌÁ ËÏÍÉÌÑÔÏÒÏ× Ó ÜÔÏÇÏ ÑÚÙËÁ. óÒÅÄÉ ÎÉÈ HBC (Haskell B) ËÏÍÉÌÑÔÏÒ É ÉÎÔÅÒÒÅÔÁÔÏÒ, ÏÚ×ÏÌÑÅÔ ×ÙÏÌÎÑÔØ ÒÏÇÒÁÍÍÙ ÚÎÁÞÉÔÅÌØÎÏ ÂÙÓÔÒÅÅ, É GHC ÏÔÉÍÉÚÉÒÕÀÝÉÊ ËÏÍÉÌÑÔÏÒ × ÍÁÛÉÎÎÙÊ ËÏÄ É C. äÏÏÌÎÉÔÅÌØ ÎÕÀ ÉÎÆÏÒÍÁ ÉÀ Ï ÑÚÙËÅ Haskell É ÒÁÚÎÏÏÂÒÁÚÎÏÅ ÒÏÇÒÁÍÍÎÏÅ ÏÂÅÓÅÞÅÎÉÅ ÄÌÑ ÒÁÂÏÔÙ Ó ÎÉÍ ÍÏÖÎÏ ÎÁÊÔÉ × ÓÅÔÉ ÉÎÔÅÒÎÅÔ Ï ÓÌÅÄÕÀÝÉÍ ÁÄÒÅÓÁÍ:
http://haskell.org/hugs/, http://haskell.org/gh /, http://www. s.york.a .uk/fp/nh 98/, http://www. s. halmers.se/~augustss/hb /hb .html, http://www. s. halmers.se/~augustss/hb /hb .html, fpt://ftp. s. halmers.se/pub/haskell, fpt://ftp.d s.glasgow.a .uk/pub/haskell, fpt://ftp.nebula. s.yale.edu/pub/haskell.
çÌÁ×Á II
úÎÁËÏÍÓÔ×Ï Ó ÑÚÙËÏÍ Haskell 1. îÁÞÁÌÏ ÒÁÂÏÔÙ Ó Hugs 1.1. ëÏÍÁÎÄÙ ÉÎÔÅÒÒÅÔÁÔÏÒÁ äÌÑ ÚÁÕÓËÁ ÉÎÔÅÒÒÅÔÁÔÏÒÁ ×ÙÏÌÎÉÔÅ ËÏÍÁÎÄÕ hugs. éÎÔÅÒ ÒÅÔÁÔÏÒ × ÎÁÞÁÌÅ ÒÁÂÏÔÙ Á×ÔÏÍÁÔÉÞÅÓËÉ ÚÁÇÒÕÖÁÅÔ ÏÒÅÄÅÌÅÎÉÑ ÎÁÉÂÏÌÅÅ ÞÁÓÔÏ ÉÓÏÌØÚÕÅÍÙÈ ÆÕÎË ÉÊ, ÒÁÚÍÅÝÅÎÎÙÅ × ÆÁÊÌÅ Prelude.hs, É ÎÁÚÙ×ÁÅÍÏÍ ÏÜÔÏÍÕ . ðÒÉ ÓÔÁÒÔÅ ×Ù×ÏÄÉÔÓÑ ÎÅËÏÔÏÒÁÑ ÓÒÁ×ÏÞÎÁÑ ÉÎÆÏÒÍÁ ÉÑ Ï ÓÉ ÓÔÅÍÅ É ÏÑ×ÌÑÅÔÓÑ ÒÉÇÌÁÛÅÎÉÅ ÄÌÑ ××ÏÄÁ ËÏÍÁÎÄ, ÚÎÁÞÅÎÉÅÍ Ï ÕÍÏÌÞÁÎÉÀ ËÏÔÏÒÏÇÏ Ñ×ÌÑÅÔÓÑ ÉÍÑ ÚÁÇÒÕÖÅÎÎÏÇÏ ÍÏÄÕÌÑ É ÚÎÁË >.
ÒÅÌÀÄÉÅÊ
__ __ || || ||___|| ||---|| || || || ||
__ __ ____ ___ || || || || ||__ ||__|| ||__|| __|| ___|| Version: De ember 2001
. . . Prelude> ðÏÓÌÅ ÏÑ×ÌÅÎÉÑ ÒÉÇÌÁÛÅÎÉÑ ÍÏÖÎÏ ÒÉÓÔÕÁÔØ Ë ××ÏÄÕ ËÏ ÍÁÎÄ. äÌÑ ×ÙÞÉÓÌÅÎÉÑ ÔÏÇÏ ÉÌÉ ÉÎÏÇÏ ×ÙÒÁÖÅÎÉÑ ÄÏÓÔÁÔÏÞÎÏ ××Å ÓÔÉ ÅÇÏ ÓÔÁÎÄÁÒÔÎÕÀ ÍÁÔÅÍÁÔÉÞÅÓËÕÀ ÚÁÉÓØ, ÏÓÌÅ ÞÅÇÏ ÎÁÖÁÔØ ÎÁ ËÌÁ×ÉÛÕ Enter:
Prelude> 2+3*4 14 Prelude> (2+3)*4 20 Prelude> 2.5*4 18
1. îÁÞÁÌÏ ÒÁÂÏÔÙ Ó Hugs
19
10.0 Prelude> ëÁË ×ÉÄÉÍ, ÉÎÔÅÒÒÅÔÁÔÏÒ ÒÁÚÌÉÞÁÅÔ ÅÌÙÅ ÞÉÓÌÁ É ÞÉÓÌÁ, ÒÅÄ ÓÔÁ×ÉÍÙÅ × ×ÉÄÅ ÄÅÓÑÔÉÞÎÏÊ ÄÒÏÂÉ. äÌÑ ÏÔÄÅÌÅÎÉÑ ÄÒÏÂÎÏÊ ÞÁÓÔÉ ÏÔ ÅÌÏÊ ÉÓÏÌØÚÕÅÔÓÑ ÄÅÓÑÔÉÞÎÁÑ ÔÏÞËÁ. ëÒÕÇÌÙÅ ÓËÏÂËÉ ÉÓÏÌØ ÚÕÀÔÓÑ ÄÌÑ ÉÚÍÅÎÅÎÉÑ ÏÒÑÄËÁ ×ÙÞÉÓÌÅÎÉÊ. åÓÌÉ ÈÏÔÑ ÂÙ ÏÄÎÏ ÞÉÓÌÏ × ×ÙÒÁÖÅÎÉÉ ÎÅ Ñ×ÌÑÅÔÓÑ ÅÌÙÍ, ÔÏ É ÒÅÚÕÌØÔÁÔ ÂÕÄÅÔ ÒÅÄ ÓÔÁ×ÌÅÎ × ×ÉÄÅ ÄÅÓÑÔÉÞÎÏÊ ÄÒÏÂÉ. ÷ ÓÌÅÄÕÀÝÅÊ ÇÌÁ×Å ÍÙ ÒÁÓÓÍÏ ÔÒÉÍ ÒÁÚÌÉÞÎÙÅ ×ÉÄÙ ÄÁÎÎÙÈ, ÉÓÏÌØÚÕÅÍÙÈ × ÑÚÙËÅ Haskell. äÌÑ ÚÁ×ÅÒÛÅÎÉÑ ÒÁÂÏÔÙ Ó ÉÎÔÅÒÒÅÔÁÔÏÒÏÍ Hugs ÓÌÕÖÉÔ ËÏ ÍÁÎÄÁ :quit (Á ÔÁËÖÅ ÅÅ ÓÏËÒÁÝÅÎÎÁÑ ÆÏÒÍÁ :q), ËÏÔÏÒÁÑ ÔÁËÖÅ ××ÏÄÉÔÓÑ ÏÓÌÅ ÒÉÇÌÁÛÅÎÉÑ ÓÉÓÔÅÍÙ:
Prelude>:quit ÷ÉÄ ÓÉÍ×ÏÌÁ ÒÉÇÌÁÛÅÎÉÑ ÍÏÖÎÏ ÍÅÎÑÔØ, ÚÁÄÁ×ÁÑ ÒÉ ÓÔÁÒÔÅ ËÌÀÞ -p, ÎÁÒÉÍÅÒ,
hugs -p'---> ' úÁÕÓË ÉÎÔÅÒÒÅÔÁÔÏÒÁ Ó ÕËÁÚÁÎÎÙÍ ËÌÀÞÏÍ ÒÉ×ÅÄÅÔ Ë ÕÓÔÁÎÏ×ËÅ ÒÉÇÌÁÛÅÎÉÑ --->:
. . . Hugs session for: /usr/share/hugs/lib/Prelude.hs Type :? for help ---> ÷ ÄÁÌØÎÅÊÛÅÍ ÉÚÌÏÖÅÎÉÉ ÍÙ ÂÕÄÅÍ ÉÓÏÌØÚÏ×ÁÔØ ÒÉÇÌÁÛÅÎÉÅ ---> , ÞÔÏ ÏÚ×ÏÌÉÔ ÏÔÌÉÞÁÔØ ×Ù×ÏÄ ÉÎÔÅÒÒÅÔÁÔÏÒÁ ÏÔ ÓÏÄÅÒÖÉ ÍÏÇÏ ÒÏÇÒÁÍÍ.
1.2. óÅÓÓÉÉ É ÓËÒÉÔÙ ðÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔØ ÉÎÔÅÒÁËÔÉ×ÎÙÈ ×ÚÁÉÍÏÄÅÊÓÔ×ÉÊ ÏÌØÚÏ×Á ÔÅÌÑ É ËÏÍØÀÔÅÒÁ ÎÁÚÙ×ÁÅÔÓÑ ÓÅÓÓÉÅÊ (session). äÌÑ ×ÙÄÅÌÅÎÉÑ × ÔÅËÓÔÅ ËÎÉÇÉ ÜÌÅÍÅÎÔÏ× ÉÎÔÅÒÁËÔÉ×ÎÙÈ ÓÅÓÓÉÊ ÎÁ ÏÌÑÈ ÄÏÂÁ×ÌÑ ÅÔÓÑ ÚÎÁË H, ÓÉÇÎÁÌÉÚÉÒÕÀÝÉÊ Ï ××ÏÄÅ É ×Ù×ÏÄÅ ÉÎÔÅÒÒÅÔÁÔÏÒÁ Hugs. îÁÂÏÒ ÏÂßÑ×ÌÅÎÉÊ É ÏÒÅÄÅÌÅÎÉÊ ÆÕÎË ÉÊ, ÒÁÚÍÅÝÅÎÎÙÊ × ÏÔ ÄÅÌØÎÏÍ ÆÁÊÌÅ, ÎÁÚÙ×ÁÅÔÓÑ ÓËÒÉÔÏÍ (s ript). Hugs ÎÅ ÏÚ×ÏÌÑ ÅÔ ÏÒÅÄÅÌÑÔØ ÎÏ×ÙÅ ÆÕÎË ÉÉ × ÉÎÔÅÒÁËÔÉ×ÎÏÍ ÒÅÖÉÍÅ, Á ÔÏÌØËÏ ÒÁÚÒÅÛÁÅÔ ××ÏÄÉÔØ ×ÙÒÁÖÅÎÉÑ, ÉÓÏÌØÚÕÀÝÉÅ ÕÖÅ ÏÒÅÄÅÌÅÎÎÙÅ ÆÕÎË ÉÉ.
II. úÎÁËÏÍÓÔ×Ï Ó ÑÚÙËÏÍ Haskell
20
ëÁÖÄÁÑ ÒÏÇÒÁÍÍÁ (ÓËÒÉÔ) ÎÁ ÑÚÙËÅ Haskell, ÎÁÚÙ×ÁÅÍÁÑ ÔÁË ÖÅ ÍÏÄÕÌÅÍ, ÒÁÚÍÅÝÁÅÔÓÑ × ÏÔÄÅÌØÎÏÍ ÆÁÊÌÅ, ÉÍÅÀÝÅÍ ÒÁÓÛÉÒÅ ÎÉÅ hs. óÉÍ×ÏÌ ÎÁ ÏÌÑÈ ËÎÉÇÉ ÏÚÎÁÞÁÅÔ ÎÁÞÁÌÏ ÔÅËÓÔÁ ÒÏ ÇÒÁÍÍÙ ÎÁ ÑÚÙËÅ Haskell, ËÏÔÏÒÁÑ ÄÏÌÖÎÁ ÓÏÚÄÁ×ÁÔØÓÑ Ó ÏÍÏÝØÀ ÒÅÄÁËÔÏÒÁ plain-ÔÅËÓÔÁ.
I õÒÁÖÎÅÎÉÅ II.1.1
óÏÚÄÁÊÔÅ Ó ÏÍÏÝØÀ ÌÀÂÏÇÏ ÔÅËÓÔÏ×ÏÇÏ ÒÅÄÁËÔÏÒÁ ÆÁÊÌ, ÓÏÄÅÒÖÁ ÝÉÊ ÓÌÅÄÕÀÝÉÅ Ä×Å ÓÔÒÏËÉ:
square :: Integer -> Integer square x = x * x óÏÈÒÁÎÉÔÅ ÆÁÊÌ ÏÄ ÉÍÅÎÅÍ myprog.hs.
îÁÛ ÅÒ×ÙÊ ÓËÒÉÔ ÓÏÄÅÒÖÉÔ (ÅÒ×ÁÑ ÓÔÒÏËÁ) É (×ÔÏÒÁÑ ÓÔÒÏËÁ) ÆÕÎË ÉÉ square. ïÂßÑ×ÌÅÎÉÅ ÆÕÎË ÉÉ ÕËÁÚÙ×ÁÅÔ, ÏÔËÕÄÁ É ËÕÄÁ ÄÅÊÓÔ×ÕÅÔ ÆÕÎË ÉÑ, Á ÏÒÅÄÅÌÅÎÉÅ ÚÁÄÁÅÔ ÓÏÓÏ ÒÅÏÂÒÁÚÏ×ÁÎÉÑ ÁÒÇÕÍÅÎÔÁ x. óÉÍ×ÏÌ :: ÞÉÔÁÅÔÓÑ ËÁË ¾ÉÍÅÅÔ ÔÉ¿. äÌÑ ÏÚÎÁËÏÍÌÅÎÉÑ ÉÎÔÅÒÒÅÔÁÔÏÒÁ Hugs Ó ÓÏÄÅÒÖÉÍÙÍ ÆÁÊÌÁ ÉÓÏÌØÚÕÅÔÓÑ ËÏÍÁÎÄÁ :load (É ÅÅ ÓÏËÒÁÝÅÎÎÁÑ ÆÏÒÍÁ :l), ÎÁÒÉ ÍÅÒ,
ÏÒÅÄÅÌÅÎÉÅ
H
ÏÂßÑ×ÌÅÎÉÅ
J
---> :load myprog.hs Reading file "myprog.hs": Hugs session for: /usr/share/hugs/lib/Prelude.hs myprog.hs ---> square 15 225 ---> :l myprog.hs Reading file "myprog.hs": Hugs session for: /usr/share/hugs/lib/Prelude.hs myprog.hs ---> square 11 121 îÁÏÍÎÉÍ, ÞÔÏ ËÏÍÁÎÄÙ ÏÌØÚÏ×ÁÔÅÌÑ ××ÏÄÑÔÓÑ ÏÓÌÅ ÓÉÍ×ÏÌÁ ÒÉÇÌÁÛÅÎÉÑ (ÄÁÌÅÅ --->). ÷ ÆÁÊÌÅ, ÒÅÄÌÏÖÅÎÎÏÍ ÉÎÔÅÒÒÅÔÁÔÏ ÒÕ, ÏÛÉÂÏË ÎÅ ÏÂÎÁÒÕÖÅÎÏ É ÓÌÅÄÕÀÝÁÑ ËÏÍÁÎÄÁ ÂÙÌÁ ÕËÁÚÁÎÉÅÍ
1. îÁÞÁÌÏ ÒÁÂÏÔÙ Ó Hugs
21
×ÙÞÉÓÌÉÔØ ÚÎÁÞÅÎÉÅ ÏÒÅÄÅÌÅÎÎÏÊ ÎÁÍÉ ÆÕÎË ÉÉ. ðÏÓÌÅ ×ÙÞÉÓÌÅ ÎÉÑ ÒÅÚÕÌØÔÁÔÁ ÉÎÔÅÒÒÅÔÁÔÏÒ ÓÎÏ×Á ×ÙÄÁÌ ÒÉÇÌÁÛÅÎÉÅ Ë ××ÏÄÕ ËÏÍÁÎÄ. ðÒÉ ×ÙÚÏ×Å ËÏÍÁÎÄÙ :load ÂÅÚ ÁÒÇÕÍÅÎÔÁ ÉÎÔÅÒÒÅÔÁÔÏÒ ¾ÚÁ ÂÕÄÅÔ¿ ×ÓÅ ÒÁÎÅÅ ××ÅÄÅÎÎÙÅ ÏÒÅÄÅÌÅÎÉÑ, ËÒÏÍÅ ÚÁÇÒÕÖÅÎÎÙÈ ÉÚ ÆÁÊÌÁ Prelude.hs.
---> :load
H
Hugs session for: /usr/share/hugs/lib/Prelude.hs ---> square 15 ERROR - Undefined variable "square" ÁË ËÁË ÏÒÅÄÅÌÅÎÉÑ ×ÓÅÈ ÆÕÎË ÉÊ ÉÚ ÒÅÌÀÄÉÉ ÏËÁÚÙ×ÁÀÔÓÑ ×ÓÅÇÄÁ ÚÁÇÒÕÖÅÎÎÙÍÉ Ï ÕÍÏÌÞÁÎÉÀ, ÔÏ ÉÈ ÍÏÖÎÏ ÉÓÏÌØÚÏ×ÁÔØ ËÁË × ÌÀÂÏÍ ÍÅÓÔÅ ÒÏÇÒÁÍÍÙ (ÓËÒÉÔÁ), ÔÁË É ×Ï ×ÒÅÍÑ ÓÅÓÓÉÉ. ïÄÎÁËÏ ÉÎÏÇÄÁ ×ÏÚÎÉËÁÅÔ ÎÅÏÂÈÏÄÉÍÏÓÔØ ÏÒÅÄÅÌÉÔØ ÆÕÎË ÉÀ Ó ÔÅÍ ÖÅ ÉÍÅÎÅÍ, ÞÔÏ É ÒÉ×ÅÄÅÎÎÁÑ × ÆÁÊÌÅ Prelude.hs. ÷ ÜÔÏÍ ÓÌÕÞÁÅ ÓÌÅÄÕÅÔ × ÎÁÞÁÌÏ ÓËÒÉÔÁ ×ÓÔÁ×ÉÔØ ÓÔÒÏËÕ, ËÏÔÏÒÁÑ ÄÅÌÁÅÔ ¾ÎÅ×ÉÄÉÍÏÊ¿ (hide ÓËÒÙ×ÁÔØ) ÔÕ ÉÌÉ ÉÎÕÀ ÆÕÎË ÉÀ, ÎÁÒÉÍÅÒ, ÆÕÎË ÉÉ map É even:
import Prelude hiding (map, even) åÓÌÉ × ÎÁÞÁÌÏ ÆÁÊÌÁ Ó ÒÏÇÒÁÍÍÏÊ ÏÍÅÓÔÉÔØ ×ÙÛÅÒÉ×ÅÄÅÎÎÕÀ ÓÔÒÏËÕ, ÔÏ ÄÁÌÅÅ ÍÏÖÎÏ ÄÁ×ÁÔØ Ó×ÏÉ ÓÏÂÓÔ×ÅÎÎÙÅ ÏÒÅÄÅÌÅÎÉÑ ÜÔÉÈ ÆÕÎË ÉÊ. ïÂÙÞÎÏ ÎÅÏÂÈÏÄÉÍÏÓÔØ × ÜÔÏÍ ×ÏÚÎÉËÁÅÔ ÔÏÌØËÏ × ÕÞÅ ÎÙÈ ÅÌÑÈ, ËÏÇÄÁ ÎÁÞÉÎÁÀÝÉÊ ÒÏÇÒÁÍÍÉÓÔ ÒÏÂÕÅÔ Ó×ÏÉ ÓÉÌÙ × ÎÁÉÓÁÎÉÉ ÓÔÁÎÄÁÒÔÎÙÈ ÆÕÎË ÉÊ. ïÒÅÄÅÌÅÎÉÑ ÆÕÎË ÉÊ, ÒÁÚÍÅ ÝÅÎÎÙÅ × ÒÅÌÀÄÉÉ, ÍÏÖÎÏ ÓÞÉÔÁÔØ ÜÔÁÌÏÎÁÍÉ ÆÕÎË ÉÏÎÁÌØÎÏÇÏ ÓÔÉÌÑ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÑ É ÏÜÔÏÍÕ ÏÎÉ ÒÅËÏÍÅÎÄÕÀÔÓÑ ÄÌÑ ×ÎÉ ÍÁÔÅÌØÎÏÇÏ ÉÚÕÞÅÎÉÑ. äÌÑ ÔÏÇÏ ÞÔÏÂÙ ÎÅ ÄÏÂÁ×ÌÑÔØ ÏÄÏÂÎÕÀ ÓÔÒÏËÕ × ÓËÒÉÔ, ÎÏ ÏÓÔÁ×ÉÔØ ¾ÕÚÎÁ×ÁÅÍÏÅ¿ ÉÍÑ Õ ÒÏÅËÔÉÒÕÅÍÏÊ ÆÕÎË ÉÉ, ÞÁÓÔÏ Ë ÉÍÅÎÉ ÓÔÁÎÄÁÒÔÎÏÊ ÆÕÎË ÉÉ ÄÏÂÁ×ÌÑÀÔ ÓÉÍ×ÏÌ ' (ÁÏÓÔÒÏÆ, ËÏ ÔÏÒÙÊ ÎÅ ÓÌÅÄÕÅÔ ÕÔÁÔØ Ó ÓÉÍ×ÏÌÏÍ ÏÂÒÁÔÎÏÇÏ ÁÏÓÔÒÏÆÁ `, ÉÍÅ ÀÝÅÇÏ × ÑÚÙËÅ Haskell ÓÅ ÉÁÌØÎÏÅ ÎÁÚÎÁÞÅÎÉÅ). ëÏÍÁÎÄÁ :reload ÉÓÏÌØÚÕÅÔÓÑ ÂÅÚ ÁÒÇÕÍÅÎÔÁ É ÚÁÇÒÕÖÁÅÔ ÔÏÔ ÖÅ ÆÁÊÌ, ÞÔÏ É ÏÓÌÅÄÎÑÑ ËÏÍÁÎÄÁ :load. åÅ ÏÌÅÚÎÏ ÉÓÏÌØÚÏ×ÁÔØ ÏÓÌÅ ×ÎÅÓÅÎÉÑ ÉÚÍÅÎÅÎÉÊ × ÆÁÊÌ Ó ÒÏÇÒÁÍÍÏÊ. ëÏÍÁÎÄÁ :type ÏÚ×ÏÌÑÅÔ ÕÚÎÁÔØ ÔÉ ×ÙÒÁÖÅÎÉÑ ÉÌÉ ÆÕÎË ÉÉ:
---> :type square
H
22
II. úÎÁËÏÍÓÔ×Ï Ó ÑÚÙËÏÍ Haskell
square :: Integer -> Integer
H
ðÏ ÕÍÏÌÞÁÎÉÀ ÉÎÔÅÒÒÅÔÁÔÏÒ ×Ù×ÏÄÉÔ ÍÉÎÉÍÁÌØÎÏÅ ËÏÌÉÞÅ ÓÔ×Ï ÉÎÆÏÒÍÁ ÉÉ Ï ÒÏ ÅÓÓÅ ×ÙÞÉÓÌÅÎÉÑ É ÅÇÏ ÒÅÚÕÌØÔÁÔÁÈ. ëÏ ÍÁÎÄÁ :set ÉÓÏÌØÚÕÅÍÁÑ ×ÓÅÇÄÁ Ó ÄÏÏÌÎÉÔÅÌØÎÙÍÉ ÁÒÇÕÍÅÎÔÁÍÉ ÏÚ×ÏÌÑÅÔ ÉÚÍÅÎÉÔØ ×Ù×ÏÄ Ï ÕÍÏÌÞÁÎÉÀ. óÉÍ×ÏÌ + ÕÓÔÁÎÁ×ÌÉ×ÁÅÔ ÔÕ ÉÌÉ ÉÎÕÀ Ï ÉÀ, Á ÓÉÍ×ÏÌ - ÏÔÍÅÎÑÅÔ ÅÅ. îÁÉÂÏÌÅÅ ÏÌÅÚÎÙ ÉÚ Ï ÉÉ s É t, ÅÒ×ÁÑ ÉÚ ËÏÔÏÒÙÈ ÚÁÄÁÅÔ ×Ù×ÏÄ ÓÔÁÔÉÓÔÉÞÅÓËÏÊ ÉÎ ÆÏÒÍÁ ÉÉ ÏÓÌÅ ËÁÖÄÏÇÏ ×ÙÞÉÓÌÅÎÉÑ, Á ×ÔÏÒÁÑ ÏÔ×ÅÞÁÅÔ ÚÁ ×Ù×ÏÄ ÔÉÁ ÒÅÚÕÌØÔÁÔÁ ×ÙÞÉÓÌÅÎÉÑ, ÎÁÒÉÍÅÒ,
---> :set +t ---> square 15 225 :: Integer ---> :set +s ---> square 15 225 :: Integer (15 redu tions, 24 ells) ---> :set -t ---> square 15 225 (15 redu tions, 24 ells) ÷ ËÁÞÅÓÔ×Å ÉÍÅÎÉ ÁÒÇÕÍÅÎÔÁ × ÆÕÎË ÉÑÈ ÍÏÖÎÏ ÉÓÏÌØÚÏ×ÁÔØ ÎÅ ÔÏÌØËÏ x (ÞÔÏ Ñ×ÌÑÅÔÓÑ ÄÁÎØÀ ÍÁÔÅÍÁÔÉÞÅÓËÉÍ ÔÒÁÄÉ ÉÑÍ), ÎÏ É ÌÀÂÕÀ ËÏÍÂÉÎÁ ÉÀ ÌÁÔÉÎÓËÉÈ ÂÕË×, ÓÉÍ×ÏÌÏ× ÏÄÞÅÒËÉ×ÁÎÉÑ (_), ÁÏÓÔÒÏÆÏ× (') É ÉÆÒ, ÒÉ ÜÔÏÍ ÅÒ×ÙÊ ÓÉÍ×ÏÌ × ÉÍÅÎÉ ÁÒÇÕÍÅÎ ÔÁ ÏÂÑÚÁÎ ÂÙÔØ ÒÏÉÓÎÏÊ ÌÁÔÉÎÓËÏÊ ÂÕË×ÏÊ. ãÉÆÒÙ É ÁÏÓÔÒÏÆÙ ÉÓÏÌØÚÕÀÔ ÄÌÑ ÔÏÇÏ, ÞÔÏÂÙ ÕËÁÚÁÔØ ÎÁ ÉÓÏÌØÚÏ×ÁÎÉÅ ÒÁÚÌÉÞÎÙÈ ÅÒÅÍÅÎÎÙÈ ÉÌÉ ÆÕÎË ÉÊ, ÎÉËÁËÏÊ ÄÒÕÇÏÊ ÓÉÎÔÁËÓÉÞÅÓËÏÊ ÎÁÇÒÕÚ ËÉ ÏÎÉ ÎÅ ÎÅÓÕÔ. óÉÍ×ÏÌ ÏÄÞÅÒËÉ×ÁÎÉÑ × ÏÓÎÏ×ÎÏÍ ÉÓÏÌØÚÕÅÔÓÑ ÄÌÑ ÏÔÄÅÌÅÎÉÑ ÏÄÎÏÇÏ ÓÌÏ×Á ÏÔ ÄÒÕÇÏÇÏ × ÉÍÅÎÁÈ, ÓÏÓÔÏÑÝÉÈ ÉÚ ÎÅÓËÏÌØËÉÈ ÓÌÏ×. äÒÕÇÏÊ ÓÏÓÏ ÓÄÅÌÁÔØ ÜÔÏ ËÁÖÄÏÅ ÓÌÏ×Ï, ÎÁ ÞÉÎÁÑ ÓÏ ×ÔÏÒÏÇÏ, ÚÁÉÓÙ×ÁÔØ Ó ÚÁÇÌÁ×ÎÏÊ ÂÕË×Ù, ÎÁÒÉÍÅÒ:
three oneTwoThree'' = 3 íÙ ÏÒÅÄÅÌÉÌÉ ËÏÎÓÔÁÎÔÎÕÀ ÆÕÎË ÉÀ, ËÏÔÏÒÁÑ ÄÌÑ ÌÀÂÏÇÏ ÁÒ ÇÕÍÅÎÔÁ ×ÏÚ×ÒÁÝÁÅÔ ÞÉÓÌÏ 3. Haskell ÏÚ×ÏÌÑÅÔ ÏÕÓÔÉÔØ ÏÂßÑ×ÌÅ ÎÉÅ ÆÕÎË ÉÉ, ÏÄÎÁËÏ ÉÄÅÏÌÏÇÉÑ ÆÕÎË ÉÏÎÁÌØÎÏÇÏ ÒÏÇÒÁÍÍÉÒÏ ×ÁÎÉÑ ÔÁËÏ×Á, ÞÔÏ ÏÂßÑ×ÌÅÎÉÅ ÔÉÁ ÆÕÎË ÉÉ ÓÞÉÔÁÅÔÓÑ ÞÁÓÔØÀ ÉÎ ÔÅÌÌÅËÔÕÁÌØÎÏÇÏ ÒÏ ÅÓÓÁ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÑ É ÏÔÏÍÕ ÓÞÉÔÁÅÔÓÑ ÏÂÑÚÁÔÅÌØÎÙÍ. ðÒÉÎ ÉÉÁÌØÎÏÅ ÒÅÉÍÕÝÅÓÔ×Ï ÓÔÒÏÇÏÊ ÔÉÉÚÁ ÉÉ ÚÁËÌÀÞÁÅÔÓÑ × ÔÏÍ, ÞÔÏ ÍÎÏÇÉÅ ÒÏÇÒÁÍÍÎÙÅ ÏÛÉÂËÉ ÍÏÇÕÔ ÂÙÔØ ÕÓÔÒÁÎÅÎÙ ÒÅÖÄÅ, ÞÅÍ ÒÏÇÒÁÍÍÁ ÂÕÄÅÔ ÚÁÕÝÅÎÁ ÎÁ ×ÙÏÌÎÅÎÉÅ.
1. îÁÞÁÌÏ ÒÁÂÏÔÙ Ó Hugs
23
ïÇÒÏÍÎÏÅ ËÏÌÉÞÅÓÔ×Ï ÒÏÇÒÁÍÍÎÙÈ ÏÛÉÂÏË ÒÏÉÓÈÏÄÉÔ ÉÚ-ÚÁ ÔÏÇÏ, ÞÔÏ × ÆÕÎË ÉÑÈ ÕËÁÚÁÎÙ ÎÅÒÁ×ÉÌØÎÙÅ ÔÉÙ ÁÒÇÕÍÅÎÔÏ×. åÓÌÉ ÖÅ ÉÓÏÌØÚÕÅÔÓÑ ÏÂßÑ×ÌÅÎÉÅ ÔÉÏ×, ÔÏ ÒÉ ÒÏ×ÅÒËÅ ÔÉÏ× ÒÏÇÒÁÍÍÉÓÔÕ ×ÙÄÁÅÔÓÑ ÓÏÏÂÝÅÎÉÅ Ï ÏÛÉÂËÁÈ, É ÌÀÂÏÅ ÎÅÓÏÏÔ ×ÅÔÓÔ×ÉÅ ÔÉÏ× × ÒÏÇÒÁÍÍÅ ÂÕÄÅÔ ÓÒÁÚÕ ÏÂÎÁÒÕÖÅÎÏ. ÁËÁÑ ÏÒ ÇÁÎÉÚÁ ÉÑ ÒÅÄÓÔÁ×ÌÑÅÔÓÑ ÂÏÌÅÅ ÕÄÏÂÎÏÊ, ÏÓËÏÌØËÕ × ÒÏÔÉ×ÎÏÍ ÓÌÕÞÁÅ ÏÛÉÂËÁ ÒÏÑ×ÌÑÅÔÓÑ ÕÖÅ ×Ï ×ÒÅÍÑ ×ÙÏÌÎÅÎÉÑ ÒÏÇÒÁÍÍÙ É ÅÅ ÁÎÁÌÉÚ É ÌÏËÁÌÉÚÁ ÉÑ ÔÒÅÂÕÅÔ ÚÎÁÞÉÔÅÌØÎÙÈ ÚÁÔÒÁÔ ×ÒÅÍÅÎÉ. åÝÅ ÏÄÎÉÍ ÂÏÌØÛÉÍ ÄÏÓÔÏÉÎÓÔ×ÏÍ ÓÔÒÏÇÏÊ ÔÉÉÚÁ ÉÉ Ñ×ÌÑÅÔ ÓÑ ÔÏ, ÞÔÏ ÜÔÏ ÚÁÓÔÁ×ÌÑÅÔ ÒÏÇÒÁÍÍÉÓÔÁ ÂÏÌÅÅ ÄÉÓ ÉÌÉÎÉÒÏ×ÁÎ ÎÏ ÍÙÓÌÉÔØ, Á ÉÍÅÎÎÏ ÒÉÄÕÍÙ×ÁÔØ ÏÄÈÏÄÑÝÉÊ ÔÉ ×ÅÌÉÞÉÎÁÍ × ÉÈ ÏÒÅÄÅÌÅÎÉÑÈ ÒÁÎÅÅ ÏÒÅÄÅÌÅÎÉÑ ÉÈ ÓÁÍÉÈ. äÒÕÇÉÍÉ ÓÌÏ×Á ÍÉ, ÒÉ×ÅÒÖÅÎÎÏÓÔØ ÄÉÓ ÉÌÉÎÅ ÓÔÒÏÇÏÊ ÔÉÉÚÁ ÉÉ ÍÏÖÅÔ ÓÕÝÅ ÓÔ×ÅÎÎÏ ÏÍÏÞØ × ÎÁÉÓÁÎÉÉ ÑÓÎÙÈ É ÈÏÒÏÛÏ ÓÔÒÕËÔÕÒÉÒÏ×ÁÎÎÙÈ ÒÏÇÒÁÍÍ. âÕÄØÔÅ ×ÎÉÍÁÔÅÌØÎÙ ÒÉ ÓÏÚÄÁÎÉÉ ÓËÒÉÔÏ×: ÑÚÙË Haskell ÉÍÅ ÅÔ Ä×ÕÍÅÒÎÙÊ ÓÉÎÔÁËÓÉÓ! üÔÏ ÏÚÎÁÞÁÅÔ, ÞÔÏ ÉÎÔÅÒÒÅÔÁÔÏÒ ÒÅÁÇÉ ÒÕÅÔ ÎÅ ÔÏÌØËÏ ÎÁ ÓÉÎÔÁËÓÉÞÅÓËÉÅ ÏÛÉÂËÉ, ÓÏÄÅÒÖÁÝÉÅÓÑ × ÒÏ ÇÒÁÍÍÅ, ÎÏ É ÎÁ ÒÁÓÏÌÏÖÅÎÉÅ ÔÅËÓÔÁ × ÆÁÊÌÅ. ïÂßÑ×ÌÅÎÉÅ É ÏÒÅÄÅÌÅÎÉÅ ÆÕÎË ÉÉ ÒÁÚÍÅÝÁÀÔÓÑ ÎÁ ÏÔÄÅÌØ ÎÙÈ ÓÔÒÏËÁÈ (ÒÉ ÖÅÌÁÎÉÉ ÉÈ ÍÏÖÎÏ ÒÁÚÍÅÝÁÔØ É ÎÁ ÏÄÎÏÊ ÓÔÒÏËÅ, ÏÔÄÅÌÑÑ ÉÈ ÔÏÞËÏÊ Ó ÚÁÑÔÏÊ, ÞÔÏ, ÏÄÎÁËÏ, ÚÎÁÞÉÔÅÌØÎÏ ÕÈÕÄÛÁÅÔ ¾ÞÉÔÁÂÅÌØÎÏÓÔØ¿ ÏÄÏÂÎÏÇÏ ÓËÒÉÔÁ). åÓÌÉ ÏÒÅÄÅÌÅÎÉÅ ÆÕÎË ÉÉ ÒÁÚÍÅÝÅÎÏ ÎÁ ÎÅÓËÏÌØËÉÈ ÓÔÒÏËÁÈ, ÔÏ ×ÓÅ ÏÓÌÅÄÕÀÝÉÅ, ÎÁÞÉÎÁÑ ÓÏ ×ÔÏÒÏÊ, ÄÏÌÖÎÙ ÓÌÅÄÏ×ÁÔØ Ó ÏÔÓÔÕÏÍ × ÎÁÞÁÌÅ ÓÔÒÏËÉ. ëÁË É × ÌÀÂÏÍ ÄÒÕÇÏÍ ÑÚÙËÅ, × Haskell ÉÍÅÅÔÓÑ ÎÅÓËÏÌØËÏ ÚÁ ÒÅÚÅÒ×ÉÒÏ×ÁÎÎÙÈ ÄÌÑ ÓÌÕÖÅÂÎÙÈ ÅÌÅÊ ÓÌÏ×, ËÏÔÏÒÙÅ ÎÅÌØÚÑ ÉÓ ÏÌØÚÏ×ÁÔØ × ËÁÞÅÓÔ×Å ÉÍÅÎ ÆÕÎË ÉÊ ÉÌÉ ÅÒÅÍÅÎÎÙÈ:
ase lass data else if in infix infixl infixr instan e let of primitive then type where 1.3. ¾Literate style¿ óÌÏÖÎÏ ÄÁÔØ ÁÄÅË×ÁÔÎÙÊ ÅÒÅ×ÏÄ ÜÔÏÇÏ ÔÅÒÍÉÎÁ, ÒÅÄÌÏÖÅÎ ÎÏÇÏ äÏÎÁÌØÄÏÍ ëÎÕÔÏÍ, ÎÁ ÒÕÓÓËÉÊ ÑÚÙË. ïÓÎÏ×ÎÁÑ ËÏÎ Å ÉÑ ÜÔÏÇÏ ÏÎÑÔÉÑ ÓÁÍÏÄÏËÕÍÅÎÔÉÒÏ×ÁÎÎÏÓÔØ ÒÏÇÒÁÍÍ. ïÎÉ ÄÏÌÖ ÎÙ ÂÙÔØ ÏÎÑÔÎÙ ÌÀÂÏÍÕ ÞÉÔÁÔÅÌÀ, ÞÔÏ ÄÏÓÔÉÇÁÅÔÓÑ ×ÎÅÄÒÅÎÉÅÍ × ÔÅÌÏ ÒÏÇÒÁÍÍÙ ÄÏÓÔÁÔÏÞÎÏÇÏ ËÏÌÉÞÅÓÔ×Á ËÏÍÍÅÎÔÁÒÉÅ×. äÌÑ ×ËÌÀÞÅÎÉÑ × ÔÅÌÏ ÒÏÇÒÁÍÍÙ ÎÁ ÑÚÙËÅ Haskell ÏÄÎÏÓÔÒÏÞ ÎÙÈ ËÏÍÍÅÎÔÁÒÉÅ× ÉÓÏÌØÚÕÅÔÓÑ ËÏÍÂÉÎÁ ÉÑ ÓÉÍ×ÏÌÏ× --. ÅËÓÔ,
24
II. úÎÁËÏÍÓÔ×Ï Ó ÑÚÙËÏÍ Haskell
ÒÁÓÏÌÏÖÅÎÎÙÊ ÍÅÖÄÕ ÎÉÍÉ É ËÏÎ ÏÍ ÓÔÒÏËÉ, ÓÞÉÔÁÅÔÓÑ ËÏÍÍÅÎ ÔÁÒÉÅÍ. ëÏÍÂÉÎÁ ÉÑÍÉ ÓÉÍ×ÏÌÏ× {... -} ÏÇÒÁÎÉÞÉ×ÁÀÔ ÍÎÏÇÏÓ ÔÒÏÞÎÙÅ ËÏÍÍÅÎÔÁÒÉÉ. ÅËÓÔ, ÚÁËÌÀÞÅÎÎÙÊ ÍÅÖÄÕ ÎÉÍÉ, ÉÇÎÏÒÉ ÒÕÅÔÓÑ. ÁËÏÊ ËÏÍÍÅÎÔÁÒÉÊ ÍÏÖÅÔ ÂÙÔØ ×ÓÔÁ×ÌÅÎ ÎÁ ÍÅÓÔÏ ÌÀÂÏÇÏ ÒÏÂÅÌÁ × ÒÏÇÒÁÍÍÅ. äÏÕÓËÁÀÔÓÑ É ×ÌÏÖÅÎÎÙÅ ËÏÍÍÅÎÔÁÒÉÉ:
{f x = {- hello -} 2*x -} ÷ ÒÉ×ÅÄÅÎÎÏÍ ×ÙÛÅ ÆÒÁÇÍÅÎÔÅ ÒÏÇÒÁÍÍÙ ÎÅ ÏÒÅÄÅÌÅÎÁ ÆÕÎË ÉÑ f, ÔÁË ËÁË ×ÅÓØ ÆÒÁÇÍÅÎÔ Ñ×ÌÑÅÔÓÑ ËÏÍÍÅÎÔÁÒÉÅÍ.
I õÒÁÖÎÅÎÉÅ II.1.2
éÚÍÅÎÉÔÅ ÆÁÊÌ myprog.hs, ÄÏÂÁ×É× × ÎÅÇÏ ËÏÍÍÅÎÔÁÒÉÉ É ÎÏ×ÙÅ ÆÕÎË ÉÉ:
{äÌÑ ÏÌÕÞÅÎÉÑ ÆÕÎË ÉÉ, ×ÏÚ×ÏÄÑÝÅÊ ÅÌÏÅ ÞÉÓÌÏ × ÞÅÔ×ÅÒÔÕÀ ÓÔÅÅÎØ, ×ÏÓÏÌØÚÕÅÍÓÑ ËÏÍÏÚÉ ÉÅÊ ÆÕÎË ÉÊ square -} square, quad :: Integer -> Integer -- ÏÂßÑ×ÌÅÎÙ Ä×Å ÆÕÎË ÉÉ square x = x*x quad x = (square . square) x -- äÒÕÇÏÅ ÏÒÅÄÅÌÅÎÉÅ quad' :: Integer -> Integer quad' x = square (square x)
J
íÎÏÇÉÅ ÓÏ×ÒÅÍÅÎÎÙÅ ÑÚÙËÉ ÏÚ×ÏÌÑÀÔ ×ÎÅÄÒÉÔØ × ÔÅÌÏ ÒÏ ÇÒÁÍÍÙ ËÏÍÍÅÎÔÁÒÉÉ ÔÁËÉÍ ÏÂÒÁÚÏÍ, ÞÔÏ ÒÉ ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÅÊ Ï ÒÁÂÏÔËÅ ÅÅ ÔÅËÓÔÁ ÏÌÕÞÉÔØ ÉÓÞÅÒÙ×ÁÀÝÕÀ ÄÏËÕÍÅÎÔÁ ÉÀ Ë ÎÅÊ. îÁÏÍÎÉÍ, ÎÁÒÉÍÅÒ, Ï ËÏÍÍÅÎÔÁÒÉÑÈ ×ÉÄÁ /** ... */ × ÑÚÙËÅ Java É ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÅÊ ÒÏÇÒÁÍÍÅ javado , ÏÂÒÁÂÁÔÙ×ÁÀÝÅÊ ÉÈ. õÞÉÔÙ×ÁÑ ÔÏÔ ÆÁËÔ, ÞÔÏ ÒÏÇÒÁÍÍÙ, ÎÁÉÓÁÎÎÙÅ ÆÕÎË ÉÏÎÁÌØ ÎÏÍ ÓÔÉÌÅ, ÏÞÅÎØ ËÏÍÁËÔÎÙ, ÎÏ ÄÁÌÅËÏ ÎÅ ×ÓÅÇÄÁ ÑÓÎÙ ÎÅÉÓËÕÛÅÎ ÎÏÍÕ ÞÉÔÁÔÅÌÀ × ÅÒ×ÏÇÏ ×ÚÇÌÑÄÁ, ÏÎÑÔÎÏ, ÞÔÏ ÏÞÅÎØ ÖÅÌÁÔÅÌØÎÏ ÕÍÅÔØ ÒÁ×ÉÌØÎÏ ÄÏËÕÍÅÎÔÉÒÏ×ÁÔØ ÒÏÇÒÁÍÍÕ. ðÒÏÇÒÁÍÍÙ ÎÁ ÑÚÙËÅ Haskell, ÎÁÉÓÁÎÎÙÅ × ÔÁËÏÍ ÓÔÉÌÅ, ÄÏÌÖ ÎÙ ÓÏÈÒÁÎÑÔØÓÑ × ÆÁÊÌÁÈ Ó ÒÁÓÛÉÒÅÎÉÅÍ lhs. ïÎÉ ÒÅÄÓÔÁ×ÌÑÀÔ
1. îÁÞÁÌÏ ÒÁÂÏÔÙ Ó Hugs
25
ÓÏÂÏÊ ÌÀÂÏÊ ÔÅËÓÔ, ËÏÔÏÒÙÊ ÍÏÖÅÔ ËÁË ÓÏÄÅÒÖÁÔØ, ÔÁË É ÎÅ ÓÏÄÅÒ ÖÁÔØ ÜÌÅÍÅÎÔÙ ÒÁÚÍÅÔËÉ. ëÏÄ ÎÁ Haskell, ÒÁÚÍÅÝÁÅÍÙÊ × ÔÁËÏÍ ÆÁÊÌÅ, ÄÏÌÖÅÎ ÏÔÄÅÌÑÔØÓÑ ÏÔ ÏÓÔÁÌØÎÏÇÏ ÔÅËÓÔÁ ÕÓÔÙÍÉ ÓÔÒÏËÁ ÍÉ É × ÅÒ×ÏÊ ÏÚÉ ÉÉ ÓÔÒÏËÉ ÓÏÄÅÒÖÁÔØ ÓÉÍ×ÏÌ >, ÏÓÌÅ ËÏÔÏÒÏÇÏ ÓÌÅÄÕÅÔ ÒÏÂÅÌ.
ÏÂÑÚÁÔÅÌØÎÏ
I õÒÁÖÎÅÎÉÅ II.1.3 ðÏÍÅÓÔÉÔÅ ÓÌÅÄÕÀÝÉÊ ÔÅËÓÔ × ÆÁÊÌ sq.lhs, ×ÎÉÍÁÔÅÌØÎÏ ÓÌÅÄÑ ÚÁ ÒÁÚÍÅÝÅÎÉÅÍ Ä×ÕÈ ÓÔÒÏË ËÏÄÁ:
æÕÎË ÉÑ squareNew, ÏÒÅÄÅÌÅÎÎÁÑ ÎÁ ÍÎÏÖÅÓÔ×Å ÅÌÙÈ ÞÉÓÅÌ, ×ÏÚ×ÒÁÝÁÅÔ Ë×ÁÄÒÁÔ Ó×ÏÅÇÏ ÁÒÇÕÍÅÎÔÁ.
> squareNew :: Integer -> Integer > squareNew(x) = x*x úÄÅÓØ ÉÓÏÌØÚÏ×ÁÎÁ ÄÒÕÇÁÑ ÆÏÒÍÁ ×ÙÚÏ×Á ÆÕÎË ÉÉ: ÁÒÇÕÍÅÎÔ ÚÁËÌÀÞÅÎ × ËÒÕÇÌÙÅ ÓËÏÂËÉ. äÌÑ ÆÕÎË ÉÊ, ÚÁ×ÉÓÑÝÉÈ ÏÔ ÏÄÎÏÊ ÅÒÅÍÅÎÎÏÊ, ÄÏÕÓÔÉÍÙ ÏÂÅ ÆÏÒÍÙ ×ÙÚÏ×Á, ÎÁÒÉÍÅÒ, squareNew(123) É squareNew 123.
J ÁËÏÊ ÆÁÊÌ ÚÁÇÒÕÖÁÅÔÓÑ ÓÔÁÎÄÁÒÔÎÙÍ ÓÏÓÏÂÏÍ É ÏÂÒÁÂÁÔÙ×Á ÅÔÓÑ ÉÎÔÅÒÒÅÔÁÔÏÒÏÍ ÁÎÁÌÏÇÉÞÎÏ ÆÁÊÌÁÍ Ó ÒÁÓÛÉÒÅÎÉÅÍ hs:
---> :load sq.lhs Reading file "sq.lhs": Hugs session for: /usr/share/hugs/lib/Prelude.hs sq.lhs ---> squareNew(123) 15129 ---> squareNew 123 15129 äÒÕÇÏÊ ÓÏÓÏ ÏÄÇÏÔÏ×ËÉ ÓÁÍÏÄÏËÕÍÅÎÔÉÒÏ×ÁÎÎÙÈ ÒÏÇÒÁÍÍ ÎÁ ÑÚÙËÅ Haskell ÒÅÄÎÁÚÎÁÞÅÎ ÄÌÑ ÏÌØÚÏ×ÁÔÅÌÅÊ, ÉÓÏÌØÚÕÀÝÉÈ ÓÉÓÔÅÍÕ ËÏÍØÀÔÅÒÎÏÊ ×ÅÒÓÔËÉ ÔÅËÓÔÁ TEX. üÔÁ ÓÉÓÔÅÍÁ ÛÉÒÏËÏ ÉÓÏÌØÚÕÅÔÓÑ ÎÁÕÞÎÙÍÉ É ÉÎÖÅÎÅÒÎÙÍÉ ÒÁÂÏÔÎÉËÁÍÉ, ÔÁË ËÁË ÏÎÁ
H
26
II. úÎÁËÏÍÓÔ×Ï Ó ÑÚÙËÏÍ Haskell
ÏÚ×ÏÌÑÅÔ ÏÌÉÇÒÁÆÉÞÅÓËÉ ÂÅÚÕÒÅÞÎÏ ÏÄÇÏÔÏ×ÉÔØ ÌÀÂÏÊ ÓÌÏÖ ÎÙÊ ÍÎÏÇÏÑÚÙÞÎÙÊ ÔÅËÓÔ É ÌÀÂÕÀ ÍÁÔÅÍÁÔÉÞÅÓËÕÀ ÆÏÒÍÕÌÕ. îÁ ÛÅÊ ÅÌØÀ ÎÅ Ñ×ÌÑÅÔÓÑ ÚÎÁËÏÍÓÔ×Ï Ó ÜÔÉÍ ÑÚÙËÏÍ ÒÁÚÍÅÔËÉ ÔÅË ÓÔÁ. ïÔÍÅÔÉÍ ÔÏÌØËÏ, ÞÔÏ ÅÓÌÉ × ÔÅËÓÔÅ ÓÏÄÅÒÖÉÔÓÑ ÆÒÁÇÍÅÎÔ ÒÏ ÇÒÁÍÍÙ, ÎÁÉÓÁÎÎÏÊ ÎÁ ÔÏÍ ÉÌÉ ÉÎÏÍ ÑÚÙËÅ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÑ, ÔÏ ÅÇÏ ÒÅËÏÍÅÎÄÕÅÔÓÑ ÚÁËÌÀÞÁÔØ ÍÅÖÄÕ ÓÔÒÏËÁÍÉ \begin{ ode} É \end{ ode}. Hugs ÒÉ ÒÏÓÍÏÔÒÅ ÏÄÏÂÎÏÇÏ ÔÅËÓÔÁ ÉÇÎÏÒÉÒÕÅÔ ×ÓÅ, ÞÔÏ ÒÁÓ ÏÌÏÖÅÎÏ ×ÎÅ ÏËÒÕÖÅÎÉÑ ode, Á ÔÅËÓÔ, ÒÁÚÍÅÝÅÎÎÙÊ ×ÎÕÔÒÉ ÎÅÇÏ, ÓÞÉÔÁÅÔ ÒÏÇÒÁÍÍÏÊ ÎÁÉÓÁÎÎÏÊ ÎÁ Haskell. ðÕÓÔØ ÆÁÊÌ, ÓÏÄÅÒÖÉÔ ÓÌÅÄÕÀÝÉÊ ÔÅËÓÔ:
\ enterline{íÁËÓÉÍÕÍ ÉÚ Ä×ÕÈ ÞÉÓÅÌ} æÕÎË ÉÀ, ÏÒÅÄÅÌÑÀÝÕÀ ÍÁËÓÉÍÁÌØÎÏÅ ÉÚ Ä×ÕÈ ÞÉÓÅÌ, ÍÏÖÎÏ ÚÁÄÁÔØ Ó ÏÍÏÝØÀ ËÏÎÓÔÒÕË ÉÉ {\tt if \ldots then \ldots else}: \begin{ ode} myMax :: Int -> Int -> Int myMax x y = if x >= y then x else y \end{ ode} úÁÇÒÕÚÉ× ÆÕÎË ÉÀ, ÍÏÖÎÏ ÉÓÏÌØÚÏ×ÁÔØ ÅÅ ×ÍÅÓÔÏ ÆÕÎË ÉÉ {\tt max}, ÏÒÅÄÅÌÅÎÎÏÊ × ÒÅÌÀÄÉÉ.
H
ëÁË É × ÒÅÄÙÄÕÝÅÍ ÓÌÕÞÁÅ, ÆÁÊÌ ÄÏÌÖÅÎ ÉÍÅÔØ ÒÁÓÛÉÒÅÎÉÅ lhs, ÎÁÒÉÍÅÒ max.lhs:
---> :l max.lhs Reading file "max.lhs": Hugs session for: /usr/share/hugs/lib/Prelude.hs max.lhs ---> myMax 100 200 200
÷ÏÒÏÓÙ É ÚÁÄÁÎÉÑ II.1.1
ðÒÉ×ÅÄÉÔÅ ÒÉÞÉÎÙ, Ï ËÏÔÏÒÙÍ ÓÌÅÄÕÅÔ ÒÉÄÅÒÖÉ×ÁÔØÓÑ ÒÉÎ É Ï× ÓÔÒÏÇÏÊ ÔÉÉÚÁ ÉÉ.
2. âÁÚÏ×ÙÅ ÔÉÙ ÑÚÙËÁ Haskell
27
II.1.2
ëÁËÏ×Ï ÎÁÚÎÁÞÅÎÉÅ ÆÁÊÌÁ Prelude.hs? II.1.3
ïÒÅÄÅÌÉÔÅ ÆÕÎË ÉÀ ube, ×ÏÚ×ÏÄÑÝÕÀ × ËÕ ÞÉÓÌÁ ÔÉÁ Float.
2. âÁÚÏ×ÙÅ ÔÉÙ ÑÚÙËÁ Haskell ÷ ÆÕÎË ÉÏÎÁÌØÎÏÍ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÉ ×ÓÅ ÍÎÏÖÅÓÔ×Ï ×ÅÌÉÞÉÎ ÒÁÚÄÅÌÑÅÔÓÑ ÎÁ ÏÒÇÁÎÉÚÏ×ÁÎÎÙÅ ÇÒÕÙ, ÎÁÚÙ×ÁÅÍÙÅ . íÙ ÕÖÅ ÓÔÁÌËÉ×ÁÌÉÓØ Ó ÅÌÙÍÉ (Integer) ÞÉÓÌÁÍÉ. äÌÑ ÒÁÂÏÔÙ Ó ÄÒÏ ÎÙÍÉ ÞÉÓÌÁÍÉ ÞÁÝÅ ×ÓÅÇÏ ÉÓÏÌØÚÕÅÔÓÑ ÔÉ Float. ëÒÏÍÅ ÎÉÈ ÓÕ ÝÅÓÔ×ÕÀÔ ÅÝÅ ÄÒÕÇÉÅ ÔÉÙ ÞÉÓÅÌ (ÎÁÒÉÍÅÒ Int É Double), ÌÏÇÉ ÞÅÓËÉÅ ×ÅÌÉÞÉÎÙ (ÜÌÅÍÅÎÔÙ ÍÎÏÖÅÓÔ×Á Bool), ÓÉÍ×ÏÌÙ (ÜÌÅÍÅÎÔÙ ÍÎÏÖÅÓÔ×Á Char), ÓÉÓËÉ, ÄÅÒÅ×ØÑ É Ô. Ä. äÁÌÅÅ ÍÙ ÏÚÎÁËÏÍÉÍÓÑ Ó ÜÔÉÍÉ ÔÉÁÍÉ, Á ÔÁËÖÅ ÕÚÎÁÅÍ, ËÁË ÏÒÅÄÅÌÑÔØ ÎÏ×ÙÅ ÔÉÙ.
ÔÉÁÍÉ
ïÄÎÏÊ ÉÚ ÏÓÏÂÅÎÎÏÓÔÅÊ ÑÚÙËÏ× ÆÕÎË ÉÏÎÁÌØÎÏÇÏ ÒÏÇÒÁÍÍÉÒÏ ×ÁÎÉÑ Ñ×ÌÑÅÔÓÑ ÔÏ, ÞÔÏ ÆÕÎË ÉÉ ÞÁÓÔÏ ×ÙÓÔÕÁÀÔ × ÒÏÌÉ ÄÁÎÎÙÈ. ÁË ÆÕÎË ÉÑ ÍÏÖÅÔ Ñ×ÌÑÔØÓÑ ÁÒÇÕÍÅÎÔÏÍ ÄÒÕÇÏÊ ÆÕÎË ÉÉ ÉÌÉ ÂÙÔØ ÒÅÚÕÌØÔÁÔÏÍ ×ÙÏÌÎÅÎÉÑ ÆÕÎË ÉÉ. ëÁÖÄÙÊ ÔÉ ÁÓÓÏ ÉÉÒÕÅÔÓÑ Ó ÏÒÅÄÅÌÅÎÎÙÍ ÎÁÂÏÒÏÍ ÏÅÒÁ ÉÊ, ËÏÔÏÒÙÅ ÍÏÇÕÔ ÎÅ ÉÍÅÔØ ÓÍÙÓÌÁ ÄÌÑ ÄÒÕÇÉÈ ÔÉÏ×. ÁË, ÎÅÌØÚÑ, ÎÁÒÉÍÅÒ, ÒÁÚÄÅÌÉÔØ ÏÄÎÕ ÌÏÇÉÞÅÓËÕÀ ×ÅÌÉÞÉÎÕ ÎÁ ÄÒÕÇÕÀ ÉÌÉ ÎÅ ÅÒÅÍÎÏÖÉÔØ Ä×Å ÆÕÎË ÉÉ. ÷ÁÖÎÙÍ ÒÉÎ ÉÏÍ ÍÎÏÇÉÈ ÑÚÙËÏ× ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÑ Ñ×ÌÑÅÔ ÓÑ ÔÏ, ÞÔÏ ËÁÖÄÏÅ ÒÁ×ÉÌØÎÏ ÓÏÓÔÁ×ÌÅÎÎÏÅ ×ÙÒÁÖÅÎÉÅ ÍÏÖÅÔ ÂÙÔØ ÓÏÏÔÎÅÓÅÎÏ Ó ÎÅËÏÔÏÒÙÍ ÔÉÏÍ. ëÒÏÍÅ ÔÏÇÏ, ÜÔÏÔ ÔÉ ÍÏÖÅÔ ÂÙÔØ ×Ù×ÅÄÅÎ ÉÓËÌÀÞÉÔÅÌØÎÏ ÉÚ ÔÉÏ× ÓÏÓÔÁ×ÎÙÈ ÞÁÓÔÅÊ ×ÙÒÁÖÅÎÉÑ. äÒÕÇÉÍÉ ÓÌÏ×ÁÍÉ, ÚÎÁÞÅÎÉÅ ×ÙÒÁÖÅÎÉÑ ÏÌÎÏÓÔØÀ ÏÒÅÄÅÌÑÅÔÓÑ ×ÅÌÉÞÉÎÁÍÉ, ÓÏÓÔÁ×ÌÑÀÝÉÍÉ ÄÁÎÎÏÅ ×ÙÒÁÖÅÎÉÅ. åÝÅ ÒÁÚ ÏÔÍÅÔÉÍ ×ÁÖÎÏÓÔØ ÓÔÒÏÇÏÊ ÔÉÉÚÁ ÉÉ: ËÁÖÄÏÅ ×ÙÒÁÖÅ ÎÉÅ, ËÏÔÏÒÏÅ ÎÅ ÍÏÖÅÔ ÂÙÔØ ÁÓÓÏ ÉÉÒÏ×ÁÎÏ Ó ÒÉÅÍÌÅÍÙÍ ÔÉÏÍ, ÓÞÉÔÁÅÔÓÑ ÎÅ×ÅÒÎÏ ÓÆÏÒÍÉÒÏ×ÁÎÎÙÍ É ÏÔ×ÅÒÇÁÅÔÓÑ ËÏÍØÀÔÅÒÏÍ ÄÏ ×ÙÞÉÓÌÅÎÉÑ. îÁÒÉÍÅÒ, ×ÙÒÁÖÅÎÉÅ square square 3 ÂÕÄÅÔ ÏÔ ×ÅÒÇÎÕÔÏ ÉÎÔÅÒÒÅÔÁÔÏÒÏÍ, ÏÔÏÍÕ ÞÔÏ ÏÎÏ ÎÅ Ñ×ÌÑÅÔÓÑ ÒÁ×ÉÌØÎÏ ÓÆÏÒÍÉÒÏ×ÁÎÎÙÍ. áÎÁÌÏÇÉÞÎÏ, ÅÓÌÉ Ë ÎÁÛÅÍÕ ÓËÒÉÔÕ ÄÏÂÁ×ÉÔØ ÆÕÎË ÉÀ
quad :: Integer -> Integer quad x = square square x
II. úÎÁËÏÍÓÔ×Ï Ó ÑÚÙËÏÍ Haskell
28
ÔÏ ÏÎ ÂÕÄÅÔ ÏÔ×ÅÒÇÎÕÔ ËÏÍØÀÔÅÒÏÍ, ÏÔÏÍÕ ÞÔÏ ×ÙÒÁÖÅÎÉÅ square square x ÎÅ Ñ×ÌÑÅÔÓÑ ÒÁ×ÉÌØÎÏ ÓÆÏÒÍÉÒÏ×ÁÎÎÙÍ (ÄÌÑ ÉÓÒÁ×ÌÅÎÉÑ ÏÛÉÂËÉ ÄÏÓÔÁÔÏÞÎÏ ÚÁËÌÀÞÉÔØ × ÓËÏÂËÉ ×ÙÒÁÖÅÎÉÅ square x). äÒÕÇÉÍ ÂÏÌØÛÉÍ ÄÏÓÔÏÉÎÓÔ×ÏÍ ÓÔÒÏÇÏÊ ÔÉÉÚÁ ÉÉ Ñ×ÌÑÅÔÓÑ ÔÏ, ÞÔÏ ÂÏÌØÛÏÊ ÄÉÁÁÚÏÎ ÏÛÉÂÏË ÏÔ ÒÏÓÔÏÊ ÏÒÆÏÇÒÁÆÉÞÅÓËÏÊ ÏÛÉÂËÉ ÄÏ ÎÁÉÓÁÎÎÏÇÏ ËÏÅ-ËÁË ÏÒÅÄÅÌÅÎÉÑ ×ÙÑ×ÌÑÅÔÓÑ ÄÏ ×Ù ÞÉÓÌÅÎÉÑ. íÏÖÎÏ ×ÙÄÅÌÉÔØ Ä×Å ÓÔÁÄÉÉ ÁÎÁÌÉÚÁ ×ÙÒÁÖÅÎÉÑ, ËÏÔÏÒÙÊ ÒÏ ×ÏÄÉÔÓÑ ÅÒÅÄ ×ÙÞÉÓÌÅÎÉÅÍ. óÎÁÞÁÌÁ ÒÏ×ÅÒÑÅÔÓÑ ËÏÒÒÅËÔÎÏÓÔØ ×ÙÒÁÖÅÎÉÑ Ó ÔÏÞËÉ ÚÒÅÎÉÑ ÓÉÎÔÁËÓÉÓÁ. åÓÌÉ ×ÙÒÁÖÅÎÉÅ ÎÅ ËÏÒ ÒÅËÔÎÏ, ÔÏ ×ÙÄÁÅÔÓÑ ÓÉÇÎÁÌ Ï . åÓÌÉ ÓÉÎÔÁËÓÉÞÅÓËÉÈ ÏÛÉÂÏË ÎÅ ÏÂÎÁÒÕÖÅÎÏ, ÔÏ ÒÏÉÚ×Ï ÄÉÔÓÑ ËÏÎÔÒÏÌØ ÎÁ ÒÁÚÕÍÎÏÓÔØ ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÉÈ ÔÉÏ×. åÓÌÉ ×Ù ÒÁÖÅÎÉÅ ÎÅ ÒÏÛÌÏ ÜÔÕ ÓÔÁÄÉÀ, ÔÏ ×ÙÄÁÅÔÓÑ ÓÏÏÂÝÅÎÉÅ Ï . ÏÌØËÏ ÅÓÌÉ ×ÙÒÁÖÅÎÉÅ ÒÏÛÌÏ ÏÂÅ ÜÔÉ ÓÔÁÄÉÉ ÁÎÁÌÉÚÁ, ÍÏÖÅÔ ÎÁÞÉÎÁÔØÓÑ ÒÏ ÅÓÓ ×ÙÞÉÓÌÅÎÉÑ. áÎÁÌÏÇÉÞÎÏÅ ÚÁ ÍÅÞÁÎÉÅ ÏÔÎÏÓÉÔÓÑ É Ë ÏÒÅÄÅÌÅÎÉÑÍ, ÓÏÚÄÁÎÎÙÍ × ÓËÒÉÔÁÈ.
ÓÉÎÔÁËÓÉÞÅÓËÏÊ ÏÛÉÂËÅ (sintax
error)
ÔÉÁ (type error)
ÏÛÉÂËÅ
2.1. æÕÎË ÉÉ îÁÏÍÎÉÍ ÍÁÔÅÍÁÔÉÞÅÓËÏÅ ÏÒÅÄÅÌÅÎÉÅ ÆÕÎË ÉÉ.
æÕÎË ÉÑ ÜÔÏ ÒÁ×ÉÌÏ, ÏÂÅÓÅÞÉ×ÁÀÝÅÅ ÏÔÏÂÒÁÖÅ ÎÉÅ ÏÂßÅËÔÏ× ÉÚ ÍÎÏÖÅÓÔ×Á ×ÅÌÉÞÉÎ, ÎÁÚÙ×ÁÅÍÏÇÏ ÏÂÌÁ ÓÔØÀ ÏÒÅÄÅÌÅÎÉÑ ÆÕÎË ÉÉ, × ÏÂßÅËÔÙ ÎÅËÏÔÏÒÏÇÏ ÅÌÅ ×ÏÇÏ ÍÎÏÖÅÓÔ×Á, ÉÍÅÎÕÅÍÏÇÏ ÏÂÌÁÓÔØÀ ÚÎÁÞÅÎÉÊ ÆÕÎË ÉÊ ÉÌÉ ÄÉÁÁÚÏÎÏÍ ÚÎÁÞÅÎÉÊ ÆÕÎË ÉÉ.
äÒÕÇÉÍÉ ÓÌÏ×ÁÍÉ, ÒÉ ÏÒÅÄÅÌÅÎÉÉ ÆÕÎË ÉÉ ÓÌÅÄÕÅÔ ÚÁÄÁÔØ ÓÌÅ ÄÕÀÝÕÀ : ÏÔËÕÄÁ (X ), ËÕÄÁ (Y ) É ËÁË (f ). ïÓÎÏ×ÎÏÅ ÔÒÅÂÏ ×ÁÎÉÅ ÒÉ ÚÁÄÁÎÉÉ ÒÁ×ÉÌÁ: ËÁÖÄÙÊ ÜÌÅÍÅÎÔ ÉÓÈÏÄÎÏÇÏ ÍÎÏÖÅÓÔ×Á ÏÔÏÂÒÁÖÁÅÔÓÑ × ÅÄÉÎÓÔ×ÅÎÎÙÊ ÜÌÅÍÅÎÔ ÅÌÅ×ÏÇÏ ÍÎÏÖÅÓÔ×Á. ðÏÌÅÚÎÏ ÒÅÄÓÔÁ×ÌÅÎÉÅ Ï ÆÕÎË ÉÉ ËÁË Ï ¾ÞÅÒÎÏÍ ÑÝÉËÅ¿: ÎÁ ×ÈÏÄ ÏÄÁÅÔÓÑ ÜÌÅÍÅÎÔ ÉÚ ÏÂÌÁÓÔÉ ÏÒÅÄÅÌÅÎÉÑ, ÎÁ ×ÙÈÏÄÅ ÏÌÕ ÞÁÅÔÓÑ ÜÌÅÍÅÎÔ ÉÚ ÏÂÌÁÓÔÉ ÚÎÁÞÅÎÉÊ, ÏÒÅÄÅÌÑÅÍÙÊ Ï ÒÁ×ÉÌÕ, ÚÁÄÁÀÝÅÍÕ ÆÕÎË ÉÀ. òÁÚÌÉÞÁÀÔ ÓÌÅÄÕÀÝÉÅ ÓÏÓÏÂÙ ÚÁÄÁÎÉÑ ÆÕÎË ÉÊ:
ÔÒÏÊËÕ
ÔÁÂÌÉÞÎÙÊ ÇÒÏÍÏÚÄËÉÊ, ÔÒÅÂÕÀÝÉÊ Ñ×ÎÏÇÏ ÕËÁÚÁÎÉÑ ÒÅ ÚÕÌØÔÁÔÁ ÄÌÑ ÌÀÂÏÇÏ ÜÌÅÍÅÎÔÁ ÉÚ ÏÂÌÁÓÔÉ ÏÒÅÄÅÌÅÎÉÑ, ÆÁË ÔÉÞÅÓËÉ ÔÒÅÂÕÅÔÓÑ ÚÁÄÁÎÉÅ ÍÎÏÖÅÓÔ×Á ÓÏÏÔÎÏÛÅÎÉÊ ×ÉÄÁ y = f (x); 8x 2 X .
2. âÁÚÏ×ÙÅ ÔÉÙ ÑÚÙËÁ Haskell
29
Ó ÏÍÏÝØÀ ÒÁ×ÉÌ, ÚÁÄÁÀÝÉÈ ÓÏÓÏ ÒÅÏÂÒÁÚÏ×ÁÎÉÊ ÉÓÈÏÄ ÎÏÇÏ ÍÎÏÖÅÓÔ×Á.
òÁÓÓÍÏÔÒÉÍ ÆÕÎË ÉÀ sign, ÏÒÅÄÅÌÅÎÎÕÀ ÎÁ ÍÎÏÖÅÓÔ×Å ÅÌÙÈ ÞÉÓÅÌ ÓÌÅÄÕÀÝÉÍ ÓÏÓÏÂÏÍ: sign(x) = 1 ÄÌÑ ÏÌÏÖÉÔÅÌØÎÙÈ x, sign(x) = 1 ÄÌÑ ÏÔÒÉ ÁÔÅÌØÎÙÈ x, × ÎÕÌÅ ÆÕÎË ÉÑ ÒÉÎÉÍÁÅÔ ÚÎÁÞÅÎÉÅ ÒÁ×ÎÏÅ ÎÕÌÀ. äÌÑ ÎÅÅ ÏÂÌÁÓÔØÀ ÏÒÅÄÅÌÅÎÉÑ Ñ×ÌÑÅÔÓÑ ÍÎÏÖÅÓÔ×Ï ÅÌÙÈ ÞÉÓÅÌ, ÏÂÌÁÓÔØÀ ÚÎÁÞÅÎÉÊ ÍÎÏÖÅÓÔ×Ï, ÓÏÓÔÏ ÑÝÅÅ ÉÚ ÔÒÅÈ ÞÉÓÅÌ: f 1; 0; 1g. äÌÑ ÌÀÂÏÇÏ ÅÌÏÇÏ ÞÉÓÌÁ sign(x) ÏÄÎÏÚÎÁÞÎÏ ÏÒÅÄÅÌÅÎÅÎÎÏ. ðÒÉ ÔÁÂÌÉÞÎÏÍ ÓÏÓÏÂÅ ÚÁÄÁÎÉÑ ÎÁÍ ÒÉÛÌÏÓØ ÂÙ ÚÁÄÁÔØ ÂÅÓ ËÏÎÅÞÎÏÅ ÞÉÓÌÏ ÕÒÁ×ÎÅÎÉÊ ×ÉÄÁ: ... sign( 3) = 1 sign( 2) = 1 sign( 1) = 1 sign(0) = 0 sign(1) = 1 sign(2) = 1 sign(3) = 1 ... éÎÁÞÅ ÜÔÕ ÆÕÎË ÉÀ ÍÏÖÎÏ ÚÁÄÁÔØ Ó ÏÍÏÝØÀ ÓÌÅÄÕÀÝÉÈ ÒÁ×ÉÌ: 8 > <
1; ÅÓÌÉ x < 0; sign(x) = 0; ÅÓÌÉ x = 0; > : 1; ÅÓÌÉ x > 0: ëÁË ÏÒÅÄÅÌÉÔØ ÔÁËÕÀ ÆÕÎË ÉÀ × ÑÚÙËÅ Haskell, ÍÙ ÕÚÎÁÅÍ ÞÕÔØ ÏÚÖÅ. ÷ ÓÏÏÔ×ÅÔÓÔ×ÉÉ Ó ÍÁÔÅÍÁÔÉÞÅÓËÏÊ ÔÅÏÒÉÅÊ × ÑÚÙËÅ Haskell ÒÁÚ ÌÉÞÁÀÔ É ÆÕÎË ÉÉ: ÅÒ×ÏÅ ÕËÁÚÙ×ÁÅÔ, ÏÔ ËÕÄÁ É ËÕÄÁ ÄÅÊÓÔ×ÕÅÔ ÆÕÎË ÉÑ, Á ×ÔÏÒÏÅ Ï ËÁËÏÍÕ ÒÁ×ÉÌÕ. ðÅÒÅÄ ÉÚÕÞÅÎÉÅÍ ÓÏÓÏÂÏ× ÚÁÄÁÎÉÑ ÆÕÎË ÉÊ, ÏÚÎÁËÏÍÉÍÓÑ Ó ÍÎÏÖÅÓÔ×ÁÍÉ ×ÅÌÉÞÉÎ, ËÏÔÏÒÙÍÉ ÞÁÝÅ ×ÓÅÇÏ ÏÅÒÉÒÕÀÔ ÒÏÇÒÁÍ ÍÙ (Ñ×ÌÑÀÝÉÅÓÑ ÎÁÂÏÒÏÍ ÆÕÎË ÉÊ) ÎÁ ÑÚÙËÅ Haskell.
ÏÂßÑ×ÌÅÎÉÅ ÏÒÅÄÅÌÅÎÉÅ
2.2. þÉÓÌÁ ÷ ÑÚÙËÅ Haskell ÞÉÓÌÁ ÚÁÉÓÙ×ÁÀÔÓÑ × ÓÔÁÎÄÁÒÔÎÏÊ ÄÅÓÑÔÉÞÎÏÊ ÓÉÓÔÅÍÅ ÓÞÉÓÌÅÎÉÑ. ïÎÉ ÍÏÇÕÔ ÂÙÔØ ËÁË ÏÌÏÖÉÔÅÌØÎÙÍÉ, ÔÁË É ÏÔÒÉ ÁÔÅÌØÎÙÍÉ. ðÒÉÚÎÁËÏÍ ÏÔÒÉ ÁÔÅÌØÎÏÇÏ ÞÉÓÌÁ Ñ×ÌÑÅÔÓÑ ÚÎÁË
30
H
H
H
II. úÎÁËÏÍÓÔ×Ï Ó ÑÚÙËÏÍ Haskell
ÍÉÎÕÓ, ÒÁÓÏÌÏÖÅÎÎÙÊ ÅÒÅÄ ÞÉÓÌÏÍ. äÌÑ ÒÅÄÓÔÁ×ÌÅÎÉÑ ÅÌÙÈ ÞÉÓÅÌ ÉÓÏÌØÚÕÀÔÓÑ ÜÌÅÍÅÎÔÙ Ä×ÕÈ ÂÁÚÏ×ÙÈ ÔÉÏ×: Integer É Int. þÉÓÌÁ ÔÉÁ Integer ÏÄÏÂÎÙ ÏÂÙËÎÏ×ÅÎÎÙÍ ÅÌÙÍ, ÚÎÁËÏÍÙÍ ÎÁÍ ÉÚ ÍÁÔÅÍÁÔÉËÉ. éÈ ÍÏÖÎÏ ÓËÌÁÄÙ×ÁÔØ (+), ×ÙÞÉÔÁÔØ ( ), ÕÍÎÏ ÖÁÔØ (), ÄÅÌÉÔØ ÎÁ ÅÌÏ (div), ÎÁÈÏÄÉÔØ ÏÓÔÁÔÏË ÏÔ ÄÅÌÅÎÉÑ ÎÁ ÄÒÕÇÏÅ ÞÉÓÌÏ (rem É mod ) É ×ÏÚ×ÏÄÉÔØ × ÅÌÕÀ ÓÔÅÅÎØ (^). þÉÓÌÁ ÔÉÁ Int ÏÔÌÉÞÁÀÔÓÑ ÏÔ Integer ÔÏÌØËÏ ÔÅÍ, ÞÔÏ ÏÎÉ ÍÏÇÕÔ ÒÅÄÓÔÁ ×ÌÑÔØ ÞÉÓÌÁ ÔÏÌØËÏ ÉÚ ÎÅËÏÔÏÒÏÇÏ ÏÇÒÁÎÉÞÅÎÎÏÇÏ ÄÉÁÁÚÏÎÁ (ËÁË ÒÁ×ÉÌÏ, ÏÔ 231 ÄÏ 231 1).
---> 12345678-123 12345555 ---> 234+123456 123690 ---> 234*567 132678 ---> 2^10 1024 ---> 120 `div` 7 17 ---> 120 `mod` 7 1 ---> 7*17+1 120 ïÂÒÁÔÉÔÅ ×ÎÉÍÁÎÉÅ, ÞÔÏ ÅÓÌÉ ÆÕÎË ÉÑ ÉÓÏÌØÚÕÅÔÓÑ × ËÁÞÅÓÔ×Å ÏÅÒÁÔÏÒÁ (Ô. Å. ÒÁÚÍÅÝÁÅÔÓÑ ÍÅÖÄÕ Ó×ÏÉÍÉ Ä×ÕÍÑ ÁÒÇÕÍÅÎÔÁÍÉ), ÔÏ ÅÅ ÉÍÑ ÔÒÅÂÕÅÔÓÑ ÚÁËÌÀÞÉÔØ × ÏÂÒÁÔÎÙÅ ÁÏÓÔÒÏÆÙ.
---> div 120 7 17 ---> 120 `div` 7 17 òÅÚÕÌØÔÁÔ ÏÅÒÁ ÉÉ ÄÅÌÅÎÉÑ (/) Ä×ÕÈ ÅÌÙÈ ÞÉÓÅÌ ÎÅ Ñ×ÌÑÅÔÓÑ ÅÌÙÍ ÞÉÓÌÏÍ × ÑÚÙËÅ Haskell.
---> 4/2 2.0 ÁË ËÁË ÚÎÁË ÍÉÎÕÓ ÉÓÏÌØÚÕÅÔÓÑ É ËÁË ÕËÁÚÁÔÅÌØ ÏÔÒÉ ÁÔÅÌØ ÎÏÓÔÉ ÞÉÓÌÁ É ËÁË ÏÅÒÁ ÉÑ ×ÙÞÉÔÁÎÉÑ, ÔÏ ÉÎÏÇÄÁ ÒÉÈÏÄÉÔÓÑ ÚÁ ËÌÀÞÁÔØ ÏÔÒÉ ÁÔÅÌØÎÙÅ ÞÉÓÌÁ × ÓËÏÂËÉ. îÁÒÉÍÅÒ, ÒÉ ×ÙÞÉÓÌÅ ÎÉÉ ÏÓÔÁÔËÁ ÏÔ ÄÅÌÅÎÉÑ ÞÉÓÌÁ 7 ÎÁ ÏÔÒÉ ÁÔÅÌØÎÏÅ ÞÉÓÌÏ 5 ÓÌÅÄÕÅÔ ÚÁÉÓÁÔØ
2. âÁÚÏ×ÙÅ ÔÉÙ ÑÚÙËÁ Haskell
31
---> mod 7 (-5) -3
H
åÓÌÉ ÏÕÓÔÉÔØ ÓËÏÂËÉ (ÚÁÉÓÁ× mod 7 5), ÔÏ ÉÎÔÅÒÒÅÔÁÔÏÒ ÉÓ ÔÏÌËÕÅÔ ÜÔÕ ÚÁÉÓØ ËÁË (mod 7) 5, ÞÔÏ ÎÅ ÉÍÅÅÔ ÓÍÙÓÌÁ. éÓÏÌØÚÏ×ÁÎÉÅ ÜÔÉÈ Ä×ÕÈ ÔÉÏ× ÅÌÙÈ ÞÉÓÅÌ ÏÚ×ÏÌÑÅÔ ÓÄÅÌÁÔØ ÒÏ ÅÓÓ ×ÙÞÉÓÌÅÎÉÊ ÂÏÌÅÅ ÜÆÆÅËÔÉ×ÎÙÍ. òÁÂÏÔÁ Ó ÞÉÓÌÁÍÉ ÔÉÁ Integer ÒÏÉÓÈÏÄÉÔ × ÓÏÔÎÉ ÒÁÚ ÍÅÄÌÅÎÎÅÊ, ÞÅÍ Ó ÞÉÓÌÁÍÉ ÔÉÁ Int, ÏÜÔÏÍÕ ÉÈ ÓÌÅÄÕÅÔ ÉÓÏÌØÚÏ×ÁÔØ ÔÏÌØËÏ ÔÁÍ, ÇÄÅ ÄÅÊÓÔ×ÉÔÅÌØÎÏ ÎÕÖÎÙ ÄÏÓÔÁÔÏÞÎÏ ÂÏÌØÛÉÅ ÞÉÓÌÁ.
I õÒÁÖÎÅÎÉÅ II.2.1
óÏÚÄÁÊÔÅ ÓËÒÉÔ, ÓÏÄÅÒÖÁÝÉÊ ÏÒÅÄÅÌÅÎÉÑ Ä×ÕÈ ÔÏÖÄÅÓÔ×ÅÎÎÙÈ ÆÕÎË ÉÊ (Ô. Å. ÔÁËÉÈ ÆÕÎË ÉÊ, ÞÔÏ f (x) = x ÄÌÑ ÌÀÂÏÇÏ x ÉÚ ÏÂÌÁÓÔÉ ÏÒÅÄÅÌÅÎÉÑ ÆÕÎË ÉÉ f ): idInt, ÏÒÅÄÅÌÅÎÎÕÀ ÎÁ ÞÉÓÌÁÈ ÔÉÁ Int, É idInteger, ÏÒÅÄÅÌÅÎÎÕÀ ÎÁ ÍÎÏÖÅÓÔ×Å Integer:
idInt :: Int -> Int idInt x = x
idInteger :: Integer -> Integer idInteger x = x úÁÇÒÕÚÉ× ÓËÒÉÔ, ×ÙÏÌÎÉÔÅ ÓÌÅÄÕÀÝÉÅ ×ÙÞÉÓÌÅÎÉÑ:
--->idInteger (2^31 -1) 2147483647 --->idInteger (2^31) 2147483648 --->idInteger (-(2^31)) -2147483648 --->idInteger (-(2^31)-1) -2147483649 --->idInteger 2^100 1267650600228229401496703205376 --->idInteger (-2^100) -1267650600228229401496703205376 --->idInt (2^31 -1) 2147483647 --->idInt (2^31) -2147483648 --->idInt (-(2^31))
H
II. úÎÁËÏÍÓÔ×Ï Ó ÑÚÙËÏÍ Haskell
32
-2147483648 --->idInt (-(2^31)-1) 2147483647 ëÁË ×ÉÄÉÍ, ÆÕÎË ÉÑ, ÏÒÅÄÅÌÅÎÎÁÑ ÎÁ ÍÎÏÖÅÓÔ×Å Integer, ÓÏ ÓÏÂÎÁ ÒÏ×ÏÄÉÔØ ×ÙÞÉÓÌÅÎÉÑ ÎÁ ÌÀÂÙÈ ÅÌÙÈ ÞÉÓÌÁÈ, × ÔÏ ×ÒÅÍÑ ËÁË ÆÕÎË ÉÑ, ÏÒÅÄÅÌÅÎÎÁÑ ÎÁ ÎÁ ÍÎÏÖÅÓÔ×Å Int, ÉÎÏÇÄÁ ×ÙÄÁ ÅÔ ¾ÎÅÏÖÉÄÁÎÎÙÅ¿ ÒÅÚÕÌØÔÁÔÙ. äÌÑ ÔÏÇÏ ÞÔÏÂÙ ÏÎÑÔØ, ÏÞÅÍÕ ÏÌÕÞÅÎÙ ÔÁËÉÅ ÒÅÚÕÌØÔÁÔÙ, ÓÌÅÄÕÅÔ ÒÅÄÓÔÁ×ÌÑÔØ ÓÅÂÅ ÍÎÏÖÅÓÔ×Ï ×ÅÌÉÞÉÎ ÔÉÁ Int × ×ÉÄÅ ÚÁÍËÎÕÔÏÇÏ ËÏÌØ Á, × ËÏÔÏÒÏÍ ÓÁÍÏÅ ÂÏÌØ ÛÏÅ ÚÎÁÞÅÎÉÅ (231 1 = 2147483647) ¾ÒÉËÌÅÉ×ÁÅÔÓÑ¿ Ë ÎÁÉÍÅÎØ ÛÅÍÕ ( 231 = 2147483648). ïÅÒÁ ÉÑ ÓÌÏÖÅÎÉÑ ÒÉ×ÏÄÉÔ Ë Å ÒÅÍÅÝÅÎÉÀ ×ÄÏÌØ ËÏÌØ Á ×ÒÁ×Ï, Á ×ÙÞÉÔÁÎÉÑ ×ÌÅ×Ï. ðÏÜÔÏÍÕ, ÒÉÂÁ×ÌÑÑ 1 Ë ÎÁÉÂÏÌØÛÅÍÕ ÞÉÓÌÕ, ÍÙ ÏÌÕÞÁÅÍ ÎaÉÍÅÎØÛÅÅ.
J
÷ ÒÅÌÀÄÉÉ ÏÒÅÄÅÌÅÎÙ ÆÕÎË ÉÉ ÄÌÑ ÒÁÂÏÔÙ Ó ÅÌÙÍÉ ÞÉÓÌÁÍÉ. æÕÎË ÉÑ
îÁÚÎÁÞÅÎÉÅ
g d
îÁÈÏÖÄÅÎÉÅ ÎÁÉÂÏÌØÛÅÇÏ ÏÂÝÅÇÏ ÄÅÌÉÔÅÌÑ Ä×ÕÈ ÞÉÓÅÌ even ðÒÏ×ÅÒËÁ ÞÅÔÎÏÓÔÉ ÞÉÓÌÁ odd ðÒÏ×ÅÒËÁ ÎÅÞÅÔÎÏÓÔÉ ÞÉÓÌÁ fromInt ðÒÅÏÂÒÁÚÏ×ÁÎÉÅ × ÞÉÓÌÏ Ó ÌÁ×ÁÀÝÅÊ ÔÏÞËÏÊ fromInteger ðÒÅÏÂÒÁÚÏ×ÁÎÉÅ × ÞÉÓÌÏ Ó ÌÁ×ÁÀÝÅÊ ÔÏÞËÏÊ
H
÷ÓÅ ÆÕÎË ÉÉ ÉÚ ÒÅÌÀÄÉÉ ÚÁÇÒÕÖÁÀÔÓÑ ÒÉ ÓÔÁÒÔÅ ÉÎÔÅÒÒÅÔÁ ÔÏÒÁ, ÏÜÔÏÍÕ ÉÍÉ ÍÏÖÎÏ ÏÌØÚÏ×ÁÔØÓÑ ÂÅÚ ÚÁÇÒÕÚËÉ ËÁËÏÇÏ-ÌÉÂÏ ÆÁÊÌÁ. ÷ÏÔ ÒÉÍÅÒÙ ÒÁÂÏÔÙ ÜÔÉÈ ÆÕÎË ÉÊ:
---> g d 45 5 5 ---> even 3 False ---> even 34 True ---> odd 3 True òÅÚÕÌØÔÁÔÙ, ×ÏÚ×ÒÁÝÁÅÍÙÅ ÆÕÎË ÉÑÍÉ even É odd, ÌÏÇÉÞÅÓËÉÅ ×ÅÌÉÞÉÎÙ True (ÉÓÔÉÎÁ) É False (ÌÏÖØ), Ó ËÏÔÏÒÙÍÉ ÍÙ ÏÚÎÁËÏ ÍÉÍÓÑ ÞÕÔØ ÏÚÖÅ.
2. âÁÚÏ×ÙÅ ÔÉÙ ÑÚÙËÁ Haskell
33
äÌÑ ÒÅÄÓÔÁ×ÌÅÎÉÑ ÄÒÏÂÎÙÈ ÞÉÓÅÌ (ÔÁË ÎÁÚÙ×ÁÅÍÙÈ ÞÉÓÅÌ Ó ÌÁ×ÁÀÝÅÊ ÔÏÞËÏÊ) ÉÓÏÌØÚÕÀÔÓÑ ÔÉÙ Float É Double. þÉÓÌÏ ÔÉ Á Float ÎÅ ÍÏÖÅÔ ÓÏÄÅÒÖÁÔØ ÂÏÌÅÅ 7 ÉÆÒ ÏÓÌÅ ÚÁÑÔÏÊ, × ÔÏ ×ÒÅ ÍÑ ËÁË ÔÉ Double ÏÚ×ÏÌÑÅÔ ÏÅÒÉÒÏ×ÁÔØ ÕÖÅ 16 ÚÎÁËÁÍÉ ÏÓÌÅ ÚÁÑÔÏÊ. äÏÕÓÔÉÍÙ Ä×Å ÆÏÒÍÙ ÚÁÉÓÉ ÔÁËÉÈ ÞÉÓÅÌ: Ó ÉÓÏÌØÚÏ×Á ÎÉÅÍ ÄÅÓÑÔÉÞÎÏÊ ÔÏÞËÉ, ÎÁÒÉÍÅÒ, 2.3, 0.5984, É ÚÁÉÓØ × ÜËÓÏÎÅÎ ÉÁÌØÎÏÊ ÆÏÒÍÅ, ÎÁÒÉÍÅÒ, 1.2e3, 0.5Å-2. óÉÍ×ÏÌ e × ÔÁËÏÊ ÚÁ ÉÓÉ ÏÚÎÁÞÁÅÔ ¾ÕÍÎÏÖÉÔØ ÎÁ ÄÅÓÑÔØ × ÓÔÅÅÎÉ¿. ÁË 1.2e3 =1200, Á 0.5Å-2 = 0.005. óÒÅÄÉ ÆÕÎË ÉÊ, ÏÒÅÄÅÌÅÎÎÙÈ × ÒÅÌÀÄÉÉ, ÏÔÍÅÔÉÍ ÅÝÅ ÎÅÓËÏÌØËÏ, ÒÅÄÎÁÚÎÁÞÅÎÎÙÈ ÄÌÑ ÒÁÂÏÔÙ Ó ÞÉÓÌÁÍÉ. æÕÎË ÉÑ
abs signum round
îÁÚÎÁÞÅÎÉÅ
îÁÈÏÖÄÅÎÉÅ ÁÂÓÏÌÀÔÎÏÊ ×ÅÌÉÞÉÎÙ ÞÉÓÌÁ îÁÈÏÖÄÅÎÉÅ ÚÎÁËÁ ÞÉÓÌÁ ïËÒÕÇÌÅÎÉÅ ÄÏ ÅÌÏÇÏ ÞÉÓÌÁ
ÒÉÍÉÔÉ×ÁÍÉ
æÕÎË ÉÉ, ÎÁÚÙ×ÁÅÍÙÅ , ÉÚÎÁÞÁÌØÎÏ ×ÓÔÒÏÅÎÙ × ÉÎÔÅÒÒÅÔÁÔÏÒ. ÷ ÉÈ ÞÉÓÌÅ ÅÓÔØ É ÆÕÎË ÉÉ ÄÌÑ ÒÁÂÏÔÙ Ó ÄÒÏÂÎÙÍÉ ÞÉÓÌÁÍÉ. æÕÎË ÉÑ
sqrt sin
os tan asin a os atan log exp
îÁÚÎÁÞÅÎÉÅ
æÕÎË ÉÑ ÉÚ×ÌÅÞÅÎÉÑ Ë×ÁÄÒÁÔÎÏÇÏ ËÏÒÎÑ óÉÎÕÓ ÞÉÓÌÁ ëÏÓÉÎÕÓ ÞÉÓÌÁ ÁÎÇÅÎÓ ÞÉÓÌÁ áÒËÓÉÎÕÓ ÞÉÓÌÁ áÒËËÏÓÉÎÕÓ ÞÉÓÌÁ áÒËÔÁÎÇÅÎÓ ÞÉÓÌÁ îÁÔÕÒÁÌØÎÙÊ ÌÏÇÁÒÉÆÍ üËÓÏÎÅÎÔÁ (ÆÕÎË ÉÑ ×ÏÚ×ÅÄÅÎÉÑ ÞÉÓÌÁ e × ÓÔÅÅÎØ)
ìÀÂÙÅ Ä×Á ÞÉÓÌÁ ÉÌÉ ÞÉÓÌÏ×ÙÈ ×ÙÒÁÖÅÎÉÑ ÍÏÖÎÏ ÓÒÁ×ÎÉÔØ ÍÅÖÄÕ ÓÏÂÏÊ Ó ÏÍÏÝØÀ ÏÅÒÁ ÉÊ > (ÂÏÌØÛÅ), >= (ÂÏÌØÛÅ ÉÌÉ ÒÁ× ÎÏ), < (ÍÅÎØÛÅ), <= (ÍÅÎØÛÅ ÉÌÉ ÒÁ×ÎÏ), == (ÒÁ×ÎÙ) É /= (ÎÅ ÒÁ× ÎÙ). òÅÚÕÌØÔÁÔÏÍ ÏÄÏÂÎÏÊ ÏÅÒÁ ÉÉ ÔÁËÖÅ Ñ×ÌÑÀÔÓÑ True (ÉÓÔÉ ÎÁ) ÉÌÉ False (ÌÏÖØ).
---> 1 >= 0.5 True ---> 2 + 3 > 9
H
34
II. úÎÁËÏÍÓÔ×Ï Ó ÑÚÙËÏÍ Haskell
False ---> 2 + 3 == 5 True ---> 1/3 == 0.3333 False 2.3. ìÏÇÉÞÅÓËÉÅ ×ÅÌÉÞÉÎÙ óÕÝÅÓÔ×ÕÀÔ ×ÓÅÇÏ Ä×Å ÌÏÇÉÞÅÓËÉÈ ×ÅÌÉÞÉÎÙ True É False. üÔÉ Ä×Å ×ÅÌÉÞÉÎÙ ÉÓÞÅÒÙ×ÁÀÔ ÓÏÂÏÊ ×ÅÓØ ÔÉ ÄÁÎÎÙÈ Bool ÉÌÉ ÂÕ ÌÅ×ÓËÉÈ ×ÅÌÉÞÉÎ (ÎÁÚ×ÁÎÎÙÈ ÔÁË Ï ÉÍÅÎÉ ÖÉ×ÛÅÇÏ × 19 ÓÔÏÌÅÔÉÉ ÌÏÇÉËÁ äÖÏÒÄÖÁ âÕÌÑ). úÁÍÅÔÉÍ, ÞÔÏ ÜÔÉ ÉÍÅÎÁ True, False, Bool ÉÛÕÔÓÑ Ó ÂÏÌØÛÏÊ ÂÕË×Ù.
H
îÁ ÍÎÏÖÅÓÔ×Å ×ÅÌÉÞÉÎ ÔÉÁ Bool ÏÒÅÄÅÌÅÎÙ ÓÔÁÎÄÁÒÔÎÙÅ ÌÏ ÇÉÞÅÓËÉÅ ÏÅÒÁ ÉÉ: ÏÔÒÉ ÁÎÉÅ, ÚÁÄÁ×ÁÅÍÏÅ ÆÕÎË ÉÅÊ not, ËÏÎß ÀÎË ÉÑ (ÌÏÇÉÞÅÓËÏÅ ÕÍÎÏÖÅÎÉÅ), ÚÁÄÁ×ÁÅÍÁÑ ÏÅÒÁÔÏÒÏÍ &&, É ÄÉÚßÀÎË ÉÑ (ÌÏÇÉÞÅÓËÏÅ ÓÌÏÖÅÎÉÅ) ||. üÔÉ ÏÅÒÁ ÉÉ ÅÒÅÞÉÓÌÅ ÎÙ × ÏÒÑÄËÅ ÕÂÙ×ÁÎÉÑ ÒÉÏÒÉÔÅÔÁ. ëÁË ÏÂÙÞÎÏ, ÄÌÑ ÉÚÍÅÎÅÎÉÑ ÏÒÑÄËÁ ×ÙÞÉÓÌÅÎÉÊ ÉÓÏÌØÚÕÀÔÓÑ ÓËÏÂËÉ. äÁ×ÁÊÔÅ ÏÓÍÏÔÒÉÍ, ËÁË ÉÎÔÅÒÒÅÔÁÔÏÒ ÏÅÒÉÒÕÅÔ Ó ÌÏÇÉÞÅÓËÉÍÉ ×ÅÌÉÞÉÎÁÍÉ:
---> True && False False ---> False || True True ---> not False True ---> not False && False False ---> not (False && False) True
I õÒÁÖÎÅÎÉÅ II.2.2
ïÒÅÄÅÌÉÍ ÆÕÎË ÉÀ myNot, ËÏÔÏÒÁÑ ÂÕÄÅÔ ÜË×É×ÁÌÅÎÔÎÁ ÓÔÁÎÄÁÒÔ ÎÏÍÕ ÏÔÒÉ ÁÎÉÀ. óÏÚÄÁÊÔÅ ÆÁÊÌ bool.hs, × ËÏÔÏÒÙÊ ÏÍÅÓÔÉÔÅ ÓÌÅÄÕÀÝÉÅ ÓÔÒÏËÉ:
myNot :: Bool -> Bool myNot True = False myNot False = True
2. âÁÚÏ×ÙÅ ÔÉÙ ÑÚÙËÁ Haskell
35
ÁË ËÁË ÍÎÏÖÅÓÔ×Ï ÚÎÁÞÅÎÉÊ ÔÉÁ Bool ÓÏÓÔÏÉÔ ÔÏÌØËÏ ÉÚ Ä×ÕÈ ÜÌÅÍÅÎÔÏ×, ÔÏ ÎÁÍ ÌÅÇËÏ ÂÙÌÏ ÏÒÅÄÅÌÉÔØ ÆÕÎË ÉÀ, ÚÁÄÁ× ×ÓÅÇÏ Ä×Á ÕÒÁ×ÎÅÎÉÑ. úÁÇÒÕÚÉÔÅ ÓËÒÉÔ É ÒÏ×ÅÒØÔÅ, ËÁË ÒÁÂÏÔÁÅÔ ÚÁÄÁÎÎÁÑ ÎÁÍÉ ÆÕÎË ÉÑ.
---> :load bool.hs Reading file "bool.hs":
H
Hugs session for: /usr/share/hugs/lib/Prelude.hs bool.hs ---> 3 == 56-53 True ---> myNot (3 == 56-53) False ïÔÓÕÔÓÔ×ÉÅ ÓËÏÂÏË × ÏÓÌÅÄÎÅÍ ÒÉÍÅÒÅ ÒÉ×ÅÄÅÔ Ë ÏÛÉÂËÅ: ÔÁË ËÁË , ÔÏ ÂÕ ÄÅÔ ÒÅÄÒÉÎÑÔÁ ÏÙÔËÁ ×ÙÞÉÓÌÉÔØ ÆÕÎË ÉÀ myNot Ó ÁÒÇÕÍÅÎ ÔÏÍ ÎÅÏÄÈÏÄÑÝÅÇÏ ÔÉÁ (ÞÉÓÌÏ ×ÍÅÓÔÏ ÌÏÇÉÞÅÓËÏÊ ×ÅÌÉÞÉÎÙ).
ÒÉÍÅÎÅÎÉÅ ÆÕÎË ÉÉ ÉÍÅÅÔ ÎÁÉÂÏÌØÛÉÊ ÒÉÏÒÉÔÅÔ
J
÷ÓÅ ÒÁÓÓÍÁÔÒÉ×ÁÅÍÙÅ ÎÁÍÉ ÒÁÎÅÅ ÆÕÎË ÉÉ ÚÁ×ÉÓÅÌÉ ÌÉÛØ ÏÔ ÏÄÎÏÇÏ ÁÒÇÕÍÅÎÔÁ. ïÒÅÄÅÌÉÍ ÆÕÎË ÉÀ, ÚÁ×ÉÓÑÝÕÀ ÏÔ ÁÒÙ ÁÒÇÕ ÍÅÎÔÏ× É ÎÁÚÙ×ÁÅÍÕÀ ¾ÉÓËÌÀÞÉÔÅÌØÎÏÅ éìé¿, ÒÅÚÕÌØÔÁÔ ËÏÔÏÒÏÊ ÒÁ×ÅÎ True, ÅÓÌÉ ÏÄÉÎ ÉÚ ÁÒÇÕÍÅÎÔÏ× ÒÁ×ÅÎ True, Á ÄÒÕÇÏÊ False, É False ×Ï ×ÓÅÈ ÏÓÔÁÌØÎÙÈ ÓÌÕÞÁÑÈ:
exOr :: (Bool, Bool) -> Bool exOr (x, y) = (x || y) && not (x && y)
ëÏÎÅÞÎÏ, ÍÙ ÍÏÇÌÉ, ÔÁËÖÅ ËÁË É × ÒÅÄÙÄÕÝÅÍ ÓÌÕÞÁÅ, ÚÁÄÁÔØ ÅÅ Ó ÏÍÏÝØÀ ÏÔÄÅÌØÎÏÇÏ ÕÒÁ×ÎÅÎÉÑ ÄÌÑ ËÁÖÄÏÊ ÉÚ ÞÅÔÙÒÅÈ ×ÏÚ ÍÏÖÎÙÈ ÁÒ ÁÒÇÕÍÅÎÔÏ×, ÎÏ ÒÉ×ÅÄÅÎÎÏÅ ÒÅÛÅÎÉÅ ×ÙÇÌÑÄÉÔ ÚÎÁ ÞÉÔÅÌØÎÏ ÉÚÑÝÎÅÅ.
I õÒÁÖÎÅÎÉÅ II.2.3
óÏÚÄÁÊÔÅ ÓËÒÉÔ exOr.hs, × ËÏÔÏÒÙÊ ÏÍÅÓÔÉÔÅ ÏÒÅÄÅÌÅÎÉÅ ÆÕÎË ÉÉ exOr. õÂÅÄÉÔÅÓØ × ÔÏÍ, ÞÔÏ ÏÎÁ ÒÁÂÏÔÁÅÔ ËÏÒÒÅËÔÎÏ.
---> :load exOr.hs Reading file "exOr.hs": Hugs session for:
H
II. úÎÁËÏÍÓÔ×Ï Ó ÑÚÙËÏÍ Haskell
36
/usr/share/hugs/lib/Prelude.hs exOr.hs ---> exOr (True, False) True ---> exOr (True, True) False ---> exOr (False, True) True ---> exOr (False, False) False
H
J
îÁ ÍÎÏÖÅÓÔ×Å ÌÏÇÉÞÅÓËÉÈ ×ÅÌÉÞÉÎ ÔÁËÖÅ ÏÒÅÄÅÌÅÎÙ ÏÔÎÏÛÅ ÎÉÑ ÏÒÑÄËÁ É ÒÁ×ÅÎÓÔ×Á:
---> True > False True ---> True < False False ---> True == False False ---> False >= False True 2.4. óÉÍ×ÏÌÙ ÷ÅÌÉÞÉÎÙ, ×ÈÏÄÑÝÉÅ × ÓÔÁÎÄÁÒÔÎÕÀ ÔÁÂÌÉ Õ ASCII-ËÏÄÏ× É ÎÁ ÚÙ×ÁÅÍÙÅ , ÏÔÎÏÓÑÔÓÑ Ë ÔÉÕ Char. óÒÅÄÉ ÎÉÈ:
ÓÉÍ×ÏÌÁÍÉ
ÁÌÆÁ×ÉÔÎÙÅ ÓÉÍ×ÏÌÙ ÉÆÒÙ ÚÎÁËÉ ÕÎËÔÕÁ ÉÉ ÓÅ ÉÁÌØÎÙÅ ÓÉÍ×ÏÌÙ
ðÒÉ ÚÁÉÓÉ ÌÀÂÏÊ ÓÉÍ×ÏÌ ÄÏÌÖÅÎ ÂÙÔØ ÚÁËÌÀÞÅÎ × ÁÏÓÔÒÏÆÙ (ÎÅ ÓÌÅÄÕÅÔ ÕÔÁÔØ Ó ÏÂÒÁÔÎÙÍÉ ÁÏÓÔÒÏÆÁÍÉ, ÉÓÏÌØÚÕÅÍÙÍÉ ÄÌÑ ÒÅ×ÒÁÝÅÎÉÑ ÆÕÎË ÉÉ Ä×ÕÈ ÁÒÇÕÍÅÎÔÏ× × ÏÅÒÁ ÉÀ, ÓÍ. ÓÔÒ.71). îÅËÏÔÏÒÙÅ ÓÉÍ×ÏÌÙ, ÔÁËÉÅ ËÁË Ä×ÏÊÎÙÅ ËÁ×ÙÞËÉ, ÁÏÓÔÒÏÆ É ÓÉÍ×ÏÌ \ (ba kslash), ÎÅÌØÚÑ ÚÁÉÓÁÔØ ÏÂÙÞÎÙÍ ÓÏÓÏÂÏÍ. éÈ ÓÌÅ ÄÕÅÔ ÒÉ ÏÍÏÝÉ ÓÉÍ×ÏÌÁ \:
ÜËÒÁÎÉÒÏ×ÁÔØ
ËÁ×ÙÞËÉ ÁÏÓÔÒÏÆ ba kslash
'\"' '\'' '\\'
2. âÁÚÏ×ÙÅ ÔÉÙ ÑÚÙËÁ Haskell ÷ÙÒÁÖÅÎÉÅ
'x' x '3' 3 '.' . 'f' f `f`
É
Char ... Char Int Char ... Char ... ...
37 úÎÁÞÅÎÉÅ
óÉÍ×ÏÌ 'x' éÍÑ ÁÒÇÕÍÅÎÔÁ (ÁÒÁÍÅÔÒÁ) óÉÍ×ÏÌ ÉÆÒÙ '3' þÉÓÌÏ 3 óÉÍ×ÏÌ ÚÎÁËÁ ÕÎËÔÕÁ ÉÉ (ÔÏÞËÁ) ïÅÒÁ ÉÑ ËÏÍÏÚÉ ÉÉ ÆÕÎË ÉÊ óÉÍ×ÏÌ 'f' éÍÑ ÆÕÎË ÉÉ f æÕÎË ÉÑ f, ÒÉÍÅÎÅÎÎÁÑ ËÁË ÏÅÒÁÔÏÒ
ïÔÍÅÔÉÍ ÅÝÅ ÎÅÓËÏÌØËÏ ÓÅ ÉÁÌØÎÙÈ ÓÉÍ×ÏÌÏ×, ÉÓÏÌØÚÕÅÍÙÈ ÄÌÑ ÏÆÏÒÍÌÅÎÉÑ ×Ù×ÏÄÉÍÏÇÏ ÎÁ ÜËÒÁÎ ÔÅËÓÔÁ: '\n' ÓÉÍ×ÏÌ ÅÒÅ ÈÏÄÁ ÎÁ ÎÏ×ÕÀ ÓÔÒÏËÕ (newline) É '\t' ÓÉÍ×ÏÌ ÔÁÂÕÌÑ ÉÉ (tab). äÌÑ ÚÁÄÁÎÉÑ ÜÔÉÈ ÓÉÍ×ÏÌÏ× ÔÁËÖÅ ÉÓÏÌØÚÕÅÔÓÑ ÜËÒÁÎÉÒÏ×ÁÎÉÅ Ó ÏÍÏÝØÀ \. ä×Å ×ÓÔÒÏÅÎÎÙÅ ÓÔÁÎÄÁÒÔÎÙÅ ÆÕÎË ÉÉ ÕÓÔÁÎÁ×ÌÉ×ÁÀÔ ÓÏÏÔ×ÅÔ ÓÔ×ÉÅ ÍÅÖÄÕ ÓÉÍ×ÏÌÏÍ É ÅÇÏ ASCII-ËÏÄÏÍ:
ord :: Char -> Int
hr :: Int -> Char ðÏÓÍÏÔÒÉÍ ÎÁ ÒÉÍÅÒÙ ÉÈ ÉÓÏÌØÚÏ×ÁÎÉÑ: ---> 65 ---> 97 ---> -32 ---> '3' ---> 51
ord 'A'
H
ord 'a' ord 'A' - ord 'a'
hr 51 ord '3'
óÉÍ×ÏÌÙ ÍÏÖÎÏ ÓÒÁ×ÎÉ×ÁÔØ ÍÅÖÄÕ ÓÏÂÏÊ ÏÎÉ ÕÏÒÑÄÏÞÅÎÙ × ÓÏÏÔ×ÅÔÓÔ×ÉÉ Ó ÉÈ ASCII-ËÏÄÏÍ. ---> 'a' == 'A' False ---> 'b' < 'a' False ---> ' ' >'A' True
H
II. úÎÁËÏÍÓÔ×Ï Ó ÑÚÙËÏÍ Haskell
38
I õÒÁÖÎÅÎÉÅ II.2.4
H
ïÒÅÄÅÌÉÍ ÆÕÎË ÉÀ apitalize, ÅÒÅ×ÏÄÑÝÕÀ ÒÏÉÓÎÙÅ ÂÕË×Ù × ÚÁÇÌÁ×ÎÙÅ. óÎÁÞÁÌÁ ÏÒÅÄÅÌÉÍ ÒÁÚÎÉ Õ × ËÏÄÁÈ ÍÅÖÄÕ ÚÁÇÌÁ×ÎÏÊ É ÒÏÉÓÎÏÊ ÂÕË×ÁÍÉ. ïÎÁ ÏÓÔÏÑÎÎÁ ÄÌÑ ×ÓÅÈ ÂÕË×. ÷ ÒÅÄÙÄÕ ÝÅÍ ÒÉÍÅÒÅ ÍÙ ×ÉÄÅÌÉ, ÞÔÏ ÄÌÑ ÉÓÏÌØÚÕÅÍÏÊ ÎÁÍÉ ËÏÄÉÒÏ×ËÉ ÓÉÍ×ÏÌÏ× ÜÔÁ ÒÁÚÎÉ Á ÒÁ×ÎÁ ÏÔÒÉ ÁÔÅÌØÎÏÍÕ ÞÉÓÌÕ 32. ïÄÎÁËÏ, ×ËÌÀÞÅÎÉÅ × ÔÅÌÏ ÒÏÇÒÁÍÍÙ ÔÁËÉÈ ¾ÍÁÇÉÞÅÓËÉÈ ÞÉÓÅÌ¿ Ñ×ÌÑÅÔ ÓÑ ÌÏÈÉÍ ÓÔÉÌÅÍ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÑ. ðÒÅÄÏÞÔÉÔÅÌØÎÅÅ ÉÓÏÌØ ÚÏ×ÁÔØ ÓÌÅÄÕÀÝÉÅ ÓÔÒÏËÉ, ÏÂßÑÓÎÑÀÝÉÅ ÎÁÚÎÁÞÅÎÉÅ ÜÔÏÊ ×ÅÌÉÞÉ ÎÙ: offset :: Int offset = ord 'A' - ord 'a'
ãÅÌÏÅ ÞÉÓÌÏ offset (ÓÍÅÝÅÎÉÅ) ÏÌÕÞÅÎÏ ÕÔÅÍ ×ÙÞÉÔÁÎÉÑ ËÏÄÁ ÓÉÍ×ÏÌÁ 'a' ÉÚ ËÏÄÁ ÓÉÍ×ÏÌÁ 'A'. ÅÅÒØ ÍÏÖÎÏ ÏÒÅÄÅÌÉÔØ É ÓÁÍÕ ÆÕÎË ÉÀ:
apitalize :: Char -> Char
apitalize h = hr (ord h + offset)
ðÒÉÍÅÎÉÍ ÜÔÕ ÆÕÎË ÉÀ: ---> apitalize 'd' 'D'
J
H
á ÔÅÅÒØ ÏÒÏÂÕÅÍ ÒÉÍÅÎÉÔØ ÜÔÕ ÆÕÎË ÉÀ ÎÅ Ë ÒÏÉÓÎÏÊ ÂÕË×Å, Á Ë ËÁËÏÍÕ ÌÉÂÏ ÉÎÏÍÕ ÓÉÍ×ÏÌÕ: ---> apitalize 'Q' '1' ---> apitalize '*' '\n'
äÌÑ ÔÏÇÏ ÞÔÏÂÙ ÉÚÂÁ×ÉÔÓÑ ÏÔ ÏÄÏÂÎÙÈ ÎÅÏÖÉÄÁÎÎÏÓÔÅÊ, ÓÌÅ ÄÕÅÔ ÒÅÄ×ÁÒÉÔÅÌØÎÏ ÕÂÅÄÉÔØÓÑ, ÞÔÏ ÁÒÇÕÍÅÎÔÏÍ Ñ×ÌÑÅÔÓÑ ÉÍÅÎÎÏ ÒÏÉÓÎÁÑ ÂÕË×Á. ÷ ÆÁÊÌÅ Prelude.hs ÕÖÅ ÏÒÅÄÅÌÅÎÙ ÎÅÓËÏÌØËÏ ÆÕÎË ÉÊ, ÒÏ ×ÅÒÑÀÝÉÈ ÒÉÎÁÄÌÅÖÉÔ ÔÏÔ ÉÌÉ ÉÎÏÊ ÓÉÍ×ÏÌ Ë ÏÒÅÄÅÌÅÎÎÏÊ ÇÒÕ Å ÓÉÍ×ÏÌÏ×. îÁÚÎÁÞÅÎÉÅ ÜÔÉÈ ÆÕÎË ÉÊ ÑÓÎÏ ÉÚ ÉÈ ÎÁÚ×ÁÎÉÊ, ×ÓÅ ÏÎÉ × ËÁÞÅÓÔ×Å ÉÓÈÏÄÎÏÇÏ ÔÉÁ ÉÍÅÀÔ ÔÉ Char, Á × ËÁÞÅÓÔ×Å ÅÌÅ ×ÏÇÏ ÔÉ Bool.
2. âÁÚÏ×ÙÅ ÔÉÙ ÑÚÙËÁ Haskell æÕÎË ÉÑ
isDigit isAlpha isUpper isLower isSpa e isAlphaNum
39
îÁÚÎÁÞÅÎÉÅ
ñ×ÌÑÅÔÓÑ ÉÆÒÏÊ ñ×ÌÑÅÔÓÑ ÂÕË×ÏÊ ñ×ÌÑÅÔÓÑ ÚÁÇÌÁ×ÎÏÊ ÂÕË×ÏÊ ñ×ÌÑÅÔÓÑ ÒÏÉÓÎÏÊ ÂÕË×ÏÊ ñ×ÌÑÅÔÓÑ ÒÏÂÅÌØÎÙÍ ÓÉÍ×ÏÌÏÍ (' ', '\n', '\t') ñ×ÌÑÅÔÓÑ ÅÞÁÔÎÙÍ ÓÉÍ×ÏÌÏÍ (ÂÕË×Ù, ÉÆÒÙ, ÒÏÂÅÌØÎÙÅ ÓÉÍ×ÏÌÙ)
åÓÌÉ ÏÌØÚÏ×ÁÔÅÌÀ ÈÏÞÅÔÓÑ ÄÁÔØ Ó×ÏÅ ÏÒÅÄÅÌÅÎÉÅ ÔÏÊ ÉÌÉ ÉÎÏÊ ÆÕÎË ÉÉ (ÒÅÄÏÌÏÖÉÍ, ÞÔÏ ÜÔÏ ÎÅËÁÑ ÆÕÎË ÉÑ xxx), ×ÍÅÓÔÏ ÏÒÅ ÄÅÌÅÎÉÑ, ÒÉ×ÅÄÅÎÎÏÇÏ × ÆÁÊÌÅ Prelude.hs, ÔÏ ÓÌÅÄÕÅÔ × ÎÁÞÁÌÅ ÓËÒÉÔÁ ÒÁÚÍÅÓÔÉÔØ ÓÔÒÏËÕ ×ÉÄÁ
import Prelude hiding (xxx) ðÏÄÏÂÎÁÑ ÉÎÓÔÒÕË ÉÑ ÓÄÅÌÁÅÔ ÎÅ×ÉÄÉÍÙÍ ÚÁÇÒÕÖÅÎÎÏÅ ÉÚ ÆÁÊÌÁ Prelude.hs ÏÒÅÄÅÌÅÎÉÅ ÆÕÎË ÉÉ xxx. äÁ×ÁÊÔÅ ÏÒÅÄÅÌÉÍ Ó×ÏÉ ÆÕÎË ÉÉ ÄÌÑ ÒÁÂÏÔÙ Ó ÓÉÍ×ÏÌÁÍÉ, ÁÎÁÌÏÇÉÞÎÙÅ ÚÁÄÁÎÎÙÍ × ÆÁÊÌÅ Prelude.hs.
I õÒÁÖÎÅÎÉÅ II.2.5
ðÏÍÅÓÔÉÔÅ × ÔÅËÓÔÏ×ÙÊ ÆÁÊÌ har.hs ÓÌÅÄÕÀÝÉÅ ÏÒÅÄÅÌÅÎÉÑ ÆÕÎË ÉÊ:
import Prelude hiding (isDigit, isUpper, isLower, isAlpha) isDigit, isUpper, isLower, isAlpha :: Char -> Bool isDigit = >= '0' && <= '9' isUpper = >= 'A' && <= 'Z' isLower = >= 'a' && <= 'z' isAlpha = isUpper || isLower úÁÇÒÕÚÉÔÅ ÓËÒÉÔ É ÕÂÅÄÉÔÅÓØ, ÞÔÏ ×ÓÅ ÆÕÎË ÉÉ ÏÒÅÄÅÌÅÎÙ ËÏÒ ÒÅËÔÎÏ.
J
÷ÅÒÎÅÍÓÑ ÔÅÅÒØ Ë ÆÕÎË ÉÉ apitalize. ðÏÄÒÁ×ÉÍ ÅÅ ÔÁË, ÞÔÏÂÙ ÏÎÁ ÉÚÍÅÎÑÌÁ ÁÒÇÕÍÅÎÔ ÔÏÇÄÁ É ÔÏÌØËÏ ÔÏÇÄÁ, ËÏÇÄÁ ÏÎ Ñ×ÌÑ ÅÔÓÑ ÒÏÉÓÎÏÊ ÂÕË×ÏÊ. äÌÑ ÜÔÏÇÏ ÉÓÏÌØÚÕÅÍ ÓÅ ÉÁÌØÎÕÀ ËÏÎ ÓÔÒÕË ÉÀ ÑÚÙËÁ Haskell, ÏÞÅÎØ ÏÈÏÖÕÀ ÎÁ ÓÔÁÎÄÁÒÔÎÙÊ ÕÓÌÏ×ÎÙÊ
II. úÎÁËÏÍÓÔ×Ï Ó ÑÚÙËÏÍ Haskell
40
ÏÅÒÁÔÏÒ × ÒÏ ÅÄÕÒÎÙÈ ÑÚÙËÁÈ. ïÂÝÉÊ ×ÉÄ ÜÔÏÊ ËÏÎÓÔÒÕË ÉÉ ÔÁ ËÏ×: ÆÕÎË ÉÑ ÁÒÇÕÍÅÎÔ = if ÕÓÌÏ×ÉÅ then ÚÎÁÞÅÎÉÅ1 else ÚÎÁÞÅÎÉÅ2 ÷ ÎÁÛÅÍ ÓÌÕÞÁÅ ÆÕÎË ÉÑ ÂÕÄÅÔ ×ÙÇÌÑÄÅÔØ ÔÁË:
apitalize h = if isLower h then hr (ord h + offset) else h ïÂÒÁÔÉÔÅ ×ÎÉÍÁÎÉÅ ÎÁ ÏÔÓÔÕ ×Ï ×ÔÏÒÏÊ ÓÔÒÏËÅ, Ñ×ÌÑÀÝÉÊÓÑ ÓÌÅÄ ÓÔ×ÉÅÍ Ä×ÕÍÅÒÎÏÇÏ ÓÉÎÔÁËÓÉÓÁ ÑÚÙËÁ (ÍÙ ÒÁÚÍÅÓÔÉÌÉ ÆÕÎË ÉÀ
apitalize ÎÁ Ä×ÕÈ ÓÔÒÏËÁÈ). ðÏÄÒÏÂÎÅÅ Ï Ä×ÕÍÅÒÎÏÍ ÓÉÎÔÁËÓÉÓÅ ÞÉÔÁÊÔÅ ÎÁ ÓÔÒÁÎÉ Å 61.
2.5. óÉÓËÉ
ÏÄ
Ñ×ÌÑÀÔÓÑ ËÏÌÌÅË ÉÑÍÉ ÜÌÅÍÅÎÔÏ×, ÏÔÎÏÓÑÝÉÈÓÑ Ë ÖÅ ÔÉÕ. ÁË, ÇÏ×ÏÒÑÔ Ï ÓÉÓËÁÈ ÅÌÙÈ ÞÉÓÅÌ, ÓÉÓËÁÈ ÌÏÇÉÞÅÓËÉÈ ×ÅÌÉÞÉÎ, ÓÉÓËÁÈ ÆÕÎË ÉÊ É Ô. Ä. É ÓÉÓËÁ ÚÁÄÁÀÔ ËÁË ÔÉ ÅÇÏ ÜÌÅÍÅÎÔÏ×, ÚÁËÌÀÞÅÎÎÙÊ × Ë×ÁÄÒÁÔÎÙÅ ÓËÏÂËÉ. óÉÓ ËÉ × Ó×ÏÀ ÏÞÅÒÅÄØ ÔÁËÖÅ ÍÏÇÕÔ ÂÙÔØ ÜÌÅÍÅÎÔÁÍÉ ÄÒÕÇÉÈ ÓÉÓËÏ×. üÌÅÍÅÎÔÙ ÓÉÓËÁ ÒÉ ÚÁÉÓÉ ÚÁËÌÀÞÁÀÔ × Ë×ÁÄÒÁÔÎÙÅ ÓËÏÂËÉ É, ÅÒÅÞÉÓÌÑÑ ÉÈ, ÏÔÄÅÌÑÀÔ ÄÒÕÇ ÏÔ ÄÒÕÇÁ ÚÁÑÔÏÊ. ÷ ÏÂÝÅÍ ÓÌÕÞÁÅ, ÓÉÓÏË ÍÏÖÅÔ ÓÏÄÅÒÖÁÔØ É ÎÕÌÅ×ÏÅ ÞÉÓÌÏ ÜÌÅ ÍÅÎÔÏ×. ÁËÏÊ ÓÉÓÏË ÎÁÚÙ×ÁÀÔ ÕÓÔÙÍ ÓÉÓËÏÍ É ÏÂÏÚÎÁÞÁÀÔ ÔÁË [ ℄. ðÅÒ×ÙÊ ÜÌÅÍÅÎÔ ÓÉÓËÁ ÎÁÚÙ×ÁÅÔÓÑ ÇÏÌÏ×ÏÊ ÓÉÓËÁ (head). ÏÌØËÏ ÕÓÔÏÊ ÓÉÓÏË ÎÅ ÉÍÅÅÔ ÇÏÌÏ×Ù. ïÓÔÁÌØÎÁÑ ÞÁÓÔØ ÓÉÓËÁ ÎÁÚÙ×ÁÅÔÓÑ È×ÏÓÔÏÍ. ÷ ÏÔÌÉÞÉÅ ÏÔ ÇÏÌÏ×Ù ÓÉÓËÁ, ÅÇÏ È×ÏÓÔ ÔÏÖÅ Ñ×ÌÑÅÔÓÑ ÓÉÓËÏÍ. óÉÓËÉ
ÎÏÍÕ É ÔÏÍÕ
óÉÓÏË
[1, 3, 5℄
É
[Int℄
úÎÁÞÅÎÉÅ
óÉÓÏË ÉÚ ÔÒÅÈ Å ÌÙÈ ÞÉÓÅÌ [1, 34, 5, 2345, 1℄ [Int℄ óÉÓÏË ÉÚ ÑÔÉ Å ÌÙÈ ÞÉÓÅÌ [True, False, True℄ [Bool℄ óÉÓÏË ÌÏÇÉÞÅÓËÉÈ ×ÅÌÉÞÉÎ [sin, os, tan℄ [Float -> Float℄ óÉÓÏË ÆÕÎË ÉÊ [[1, 2, 3℄, [4, 5℄℄ [[Int℄℄ óÉÓÏË, ÓÏÄÅÒÖÁ ÝÉÊ Ä×Á ÓÉÓËÁ ÅÌÙÈ ÞÉÓÅÌ
2. âÁÚÏ×ÙÅ ÔÉÙ ÑÚÙËÁ Haskell
41
ëÒÏÍÅ ÅÒÅÞÉÓÌÅÎÉÑ ÜÌÅÍÅÎÔÏ×, ÓÕÝÅÓÔ×ÕÀÔ ÄÒÕÇÉÅ ÓÏÓÏÂÙ ÚÁÄÁ ÎÉÑ ÓÉÓËÏ×, Ó ËÏÔÏÒÙÍÉ ÍÙ ÏÚÎÁËÏÍÉÍÓÑ ÏÚÄÎÅÅ. ÷ ÆÁÊÌÅ Prelude.hs ÏÒÅÄÅÌÅÎÙ ÎÅÓËÏÌØËÏ ÓÔÁÎÄÁÒÔÎÙÈ ÆÕÎË ÉÊ ÄÌÑ ÒÁÂÏÔÙ ÓÏ ÓÉÓËÁÍÉ. ïÔÍÅÔÉÍ ÎÅËÏÔÏÒÙÅ ÉÚ ÎÉÈ: æÕÎË ÉÑ
head tail length reverse
òÅÚÕÌØÔÁÔ
ïÄÉÎ ÜÌÅÍÅÎÔ, ÇÏÌÏ×Á ÓÉÓËÁ è×ÏÓÔÏ×ÏÊ ÓÉÓÏË ÜÌÅÍÅÎÔÏ× ãÅÌÏÅ ÞÉÓÌÏ, ËÏÌÉÞÅÓÔ×Ï ÜÌÅÍÅÎÔÏ× ÓÉÓËÁ óÉÓÏË, ÚÁÉÓÁÎÎÙÊ × ÏÂÒÁÔÎÏÍ ÏÒÑÄËÅ
ðÏÓÍÏÔÒÉÍ ÎÁ ÒÁÂÏÔÕ ÜÔÉÈ ÆÕÎË ÉÊ ÎÁ ÒÉÍÅÒÁÈ.
H
---> head [1, 2, 3℄ 1 ---> tail [1, 2, 3℄ [2,3℄ ---> head [[1, 2, 3℄, [3, 4℄℄ [1,2,3℄ ---> length [True, False, True℄ 3 ---> reverse [[1, 2, 3℄, [3, 4℄℄ [[3,4℄,[1,2,3℄℄ ïÅÒÁ ÉÑ : ÄÏÂÁ×ÌÑÅÔ ÜÌÅÍÅÎÔ × ÎÁÞÁÌÏ ÓÉÓËÁ:
H
---> 1:[℄ [1℄ ---> 1:2:3:[℄ [1,2,3℄ ---> 1:(2:(3:[℄)) [1,2,3℄
I õÒÁÖÎÅÎÉÅ II.2.6
ïÒÅÄÅÌÉÍ ÆÕÎË ÉÀ ÏÓÔÒÏÅÎÉÑ ÓÉÓËÁ ÅÌÙÈ ÞÉÓÅÌ, ÁÎÁÌÏÇÉÞ ÎÕÀ ÒÅÄÙÄÕÝÅÊ ÏÅÒÁ ÉÉ. îÁÛÁ ÆÕÎË ÉÑ ÄÏÂÁ×ÌÑÅÔ ÜÌÅÍÅÎÔ × ÎÁÞÁÌÏ ÓÉÓËÁ (Ô. Å. ÓÌÅ×Á). ðÏÍÅÓÔÉÔÅ × ÆÁÊÌ ÓÌÅÄÕÀÝÉÅ ÓÔÒÏËÉ:
myBuildLeft :: Int -> [Int℄ -> [Int℄ myBuildLeft x ls = x : ls úÁÇÒÕÚÉÔÅ ÆÕÎË ÉÀ É ÒÏ×ÅÒØÔÅ ÅÅ ÒÁÂÏÔÏÓÏÓÏÂÎÏÓÔØ.
J
42
H
II. úÎÁËÏÍÓÔ×Ï Ó ÑÚÙËÏÍ Haskell
äÌÑ ÏÂßÅÄÉÎÅÎÉÑ Ä×ÕÈ ÓÉÓËÏ× ÏÄÎÏÇÏ É ÔÏÇÏ ÖÅ ÔÉÁ ÉÓÏÌØ ÚÕÅÔÓÑ ÏÅÒÁÔÏÒ ++, ÎÁÒÉÍÅÒ,
---> [1, 4, 3℄ ++ [1, 56, 234℄ [1,4,3,1,56,234℄
I õÒÁÖÎÅÎÉÅ II.2.7
ïÒÅÄÅÌÉÍ ÄÒÕÇÕÀ ÆÕÎË ÉÀ ÏÓÔÒÏÅÎÉÑ ÓÉÓËÁ ÅÌÙÈ ÞÉÓÅÌ, ËÏ ÔÏÒÁÑ ÄÏÂÁ×ÌÑÅÔ ÎÏ×ÙÊ ÜÌÅÍÅÎÔ(ÅÒ×ÙÊ ÁÒÇÕÍÅÎÔ ÆÕÎË ÉÉ) × ËÏ ÎÅ ÓÉÓËÁ (×ÔÏÒÏÊ ÁÒÇÕÍÅÎÔ), Ô. Å. .
ÓÒÁ×Á
myBuildRight :: Int -> [Int℄ -> [Int℄ myBuildRight x ls = ls ++ [x℄ úÁÇÒÕÚÉÔÅ ÆÕÎË ÉÀ É ÒÏ×ÅÒØÔÅ ÅÅ ÒÁÂÏÔÏÓÏÓÏÂÎÏÓÔØ.
H
H
J
äÌÑ ÔÏÇÏ ÞÔÏÂÙ ÓÌÉÔØ × ÏÄÉÎ ÓÉÓÏË ÜÌÅÍÅÎÔÙ ÓÉÓËÁ ÓÉÓËÏ×, ÉÓÏÌØÚÕÅÔÓÑ ÆÕÎË ÉÑ on at:
---> on at [[1, 2, 3℄, [ ℄, [3,4℄℄ [1,2,3,3,4℄ óÉÓËÉ ÓÉÍ×ÏÌÏ× ÎÁÚÙ×ÁÀÔ ÔÁËÖÅ ÓÔÒÏËÁÍÉ. äÌÑ ÉÈ ÚÁÉÓÉ ÏÂÙÞÎÏ ÒÉÍÅÎÑÀÔ ÄÒÕÇÕÀ ÆÏÒÍÕ: ÚÁÉÓÙ×ÁÀÔ ×ÓÅ ÓÉÍ×ÏÌÙ ÏÄ ÒÑÄ, ÏÄÉÎ ÚÁ ÄÒÕÇÉÍ, ÎÉÞÅÍ ÎÅ ÒÁÚÄÅÌÑÑ, É ÚÁËÌÀÞÁÀÔ ÏÌÕÞÉ×ÛÕ ÀÓÑ ÓÔÒÏËÕ × Ä×ÏÊÎÙÅ ËÁ×ÙÞËÉ, ÎÁÒÉÍÅÒ,
---> ['a', 'b'℄ "ab" ---> head "ab d" 'a' ---> reverse "ab d" "d ba" òÁÓÓÍÏÔÒÉÍ ÎÅÓËÏÌØËÏ ÆÕÎË ÉÊ ÄÌÑ ÒÁÂÏÔÙ ÓÏ ÓÔÒÏËÁÍÉ, ÏÒÅ ÄÅÌÅÎÎÙÈ × ÆÁÊÌÅ Prelude.hs.
2. âÁÚÏ×ÙÅ ÔÉÙ ÑÚÙËÁ Haskell æÕÎË ÉÑ
words
lines unwords
unlines
É
43 òÅÚÕÌØÔÁÔ
[Char℄ -> [[Char℄℄ òÁÚÄÅÌÑÅÔ ÓÔÒÏËÕ ÎÁ ÓÉÓÏË ÓÌÏ×, ÕÄÁÌÑÑ ×ÓÅ ÒÏÂÅÌØÎÙÅ ÓÉÍ×ÏÌÙ (' ', '\n', '\t') [Char℄ -> [[Char℄℄ òÁÚÄÅÌÑÅÔ ÓÔÒÏËÕ ÎÁ ÏÄÓÔÒÏ ËÉ [[Char℄℄ -> [Char℄ æÕÎË ÉÑ, ÏÂÒÁÔÎÁÑ words, ÏÂßÅÄÉÎÑÅÔ ÓÉÓÏË ÓÔÒÏË × ÏÄÎÕ ÓÔÒÏËÕ, ÒÁÚÄÅÌÑÑ ÉÈ ÒÏ ÂÅÌÁÍÉ [[Char℄℄ -> [Char℄ æÕÎË ÉÑ, ÏÂÒÁÔÎÁÑ lines, ÏÂßÅÄÉÎÑÅÔ ÓÉÓÏË ÓÔÒÏË × ÏÄÎÕ ÓÔÒÏËÕ, ÄÏÂÁ×ÌÑÑ × ËÏÎ Å ËÁÖÄÏÇÏ ÜÌÅÍÅÎÔÁ ÓÉÍ×ÏÌ ÎÏ×ÏÊ ÓÔÒÏËÉ
ðÏÓÍÏÔÒÉÔÅ ÎÁ ÒÉÍÅÒÙ ÉÓÏÌØÚÏ×ÁÎÉÑ ÜÔÉÈ ÆÕÎË ÉÊ:
---> words "this is \n a string" ["this","is","a","string"℄ ---> lines "this is \n a string" ["this is "," a string"℄ ---> unwords ["this", "are", "the", "words"℄ "this are the words" ---> unlines ["this are", "the words"℄ "this are\nthe words\n" âÏÌÅÅ ÏÄÒÏÂÎÏ ÓÉÓËÉ É ÆÕÎË ÉÉ ÄÌÑ ÒÁÂÏÔÙ Ó ÎÉÍÉ ÂÕÄÕÔ ÒÁÓÓÍÏÔÒÅÎÙ × ÓÌÅÄÕÀÝÉÈ ÇÌÁ×ÁÈ.
2.6. õÏÒÑÄÏÞÅÎÎÙÅ ÍÎÏÖÅÓÔ×Á (tuples) ÷ÓÅ ÜÌÅÍÅÎÔÙ × ÓÉÓËÅ ÄÏÌÖÎÙ ÂÙÔØ ÏÄÎÏÇÏ É ÔÏÇÏ ÖÅ ÔÉÁ. îÅ×ÏÚÍÏÖÎÏ ÏÍÅÓÔÉÔØ ÅÌÏÅ ÞÉÓÌÏ, ÎÁÒÉÍÅÒ, × ÓÉÓÏË ÓÔÒÏË. ïÄÎÁËÏ × ÒÏ ÅÓÓÅ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÑ ×ÏÚÎÉËÁÅÔ ÎÅÏÂÈÏÄÉÍÏÓÔØ ÓÇÒÕÉÒÏ×ÁÔØ ÜÌÅÍÅÎÔÙ ÒÁÚÌÉÞÎÙÈ ÔÉÏ×. ÷ ÜÔÉÈ ÓÌÕÞÁÑÈ ÉÓÏÌØ ÚÕÀÔ ÓÏÓÏ ÏÒÇÁÎÉÚÁ ÉÉ ËÏÍÂÉÎÉÒÏ×ÁÎÎÙÈ ÔÉÏ×: ÄÁÎÎÙÅ ÇÒÕÉ ÒÕÀÔÓÑ × ÔØÀÌÙ (tuples) ÕÏÒÑÄÏÞÅÎÎÙÅ ÍÎÏÖÅÓÔ×Á ×ÅÌÉÞÉÎ, ÎÁÚÙ×ÁÅÍÙÅ ÔÁËÖÅ ËÏÒÔÅÖÁÍÉ. üÌÅÍÅÎÔÙ ÔØÀÌÁ ÚÁËÌÀÞÁÀÔ × ÓËÏÂËÉ É ÒÁÚÄÅÌÑÀÔ ÚÁÑÔÙÍÉ. îÉÖÅ ÒÉ×ÅÄÅÎÙ ÒÉÍÅÒÙ ÔÁËÉÈ ÕÏÒÑÄÏÞÅÎÎÙÈ ÍÎÏÖÅÓÔ×.
ËÒÕÇÌÙÅ
H
II. úÎÁËÏÍÓÔ×Ï Ó ÑÚÙËÏÍ Haskell
44 ØÀÌ
(2.4, " at")
É
úÎÁÞÅÎÉÅ
(Float, [Char℄)
ØÀÌ ÉÚ Ä×ÕÈ ÜÌÅÍÅÎ ÔÏ× (ÁÒÁ), ÓÏÓÔÏÑÝÉÊ ÉÚ ÞÉÓÌÁ 2.4 É ÓÔÒÏËÉ at ('a',True,1) (Char, Bool, Int) ØÀÌ ÉÚ ÔÒÅÈ ÜÌÅÍÅÎ ÔÏ×: ÓÉÍ×ÏÌÁ 'a', ÌÏÇÉÞÅ ÓËÏÊ ×ÅÌÉÞÉÎÙ True É ÅÌÏÇÏ ÞÉÓÌÁ 1 ([1, 2℄, sqrt) ([Int℄, ðÁÒÁ, ÓÏÓÔÏÑÝÁÑ ÉÚ Float -> Float) ÓÉÓËÁ ÅÌÙÈ ÞÉÓÅÌ É ÆÕÎË ÉÉ sqrt ÉÍÅÀÝÅÊ ÔÉ Float ! Float (1, (2,3)) (Int, (Int, Int)) ØÀÌ ÉÚ Ä×ÕÈ ÜÌÅÍÅÎ ÔÏ×: ÅÌÏÅ ÞÉÓÌÏ É ÁÒÁ ÅÌÙÈ ÞÉÓÅÌ ó ÔØÀÌÁÍÉ ÍÙ ÕÖÅ ×ÓÔÒÅÞÁÌÉÓØ ÒÉ ÓÏÚÄÁÎÉÉ ÆÕÎË ÉÉ ¾ÉÓ ËÌÀÞÉÔÅÌØÎÏÇÏ ÉÌÉ¿ exOr (ÓÔÒ. 35). ÷ ËÏÒÔÅÖÅ ×ÁÖÅÎ ÏÒÑÄÏË ÜÌÅÍÅÎÔÏ×. É ËÏÒÔÅÖÁ ÏÒÅÄÅ ÌÑÅÔÓÑ ÔÉÏÍ ËÁÖÄÏÇÏ ÅÇÏ ÜÌÅÍÅÎÔÁ. ÁË ÔØÀÌÙ (1, (2, 3)) É ((1, 2), 3) ÅÓÔØ ÒÁÚÌÉÞÎÙÅ ÔØÀÌÙ, ÉÍÅÀÝÉÅ ÓÏÏÔ×ÅÔÓÔ×ÅÎÎÏ ÓÌÅ ÄÕÀÝÉÅ ÔÉÙ: (Int, (Int, Int)) É ((Int, Int), Int). äÌÑ ËÏÒÔÅÖÁ ÉÚ Ä×ÕÈ ÜÌÅÍÅÎÔÏ× ÞÁÓÔÏ ÉÓÏÌØÚÕÀÔ ÔÅÒÍÉÎ , ÄÌÑ ÔØÀÌÁ ÉÚ ÔÒÅÈ ÜÌÅÍÅÎÔÏ× ÉÌÉ 3-ÔØÀÌ É Ô. Ä. îÅ ÂÙ×ÁÅÔ 1-ÔØÀÌÏ×: ×ÙÒÁÖÅÎÉÅ (7) ÅÓÔØ ÒÏÓÔÏ ÅÌÏÅ ÞÉÓÌÏ, ×ÅÄØ ÍÙ ×ÓÅÇÄÁ ÍÏÖÅÍ ÚÁËÌÀÞÉÔØ ÌÀÂÏÅ ×ÙÒÁÖÅÎÉÅ × ËÒÕÇÌÙÅ ÓËÏÂËÉ. ÅÍ ÎÅ ÍÅÎÅÅ, ÓÕÝÅÓÔ×ÕÅÔ 0-ÔØÀÌ: ×ÅÌÉÞÉÎÁ ( ) ÉÍÅÅÔ ÔÉ ( ). æÁÊÌ Prelude.hs (ÞÁÓÔÏ ÎÁÚÙ×ÁÅÍÙÊ ÒÅÌÀÄÉÅÊ) ÓÏÄÅÒÖÉÔ ÆÕÎË ÉÉ ÄÌÑ ÒÁÂÏÔÙ Ó ÁÒÁÍÉ: fst ×ÏÚ×ÒÁÝÁÅÔ ÅÒ×ÙÊ ÜÌÅÍÅÎÔ ÁÒÙ, Á snd ×ÔÏÒÏÊ, ÎÁÒÉÍÅÒ,
ÔÒÏÊËÁ
H
ÁÒÁ
---> fst (" at", "dog") " at" ---> snd (" at", "dog") "dog"
I õÒÁÖÎÅÎÉÅ II.2.8
òÁÓÓÍÏÔÒÉÍ ÆÕÎË ÉÀ smaller, ËÏÔÏÒÁÑ ÂÅÒÅÔ ËÏÒÔÅÖ ÉÚ Ä×ÕÈ Å ÌÙÈ ÞÉÓÅÌ É ×ÏÚ×ÒÁÝÁÅÔ ÍÅÎØÛÅÅ ÉÚ ÎÉÈ. óÏÈÒÁÎÉÔÅ ÓÌÅÄÕÀÝÉÊ ËÏÄ × ÆÁÊÌÅ smaller.hs.
2. âÁÚÏ×ÙÅ ÔÉÙ ÑÚÙËÁ Haskell
45
smaller :: (Integer, Integer) -> Integer smaller (x, y) = if x <= y then x else y îÉÖÅ ÒÉ×ÅÄÅÎÙ ÒÉÍÅÒÙ ×ÙÚÏ×Á ÏÒÅÄÅÌÅÎÎÏÊ ÎÁÍÉ ÆÕÎË ÉÉ.
---> :load smaller.hs Reading file "smaller.hs": Hugs session for: /usr/share/hugs/lib/Prelude.hs smaller.hs ---> smaller (8,3) 3 ---> smaller (8,38) 8
H
J
I õÒÁÖÎÅÎÉÅ II.2.9
ïÒÅÄÅÌÉÍ ÆÕÎË ÉÀ, ËÏÔÏÒÁÑ ÂÅÒÅÔ ÁÒÕ ÅÌÙÈ ÞÉÓÅÌ É ÕÏÒÑÄÏ ÞÉ×ÁÅÔ ÉÈ Ï ×ÏÚÒÁÓÔÁÎÉÀ. óÏÚÄÁÊÔÅ ÆÁÊÌ smallBig.hs, × ËÏÔÏÒÙÊ ÏÍÅÓÔÉÔÅ ÓÌÅÄÕÀÝÉÊ ËÏÄ.
smallBig :: (Int, Int) -> (Int, Int) smallBig (x, y) = if x <= y then (x, y) else (y, x) úÁÇÒÕÚÉÔÅ ÆÕÎË ÉÀ É ÒÉÍÅÎÉÔÅ ÅÅ Ë ÎÅÓËÏÌØËÉÍ ÁÒÁÍ ÞÉÓÅÌ.
J
ëÒÏÍÅ ÅÒÅÞÉÓÌÅÎÎÙÈ ÔÉÏ× ÒÏÇÒÁÍÍÁ ÎÁ ÑÚÙËÅ Haskell ÍÏÖÅÔ ÓÏÄÅÒÖÁÔØ ÍÎÏÖÅÓÔ×Ï ÄÒÕÇÉÈ (ËÁË ÓÔÁÎÄÁÒÔÎÙÈ, ÔÁË É ÏÒÅÄÅÌÑÅ ÍÙÈ ÏÌØÚÏ×ÁÔÅÌÅÍ) ÔÉÏ× É ËÌÁÓÓÏ× ÄÁÎÎÙÈ. íÙ ÏÚÎÁËÏÍÉÍÓÑ Ó ÎÉÍÉ × ÓÌÅÄÕÀÝÉÈ ÇÌÁ×ÁÈ.
÷ÏÒÏÓÙ É ÚÁÄÁÎÉÑ II.2.1
ðÕÓÔØ ÚÎÁÞÅÎÉÅ x ÒÁ×ÎÏ 5. ëÁËÏ×Ï ÚÎÁÞÅÎÉÅ ×ÙÒÁÖÅÎÉÊ x == 3 É x /= 3? II.2.2
÷ÙÞÉÓÌÉÔÅ: Á) 4e3 + 2e-2; Â) 4e3 * 2e-2; ×) 4e3 / 2e-2.
II. úÎÁËÏÍÓÔ×Ï Ó ÑÚÙËÏÍ Haskell
46 II.2.3
äÏÂÁ×ØÔÅ × ÓËÒÉÔ har.hs ÏÒÅÄÅÌÅÎÉÅ ÆÕÎË ÉÊ isAlphaNum É isSpa e. II.2.4
õËÁÖÉÔÅ ÔÉÙ ÓÌÅÄÕÀÝÉÈ ÓÉÓËÏ×: Á) [[True, False℄, [True, True, True℄, [ ℄, [False℄℄; Â) ["alpha", "beta", "gamma"℄; ×) [["alpha", "beta", "gamma"℄, ["psi", "omega"℄℄. II.2.5
õËÁÖÉÔÅ ×ÙÒÁÖÅÎÉÑ, ÉÍÅÀÝÉÅ ÓÌÅÄÕÀÝÉÅ ÔÉÙ: Á) (Bool, [Char℄), Â) ([Bool℄, Char), ×) [(Bool, Char)℄. II.2.6
åÓÌÉ ÆÕÎË ÉÑ f ÉÍÅÅÔ ÔÉ String -> String, ÔÏ ËÁËÏ× ÔÉ ÓÌÅÄÕ ÀÝÅÇÏ ÔØÀÌÁ (2.4, f, 's')? II.2.7
ïÒÅÄÅÌÉÔÅ ÆÕÎË ÉÀ greater, ÂÅÒÕÝÕÀ × ËÁÞÅÓÔ×Å ÁÒÇÕÍÅÎÔÁ ËÏÒ ÔÅÖ ÉÚ Ä×ÕÈ ÅÌÙÈ ÞÉÓÅÌ É ×ÏÚ×ÒÁÝÁÀÝÕÀ ÂÏÌØÛÅÅ ÉÚ ÎÉÈ.
3. úÁÄÁÎÉÅ ÆÕÎË ÉÊ ëÁË ÕÖÅ ÏÔÍÅÞÁÌÏÓØ, ÉÎÔÅÒÒÅÔÁÔÏÒ Hugs ÎÅ ÏÚ×ÏÌÑÅÔ ÉÎÔÅÒ ÁËÔÉ×ÎÏ ÏÒÅÄÅÌÑÔØ ÆÕÎË ÉÉ, ÏÜÔÏÍÕ ÉÈ ÏÒÅÄÅÌÅÎÉÑ ÏÍÅÝÁÀÔ × ÆÁÊÌ, ËÏÔÏÒÙÊ ÚÁÔÅÍ ÏÂÒÁÂÁÔÙ×ÁÅÔÓÑ ÉÎÔÅÒÒÅÔÁÔÏÒÏÍ. ÷ ÑÚÙËÅ Haskell ÒÁÚÄÅÌÅÎÏ ÏÂßÑ×ÌÅÎÉÅ ÆÕÎË ÉÉ, Ô. Å. ÕËÁÚÁ ÎÉÅ ÅÅ ÏÂÌÁÓÔÉ ÏÒÅÄÅÌÅÎÉÑ É ÏÂÌÁÓÔÉ ÚÎÁÞÅÎÉÊ, ÏÔ ÅÅ ÏÒÅÄÅÌÅ ÎÉÑ ÚÁÄÁÎÉÑ ÒÁ×ÉÌÁ, Ï ËÏÔÏÒÏÍÕ ÏÓÕÝÅÓÔ×ÌÑÅÔÓÑ ÒÅÏÂÒÁÚÏ ×ÁÎÉÅ ×ÈÏÄÎÏÊ ÉÎÆÏÒÍÁ ÉÉ × ×ÙÈÏÄÎÕÀ. ïÂßÑ×ÌÅÎÉÅ ÆÕÎË ÉÉ ÅÓÔØ ÏÉÓÁÎÉÅ ÅÅ , ÔÁË, ÆÒÁÚÁ (Integer, Integer) ! Integer ÏÉÓÙ×ÁÅÔ ÔÉ ÆÕÎË ÉÉ, ËÏÔÏÒÁÑ ÂÅÒÅÔ ÁÒÕ ÅÌÙÈ (ÔØÀÌ) × ËÁÞÅÓÔ×Å ÁÒÇÕÍÅÎÔÁ É ×ÙÒÁÂÁÔÙ×ÁÅÔ ÅÌÏÅ × ËÁÞÅÓÔ×Å ÒÅÚÕÌØÔÁÔÁ. ÁËÏÅ ÏÉÓÁÎÉÅ ÔÉÁ ÔÁËÖÅ ÎÁÚÙ×Á ÅÔÓÑ ÉÌÉ . óÉÎÔÁËÓÉÓ ÏÂßÑ×ÌÅÎÉÑ ÔÁËÏ×:
ÔÉÁ
ÎÁÚÎÁÞÅÎÉÅÍ ÔÉÁ (type assignment) (type signature)
ÓÉÇÎÁÔÕÒÏÊ ÔÉÁ
ÉÍÑ_ÆÕÎË ÉÉ :: ÏÂÌÁÓÔØ_ÏÒÅÄÅÌÅÎÉÑ -> ÏÂÌÁÓÔØ_ÚÎÁÞÅÎÉÊ
3. úÁÄÁÎÉÅ ÆÕÎË ÉÊ
47
ðÏ ÎÅËÏÔÏÒÙÍ ÄÁÎÎÙÍ ÕËÁÚÁÎÉÅ ÏÂßÑ×ÌÅÎÉÊ ÆÕÎË ÉÊ ÏÚ×ÏÌÑ ÅÔ ÎÁÈÏÄÉÔØ ÄÏ 99% ÏÛÉÂÏË, ÉÍÅÀÝÉÈÓÑ × ÒÏÇÒÁÍÍÅ, ÅÝÅ ÎÁ ÜÔÁÅ ÓÉÎÔÁËÓÉÞÅÓËÏÇÏ ÁÎÁÌÉÚÁ ÉÎÔÅÒÒÅÔÁÔÏÒÏÍ. ïÒÅÄÅÌÑÑ ÆÕÎË ÉÀ, ÍÙ ÄÏÂÁ×ÌÑÅÍ Ë ÏÂßÑ×ÌÅÎÉÀ ÒÁ×ÉÌÏ ÅÅ ×ÙÞÉÓÌÅÎÉÑ, ÎÁÒÉÍÅÒ,
ube :: Integer -> Integer
ube n = n*n*n
úÄÅÓØ ÏÒÅÄÅÌÅÎÁ ÆÕÎË ÉÑ, ÄÅÊÓÔ×ÕÀÝÁÑ ÉÚ ÍÎÏÖÅÓÔ×Á Integer × ÍÎÏÖÅÓÔ×Ï Integer É ×ÙÞÉÓÌÑÀÝÁÑ ËÕ ÞÉÓÌÁ. ÷ ÏÒÅÄÅÌÅÎÉÉ ÆÕÎË ÉÉ ÉÓÏÌØÚÏ×ÁÌÓÑ ×ÓÔÒÏÅÎÎÙÊ ÏÅÒÁÔÏÒ ÕÍÎÏÖÅÎÉÑ.
3.1. ëÏÍÂÉÎÁ ÉÉ ÆÕÎË ÉÊ úÁÞÁÓÔÕÀ ÒÉ ÏÒÅÄÅÌÅÎÉÉ ÔÏÊ ÉÌÉ ÉÎÏÊ ÆÕÎË ÉÉ ÉÓÏÌØÚÕÀÔ ÉÌÉ ×ÓÔÒÏÅÎÎÙÅ ÆÕÎË ÉÉ É ÏÅÒÁÔÏÒÙ (ÎÁÒÉÍÅÒ, ÏÅÒÁÔÏÒ ÕÍÎÏ ÖÅÎÉÑ * × ÒÅÄÙÄÕÝÅÍ ÒÉÍÅÒÅ) ÉÌÉ ÒÁÎÅÅ ÏÒÅÄÅÌÅÎÎÙÅ ÆÕÎË ÉÉ (ÌÉÂÏ × ÒÅÌÀÄÉÉ, ÌÉÂÏ ÓÁÍÉÍ ÒÏÇÒÁÍÍÉÓÔÏÍ). ðÏÄÏÂÎÙÅ ÏÒÅÄÅÌÅÎÉÑ ÆÕÎË ÉÊ ÉÍÅÀÔ ÓÌÅÄÕÀÝÕÀ ÓÔÒÕËÔÕÒÕ:
ÉÍÑ ÆÕÎË ÉÉ; ÉÍÑ(ÅÎÁ) ÎÅÏÂÑÚÁÔÅÌØÎÏÇÏ(ÙÈ) ÁÒÁÍÅÔÒÁ(Ï×); ÚÎÁË = (ÒÁ×ÎÏ); ×ÙÒÁÖÅÎÉÅ, ËÏÔÏÒÏÅ ÍÏÖÅÔ ÓÏÄÅÒÖÁÔØ ÁÒÁÍÅÔÒÙ, ÓÔÁÎÄÁÒÔ ÎÙÅ ÆÕÎË ÉÉ É ÏÒÅÄÅÌÅÎÎÙÅ ÒÏÇÒÁÍÍÉÓÔÏÍ ÆÕÎË ÉÉ.
æÕÎË ÉÉ Ó ÎÕÌÅ×ÙÍ ËÏÌÉÞÅÓÔ×ÏÍ ÁÒÇÕÍÅÎÔÏ× ÎÁÚÙ×ÁÀÔÓÑ ËÏÎ ÓÔÁÎÔÁÍÉ, ÎÁÒÉÍÅÒ,
e :: Float e = exp 1.0 ÷ ÑÚÙËÅ Haskell ×ÏÚÍÏÖÎÏ ÏÒÅÄÅÌÅÎÉÅ ÆÕÎË ÉÊ Ó ÎÅÓËÏÌØËÉÍÉ ÁÒÁÍÅÔÒÁÍÉ:
ab Formula :: Float -> Float -> Float -> [Float℄ ab Formula a b = [(-b + sqrt(b*b - 4.0*a* ))/(2.0*a), (-b - sqrt(b*b - 4.0*a* ))/(2.0*a) ℄ æÕÎË ÉÑ ab Formula ×ÙÄÁÅÔ ÓÉÓÏË ËÏÒÎÅÊ Ë×ÁÄÒÁÔÎÏÇÏ ÕÒÁ×ÎÅ ÎÉÑ ax2 + bx + = 0.
---> ab Formula 1.0 2.0 1.0 [-1.0,-1.0℄
H
48
II. úÎÁËÏÍÓÔ×Ï Ó ÑÚÙËÏÍ Haskell
æÕÎË ÉÉ, ×ÏÚ×ÒÁÝÁÀÝÉÅ ÂÕÌÅ×ÓËÉÅ ÚÎÁÞÅÎÉÑ, ÓÒÁ×Á ÏÔ ÚÎÁËÁ ÒÁ×ÅÎÓÔ×Á ÄÏÌÖÎÙ ÓÏÄÅÒÖÁÔØ ÌÏÇÉÞÅÓËÏÅ ×ÙÒÁÖÅÎÉÅ, ÎÁÒÉÍÅÒ,
negative, pozitive, isZero :: Integer -> Bool negative x = x < 0 pozitive x = x > 0 isZero x = x == 0
åÓÌÉ Ä×Á ÏÒÅÄÅÌÅÎÉÑ ÒÁÚÍÅÝÅ ÎÙ ÎÁ ÏÄÎÏÊ ÓÔÒÏËÅ, ÔÏ ÉÈ ÒÁÚ ÄÅÌÑÀÔ ÓÉÍ×ÏÌÏÍ ; (ÔÏÞËÁ Ó ÚÁÑÔÏÊ): answer = 42 ; fa Six = 720
ïÂÒÁÔÉÔÅ ×ÎÉÍÁÎÉÅ ÎÁ ÒÁÚÌÉÞÉÑ × ÉÓÏÌØÚÏ×ÁÎÉÉ ÏÄÉÎÁÒÎÏÇÏ (=) É Ä×ÏÊÎÏÇÏ (==) ÚÎÁËÁ ÒÁ×ÅÎÓÔ×Á: ÅÒ×ÙÊ ÏÚÎÁÞÁÅÔ, ÞÔÏ ÄÁÌÅÅ ÓÌÅ ÄÕÅÔ ÏÒÅÄÅÌÅÎÉÅ ÆÕÎË ÉÉ, × ÔÏ ×ÒÅÍÑ ËÁË ×ÔÏÒÏÊ ÏÅÒÁÔÏÒ ÒÏ×ÅÒËÉ ÎÁ ÒÁ×ÅÎÓÔ×Ï.
3.2. þÁÓÔÎÙÅ ÏÒÅÄÅÌÅÎÉÑ ÷ ÏÒÅÄÅÌÅÎÉÉ ÒÁÓÓÍÏÔÒÅÎÎÏÊ ×ÙÛÅ ÆÕÎË ÉÉ ab Formula ×Ù ÒÁÖÅÎÉÑ sqrt(b*b - 4.0*a* ) É (2.0*a) ÉÓÏÌØÚÕÀÔÓÑ Ä×ÁÖÄÙ. îÅÕÄÏÂÓÔ×Ï ÔÁËÏÊ ÚÁÉÓÉ ÚÁËÌÀÞÁÅÔÓÑ ÎÅ ÔÏÌØËÏ ×Ï ××ÏÄÅ Ï×ÔÏ ÒÑÀÝÉÈÓÑ ÆÒÁÇÍÅÎÔÏ× ÆÕÎË ÉÉ, ÎÏ É × ÔÏÍ, ÞÔÏ ÒÉ ×ÙÞÉÓÌÅÎÉÉ ÔÁËÉÈ ×ÙÒÁÖÅÎÉÊ ÔÅÒÑÅÔÓÑ ×ÒÅÍÑ: ÉÄÅÎÔÉÞÎÙÅ ÏÄ×ÙÒÁÖÅÎÉÑ ×Ù ÞÉÓÌÑÀÔÓÑ Ä×ÁÖÄÙ. ó ÅÌØÀ ÒÅÄÏÔ×ÒÁÝÅÎÉÑ ÏÄÏÂÎÙÈ ×ÅÝÅÊ ÒÉ ÚÁÄÁÎÉÉ ÆÏÒÍÕÌ ÉÓÏÌØÚÕÀÔÓÑ, ÔÁË ÎÁÚÙ×ÁÅÍÙÅ, , ÏÚ×ÏÌÑÀÝÉÅ ÄÁ×ÁÔØ ÉÍÅÎÁ ÏÄ×ÙÒÁÖÅÎÉÑÍ × ÆÏÒÍÕÌÁÈ. õÌÕÞÛÅÎÎÏÅ ÏÒÅÄÅÌÅÎÉÅ ÂÕÄÅÔ ÓÌÅÄÕÀÝÉÍ:
ÌÅÎÉÑ
H
ÞÁÓÔÎÙÅ ÏÒÅÄÅ
ab Formula' :: Float -> Float -> Float -> [Float℄ ab Formula' a b = [ (-b+d)/n, (-b-d)/n℄ where d = sqrt (b*b-4.0*a* ) n = 2.0*a ïÂÒÁÔÉÔÅ ×ÎÉÍÁÎÉÅ ÎÁ Ä×ÕÍÅÒÎÙÊ ÓÉÎÔÁËÓÉÓ ÞÁÓÔÎÙÈ ÏÒÅÄÅÌÅ ÎÉÊ: ÉÈ ÉÍÅÎÁ ÄÏÌÖÎÙ ÎÁÞÉÎÁÔØÓÑ Ó ÏÄÎÏÊ É ÔÏÊ ÖÅ ÏÚÉ ÉÉ ÒÁÚ ÎÙÈ ÓÔÒÏË. íÏÖÎÏ ÒÁÓÏÌÏÖÉÔØ ÏÒÅÄÅÌÅÎÉÑ ÎÅÓËÏÌØËÉÈ ÞÁÓÔÎÙÈ ÅÒÅÍÅÎÎÙÈ ÎÁ ÏÄÎÏÊ ÓÔÒÏËÅ, ÒÁÚÄÅÌÉ× ÉÈ × ÜÔÏÍ ÓÌÕÞÁÅ ÓÉÍ×ÏÌÏÍ ; (ÔÏÞËÁ Ó ÚÁÑÔÏÊ). óÏ ÓÔÁÔÉÓÔÉÞÅÓËÉÍÉ Ï ÉÑÍÉ ÉÎÔÅÒÒÅÔÁÔÏÒÁ (ËÏÍÁÎÄÁ :set +s) ÒÁÚÎÉ Á × ÉÓÏÌØÚÏ×ÁÎÉÉ ÏÔÞÅÔÌÉ×Ï ×ÉÄÎÁ:
---> ab Formula 1.0 2.0 1.0 [-1.0,-1.0℄ (80 redu tions, 137 ells) ---> ab Formula' 1.0 2.0 1.0
3. úÁÄÁÎÉÅ ÆÕÎË ÉÊ
49
[-1.0,-1.0℄ (64 redu tions, 108 ells) ëÌÀÞÅ×ÏÅ ÓÌÏ×Ï where (ÇÄÅ) ÜÔÏ ÎÅ ÉÍÑ ÆÕÎË ÉÉ, Á ÏÄÎÏ ÉÚ ÚÁ ÒÅÚÅÒ×ÉÒÏ×ÁÎÎÙÈ ËÌÀÞÅ×ÙÈ ÓÌÏ× (ÓÍ. ÓÔÒ. 23). ðÏÓÌÅ where ÒÉ×Ï ÄÑÔÓÑ ÎÅÓËÏÌØËÏ ÏÒÅÄÅÌÅÎÉÊ, × ÄÁÎÎÏÍ ÓÌÕÞÁÅ ÏÒÅÄÅÌÑÀÔÓÑ ËÏÎ ÓÔÁÎÔÙ d É n. ÁËÉÅ ËÏÎÓÔÁÎÔÙ ÍÏÇÕÔ ÉÓÏÌØÚÏ×ÁÔØÓÑ × ×ÙÒÁÖÅÎÉÉ, ÏÓÌÅ ËÏÔÏÒÏÇÏ ÕËÁÚÙ×ÁÅÔÓÑ ËÌÀÞÅ×ÏÅ ÓÌÏ×Ï where. ïÎÉ ÎÅ ÍÏÇÕÔ ÉÓÏÌØÚÏ×ÁÔØÓÑ ×ÎÅ ÜÔÏÊ ÆÕÎË ÉÉ ÏÔÓÀÄÁ É ÎÁÚ×ÁÎÉÅ: . íÏÖÅÔ ÏËÁÚÁÔØÓÑ ÓÔÒÁÎÎÙÍ, ÞÔÏ d É n ÎÁÚÙ×ÁÀÔ ËÏÎ ÓÔÁÎÔÁÍÉ, ×ÅÄØ ÉÈ ÚÎÁÞÅÎÉÑ × ÒÁÚÎÙÈ ×ÙÚÏ×ÁÈ ab Formula' ÍÏÖÅÔ ÂÙÔØ ÒÁÚÎÙÍ. îÏ × ÍÏÍÅÎÔ ×ÙÚÏ×Á ab Formula' Ó ÚÁÄÁÎÎÙÍÉ a, b É ÏÎÉ ×ÙÞÉÓÌÑÀÔÓÑ ÌÉÛØ ÏÄÉÎ ÒÁÚ, ÏÓÌÅ ÞÅÇÏ ÕÖÅ ÎÅ ÉÚÍÅÎÑÀÔ ÓÑ; ÄÒÕÇÉÍÉ ÓÌÏ×ÁÍÉ, ÏÎÉ Ñ×ÌÑÀÔÓÑ ËÏÎÓÔÁÎÔÎÙÍÉ ×ÙÒÁÖÅÎÉÑÍÉ × ÒÏ ÅÓÓÅ ×ÙÞÉÓÌÅÎÉÑ ÆÕÎË ÉÉ. äÒÕÇÁÑ ÆÏÒÍÁ ÞÁÓÔÎÙÈ ÏÒÅÄÅÌÅÎÉÊ ÉÓÏÌØÚÕÅÔ ËÌÀÞÅ×ÙÅ ÓÌÏ ×Á let ... in (ÕÓÔØ ... ×). ÷ ÎÅÊ ÓÎÁÞÁÌÁ ××ÏÄÑÔÓÑ ÞÁÓÔÎÙÅ ÏÒÅÄÅ ÌÅÎÉÑ, Á ÚÁÔÅÍ ÒÅÚÕÌØÔÁÔ ×ÙÒÁÖÁÅÔÓÑ ÞÅÒÅÚ ÎÉÈ. ÷ÏÔ ËÁË ×ÙÇÌÑÄÉÔ ÚÁÄÁÎÎÁÑ × ÔÁËÏÍ ÓÔÉÌÅ ÆÏÒÍÕÌÁ ÄÌÑ ÎÁÈÏÖÄÅÎÉÑ ËÏÒÎÅÊ Ë×ÁÄÒÁÔ ÎÏÇÏ ÕÒÁ×ÎÅÎÉÑ:
ÞÁÓÔÎÙÅ
ÏÒÅÄÅÌÅÎÉÑ
ab Formula'' :: Float -> Float -> Float -> [Float℄ ab Formula'' a b = let d = sqrt (b*b-4.0*a* ) n = 2.0*a in [(-b+d)/n, (-b-d)/n℄ ðÒÉ ÉÓÏÌØÚÏ×ÁÎÉÉ ËÏÎÓÔÒÕË ÉÉ let ...in ÔÁËÖÅ ÎÅÏÂÈÏÄÉÍÏ ×ÎÉÍÁÔÅÌØÎÏ ÓÌÅÄÉÔØ ÚÁ ×ÙÒÁ×ÎÉ×ÁÎÉÑÍÉ ÓÔÒÏË; ×ÓÅ ÏÒÅÄÅÌÅÎÉÑ, ÏÔÎÏÓÑÝÉÅÓÑ Ë ÏÄÎÏÍÕ É ÔÏÍÕ ÖÅ ÕÒÏ×ÎÀ, ÄÏÌÖÎÙ ÉÍÅÔØ ÏÄÉÎÁ ËÏ×ÙÊ ÏÔÓÔÕ. óÉÍ×ÏÌ, ÓÌÅÄÕÀÝÉÊ ÚÁ ËÌÀÞÅ×ÙÍÉ ÓÌÏ×ÁÍÉ where ÉÌÉ let ÚÁÄÁÅÔ ÎÁÞÁÌØÎÕÀ ÏÚÉ ÉÀ ÄÌÑ ÞÁÓÔÎÙÈ ÏÒÅÄÅÌÅÎÉÊ, ÚÁ ÄÁ×ÁÅÍÙÈ × ÜÔÉÈ ËÏÎÓÔÒÕË ÉÑÈ. åÓÌÉ × ÓÌÅÄÕÀÝÉÈ ÓÔÒÏËÁÈ ÏÔÓÔÕ ÔÁËÏÊ ÖÅ, ÔÏ ÞÁÓÔÎÙÅ ÏÒÅÄÅÌÅÎÉÑ ÒÁÓÓÍÁÔÒÉ×ÁÀÔÓÑ ËÁË ÒÏÄÏÌ ÖÅÎÉÑ ÜÔÉÈ ËÏÎÓÔÒÕË ÉÊ. åÓÌÉ ÖÅ ÏÔÓÔÕ ÕÍÅÎØÛÉÌÓÑ, ÔÏ ÜÔÏ ÒÁÓ ÓÍÁÔÒÉ×ÁÅÔÓÑ ËÁË ÏËÏÎÞÁÎÉÅ ËÏÎÓÔÒÕË ÉÉ. ÁËÉÍ ÏÂÒÁÚÏÍ ÕÞÉÔÙ ×ÁÅÔÓÑ ¾ÏËÒÕÖÅÎÉÅ¿ ( ) ËÁÖÄÏÊ ËÏÎÓÔÒÕË ÉÉ. áÌØÔÅÒÎÁÔÉ×ÏÊ ÜÔÏÍÕ Ñ×ÌÑÅÔÓÑ ÉÓÏÌØÚÏ×ÁÎÉÅ ÆÉÇÕÒÎÙÈ ÓËÏÂÏË É ÓÉÍ×ÏÌÁ ; ÄÌÑ ×ÙÄÅÌÅÎÉÑ. ÁË, ÓÌÅÄÕÀÝÉÅ Ä×Å ËÏÎÓÔÒÕË ÉÉ ÜË×É×ÁÌÅÎÔÎÙ:
layout
let y = a*b f x = (x+y)/y in f + f d
II. úÎÁËÏÍÓÔ×Ï Ó ÑÚÙËÏÍ Haskell
50
let { y = a*b ; f x = (x+y)/y } in f + f d ïÂÝÉÊ ×ÉÄ ÞÁÓÔÎÙÈ ÏÒÅÄÅÌÅÎÉÊ ÔÁËÏ×: let ÉÍÑ = ×ÙÒÁÖÅÎÉÅ1 in ×ÙÒÁÖÅÎÉÅ2 ÉÌÉ ×ÙÒÁÖÅÎÉÅ2 where ÉÍÑ = ×ÙÒÁÖÅÎÉÅ1 ÷ÙÒÁÖÅÎÉÅ1 ÉÎÏÇÄÁ ÎÁÚÙ×ÁÀÔ , ÉÌÉ , Á ×ÙÒÁÖÅÎÉÅ2 . ïÂÅ ÜÔÉ ËÏÎÓÔÒÕË ÉÉ ÉÍÅÀÔ Ë×ÁÌÉÆÉËÁÔÏÒ, ÎÁ ËÏÔÏÒÙÊ ÍÏÖÎÏ ÓÓÙÌÁÔØÓÑ Ó ÏÍÏÝØÀ ÉÍÅÎÉ × ÒÅÚÕÌØÔÁÎÔÅ. ëÏÎ Å ÉÑ ÉÓÏÌØÚÏ×ÁÎÉÑ ÞÁÓÔÎÙÈ (private) ÅÒÅÍÅÎ ÎÙÈ ×ÚÁÍÅÎ ÏÂÝÅÄÏÓÔÕÎÙÈ (publi ) Ñ×ÌÑÅÔÓÑ ÓÏÓÏÂÏÍ ; ÉÎËÁÓÕÌÑ ÉÉ (ÓÏËÒÙÔÉÑ) ÞÁ ÓÔÅÊ ÒÏÇÒÁÍÍÙ, ÞÔÏ ÏÚ×ÏÌÑÅÔ f x = let a = 1; b = 2 ÓËÒÙ×ÁÔØ ×ÎÕÔÒÅÎÎÉÅ ÄÅÔÁÌÉ g y = exp2 ÒÅÁÌÉÚÁ ÉÉ ÔÏÊ ÉÌÉ ÉÎÏÊ in exp1 ÆÕÎË ÉÉ ÏÔ ÄÒÕÇÉÈ ÞÁÓÔÅÊ ÒÏÇÒÁÍÍÙ. éÎËÁÓÕÌÑ ÉÑ Ñ×ÌÑÅÔÓÑ ÏÄÎÏÊ ÉÚ ÎÁÉÂÏÌÅÅ ×ÁÖÎÙÈ ÉÄÅÊ ÒÏÇÒÁÍÍÎÏÊ ÉÎÖÅÎÅÒÉÉ. âÅÚ ÉÓÏÌØÚÏ×ÁÎÉÑ ÏÄÏÂÎÙÈ ÔÅÈÎÏÌÏÇÉÊ ÒÁÚÒÁÂÏÔËÁ ÂÏÌØÛÉÈ ÒÏÇÒÁÍÍÎÙÈ ÓÉÓÔÅÍ ÂÙÌÁ ÂÙ ÎÅ×ÏÚÍÏÖÎÁ.
ÅÍ
Ë×ÁÌÉÆÉËÁÔÏÒÏÍ
Ë×ÁÌÉÆÉ ÉÒÕÀÝÉÍ ×ÙÒÁÖÅÎÉ ÒÅÚÕÌØÔÁÎÔÏÍ
îÅÓËÏÌØËÏ ÞÁÓÔÎÙÈ ÏÒÅÄÅÌÅ ÎÉÊ ÍÏÇÕÔ ÒÁÚÍÅÝÁÔØÓÑ ÎÁ ÏÄ ÎÏÊ ÓÔÒÏËÅ, ÒÁÚÄÅÌÑÅÍÙÅ ÓÉÍ×Ï ÌÏÍ (ÔÏÞËÁ Ó ÚÁÑÔÏÊ):
I õÒÁÖÎÅÎÉÅ II.3.1
ïÒÅÄÅÌÉÍ ÆÕÎË ÉÀ, ÏÄÓÞÉÔÙ×ÁÀÝÕÀ ÓÕÍÍÕ Ä×ÕÈ ÏÓÌÅÄÎÉÈ ÉÆÒ ÅÌÏÇÏ ÞÉÓÌÁ, ÉÓÏÌØÚÕÀ Ä×Á ×ÉÄÁ ÞÁÓÔÎÙÈ ÏÒÅÄÅÌÅÎÉÊ. óÎÁÞÁÌÁ ×ÏÓÏÌØÚÕÅÍÓÑ ËÏÎÓÔÒÕË ÉÅÊ where:
sumOfLastTwoDigits :: Int -> Int sumOfLastTwoDigits x = d1 + d0 where d0 = x `mod` 10 d1 = shift `mod` 10 shift = x `div` 10 úÄÅÓØ ÒÉ ×ÙÞÉÓÌÅÎÉÉ d0 ÉÓÏÌØÚÕÅÔÓÑ ÁÒÁÍÅÔÒ ÆÕÎË ÉÉ x, Á ÒÉ ×ÙÞÉÓÌÅÎÉÉ d1 ÞÁÓÔÎÁÑ ÅÒÅÍÅÎÎÁÑ shift. äÁÄÉÍ ÁÌØÔÅÒÎÁÔÉ×ÎÏÅ ÏÒÅÄÅÌÅÎÉÅ ÜÔÏÊ ÆÕÎË ÉÉ, ÉÓÏÌØÚÕÀ ÝÅÅ ËÏÎÓÔÒÕË ÉÀ let ...in:
3. úÁÄÁÎÉÅ ÆÕÎË ÉÊ
51
sumOfLastTwoDigits' :: Int -> Int sumOfLastTwoDigits' x = let d0 = x `mod` 10 d1 = shift `mod` 10 shift = x `div` 10 in d1 + d0 òÅÚÕÌØÔÁÔÙ ÒÉÍÅÎÅÎÉÑ ÜÔÉÈ ÆÕÎË ÉÊ ÓÏ×ÁÄÁÀÔ:
---> sumOfLastTwoDigits 5555555 10 ---> sumOfLastTwoDigits' 5555555 10
H J
3.3. ïÒÅÄÅÌÅÎÉÑ Ó ÁÌØÔÅÒÎÁÔÉ×ÁÍÉ éÎÏÇÄÁ ÂÙ×ÁÅÔ ÎÅÏÂÈÏÄÉÍÏ ÒÉ ÚÁÄÁÎÉÉ ÆÕÎË ÉÉ ÕËÁÚÁÔØ, × ËÁËÏÍ ÓÌÕÞÁÅ ÉÓÏÌØÚÕÅÔÓÑ ÔÁ ÉÌÉ ÉÎÁÑ ÞÁÓÔØ ÏÒÅÄÅÌÅÎÉÑ. ÷ Ï ÄÏÂÎÙÈ ÓÌÕÞÁÑÈ ÉÓÏÌØÚÕÀÔÓÑ ÔÁË ÎÁÚÙ×ÁÅÍÙÅ ÏÒÅÄÅÌÅÎÉÑ Ó ÁÌØÔÅÒÎÁÔÉ×ÁÍÉ. òÁÓÓÍÏÔÒÉÍ × ËÁÞÅÓÔ×Å ÏÄÏÂÎÏÇÏ ÏÒÅÄÅÌÅÎÉÑ ÆÕÎË ÉÀ, ×ÙÞÉÓÌÑÀÝÕÀ ÁÂÓÏÌÀÔÎÕÀ ×ÅÌÉÞÉÎÕ ÞÉÓÌÁ. ÷ ÓÏÏÔ×ÅÔ ÓÔ×ÉÉ Ó ÍÁÔÅÍÁÔÉÞÅÓËÉÍ ÏÒÅÄÅÌÅÎÉÅÍ ( x; ÅÓÌÉ x > 0; abs(x) = x; ÅÓÌÉ x < 0 ÒÉÈÏÄÉÔØÓÑ ×ÙÂÒÁÔØ ÏÄÎÏ ÒÁ×ÉÌÏ ÉÚ Ä×ÕÈ × ÚÁ×ÉÓÉÍÏÓÔÉ ÏÔ ÚÎÁËÁ ÁÒÇÕÍÅÎÔÁ. ÷ ÑÚÙËÅ Haskell ÜÔÕ ÆÕÎË ÉÀ ÍÏÖÎÏ ÏÒÅÄÅÌÉÔØ Ó ÏÍÏÝØÀ ËÏÎÓÔÒÕË ÉÉ if ... then ... else ( ). íÙ ÂÕÄÅÍ ÄÏÂÁ×ÌÑÔØ ÓÉÍ×ÏÌ ' Ë ÉÍÅÎÁÍ ÆÕÎË ÉÊ, ËÏÔÏÒÙÅ ÕÖÅ ÏÒÅÄÅÌÅÎÙ × ÒÅÌÀÄÉÉ:
ÅÓÌÉ ... ÔÏ ... ÉÎÁÞÅ
abs' x = if x >= 0 then x else -x äÒÕÇÁÑ ÆÏÒÍÁ ÏÒÅÄÅÌÅÎÉÑ Ó ÁÌØÔÅÒÎÁÔÉ×ÁÍÉ ÉÓÏÌØÚÕÅÔ ËÏÎ ÓÔÒÕË ÉÀ ase ... of:
abs' x = ase x >= 0 of True -> x False -> -x úÁÍÅÔÉÍ, ÞÔÏ ËÏÌÉÞÅÓÔ×Ï ÁÌØÔÅÒÎÁÔÉ× × ËÏÎÓÔÒÕË ÉÉ ase ÎÅ ÏÂÑ ÚÁÎÏ ÒÁ×ÎÑÔØÓÑ Ä×ÕÍ.
52
II. úÎÁËÏÍÓÔ×Ï Ó ÑÚÙËÏÍ Haskell
I õÒÁÖÎÅÎÉÅ II.3.2
H
ïÒÅÄÅÌÉÍ ÁÒÕ ÆÕÎË ÉÊ: digitChar ÏÚ×ÏÌÑÀÝÕÀ ÅÒÅ×ÅÓÔÉ ÉÆÒÕ × ÓÉÍ×ÏÌ, ÅÅ ÏÂÏÚÎÁÞÁÀÝÉÊ, É harValue ÏÓÕÝÅÓÔ×ÌÑÀ ÝÕÀ ÏÂÒÁÔÎÕÀ ÏÅÒÁ ÉÀ. äÌÑ ÜÔÏÇÏ ÎÁÍ ÏÔÒÅÂÕÀÔÓÑ ÏÒÅÄÅÌÅÎ ÎÙÅ × ÒÅÌÀÄÉÉ ÆÕÎË ÉÉ ord, ×ÏÚ×ÒÁÝÁÀÝÁÑ ASCII-ËÏÄ ÓÉÍ×ÏÌÁ, É hr, ËÏÔÏÒÁÑ Ï ËÏÄÕ ÏÒÅÄÅÌÑÅÔ ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÉÊ ÅÍÕ ÓÉÍ×ÏÌ. îÁÏÍÎÉÍ, ÞÔÏ × ÔÁÂÌÉ Å ASCII-ËÏÄÏ× ËÏÄÙ ÉÆÒ ÒÁÓÏÌÏÖÅÎÙ × ÏÒÑÄËÅ ×ÏÚÒÁÓÔÁÎÉÑ.
digitChar :: Int -> Char digitChar n = ase n >= 0 && n < 10 of True -> hr (n +ord '0')
harValue :: Char -> Int
harValue = ase isDigit of True -> ord - ord '0' ---> digitChar 5 '5' ---> harValue '5' 5
J
3.4. ïÈÒÁÎÎÙÅ ×ÙÒÁÖÅÎÉÑ
H
òÁÓÓÍÏÔÒÅÎÎÕÀ ×ÙÛÅ ÆÕÎË ÉÀ ÎÁÈÏÖÄÅÎÉÑ ÁÂÓÏÌÀÔÎÏÊ ×ÅÌÉ ÞÉÎÙ ÞÉÓÌÁ ÍÏÖÎÏ ÏÒÅÄÅÌÉÔØ ÔÁËÖÅ ÓÌÅÄÕÀÝÉÍ ÏÂÒÁÚÏÍ:
abs' x | x >= 0 = x | x < 0 = -x ÁËÁÑ ÆÏÒÍÁ ÚÁÉÓÉ ÒÅÄÏÞÔÉÔÅÌØÎÅÅ ËÏÎÓÔÒÕË ÉÉ if, ÅÓÌÉ ÞÉÓÌÏ ÒÁÚÌÉÞÎÙÈ ÓÌÕÞÁÅ× ÂÏÌÅÅ Ä×ÕÈ. îÁÒÉÍÅÒ, ÆÕÎË ÉÑ sign, ËÏÔÏÒÁÑ ÕÖÅ ÕÏÍÉÎÁÌÁÓØ ÎÁ ÓÔÒ. 29, ÍÏÖÅÔ ÂÙÔØ ÚÁÄÁÎÁ ÔÁË:
sign x | x > 0 = 1 | x == 0 = 0 | x < 0 = -1 ÷ÙÚÏ× ÏÄÏÂÎÙÍ ÏÂÒÁÚÏÍ ÏÒÅÄÅÌÅÎÎÏÊ ÆÕÎË ÉÉ ÏÓÕÝÅÓÔ×ÌÑÅÔÓÑ ÓÔÁÎÄÁÒÔÎÙÍ ÓÏÓÏÂÏÍ:
---> sign (-6) -1
3. úÁÄÁÎÉÅ ÆÕÎË ÉÊ
53
ïÒÅÄÅÌÅÎÉÑ ÒÁÚÌÉÞÎÙÈ ÓÌÕÞÁÅ× ¾ÏÈÒÁÎÑÀÔÓÑ¿ ÂÕÌÅ×ÙÍÉ ×Ù ÒÁÖÅÎÉÑÍÉ, ËÏÔÏÒÙÅ ÏÜÔÏÍÕ ÎÁÚÙ×ÁÀÔÓÑ ÏÈÒÁÎÎÙÍÉ ×ÙÒÁÖÅ ÎÉÑÍÉ. ðÒÉ ×ÙÞÉÓÌÅÎÉÉ ÔÁËÏÊ ÆÕÎË ÉÉ ÏÈÒÁÎÎÙÅ ×ÙÒÁÖÅÎÉÑ ÒÏ×ÅÒÑÀÔÓÑ ÏÓÌÅÄÏ×ÁÔÅÌØÎÏ ÏÄÎÏ ÚÁ ÄÒÕÇÉÍ ÄÏ ÔÅÈ ÏÒ, ÏËÁ ÏÄ ÎÏ ÉÚ ÎÉÈ ÎÅ ÒÉÍÅÔ ÚÎÁÞÅÎÉÅ True. ÷ ÜÔÏÍ ÓÌÕÞÁÅ ×ÙÒÁÖÅÎÉÅ, ÓÔÏÑÝÅÅ ÓÒÁ×Á ÏÔ ÚÎÁËÁ = É ÂÕÄÅÔ Ñ×ÌÑÔØÓÑ ÚÎÁÞÅÎÉÅÍ ÆÕÎË ÉÉ. ðÏÓÌÅÄÎÅÅ × ÓÉÓËÅ ÏÈÒÁÎÎÏÅ ×ÙÒÁÖÅÎÉÅ ÍÏÖÎÏ ÚÁÍÅÎÉÔØ ÎÁ ×Å ÌÉÞÉÎÕ True ÉÌÉ ÎÁ ÓÅ ÉÁÌØÎÕÀ ËÏÎÓÔÁÎÔÕ otherwise (ÉÎÁÞÅ, × ÒÏÔÉ×ÎÏÍ ÓÌÕÞÁÅ), ÎÁÒÉÍÅÒ,
sign'' | | |
x x > 0 = 1 x == 0 = 0 otherwise = -1
ÅÅÒØ ÍÙ ÍÏÖÅÍ ÄÁÔØ ÂÏÌÅÅ ÏÌÎÏÅ ÏÉÓÁÎÉÅ ÆÏÒÍÙ ÏÒÅÄÅ ÌÅÎÉÑ ÆÕÎË ÉÉ. ðÒÉ ÏÒÅÄÅÌÅÎÉÉ ÆÕÎË ÉÉ ÓÌÅÄÕÅÔ ÕËÁÚÁÔØ
ÉÍÑ ÆÕÎË ÉÉ; ÉÍÅÎÁ ÎÕÌÑ ÉÌÉ ÂÏÌÅÅ ÁÒÁÍÅÔÒÏ×; ÚÎÁË = (ÒÁ×ÎÏ) É ×ÙÒÁÖÅÎÉÑ, ÉÌÉ ÏÄÎÏ ÉÌÉ ÎÅÓËÏÌØËÏ ÏÈÒÁÎÎÙÈ ×ÙÒÁÖÅÎÉÊ; ÒÉ ÎÅÏÂÈÏÄÉÍÏÓÔÉ ÓÌÏ×Ï where, ÚÁ ËÏÔÏÒÙÍ ÓÌÅÄÕÀÔ ÌÏ ËÁÌØÎÙÅ ÏÒÅÄÅÌÅÎÉÑ.
úÄÅÓØ ÏÄ ÏÈÒÁÎÎÙÍ ×ÙÒÁÖÅÎÉÅÍ ÏÎÉÍÁÅÔÓÑ ÚÎÁË |, ÌÏÇÉÞÅÓËÏÅ ×ÙÒÁÖÅÎÉÅ, ÚÎÁË = É ÎÅËÏÔÏÒÏÅ ×ÙÒÁÖÅÎÉÅ. ÅÍ ÎÅ ÍÅÎÅÅ É ÜÔÏ ÏÉÓÁÎÉÅ ÅÝÅ ÎÅ ÉÓÞÅÒÙ×ÁÅÔ ÍÎÏÇÏÏÂÒÁÚÉÑ ÆÏÒÍ ÒÅÄÓÔÁ×ÌÅÎÉÑ ÆÕÎË ÉÉ × ÑÚÙËÅ Haskell . . .
I õÒÁÖÎÅÎÉÅ II.3.3
ïÒÅÄÅÌÉÍ ÆÕÎË ÉÉ, ×ÙÞÉÓÌÑÀÝÉÅ ÍÁËÓÉÍÕÍ ÉÚ Ä×ÕÈ É ÉÚ ÔÒÅÈ ÅÌÙÈ ÞÉÓÅÌ. æÕÎË ÉÑ max, ÒÅÄÎÁÚÎÁÞÅÎÎÁÑ ÄÌÑ ÎÁÈÏÖÄÅÎÉÑ ÍÁË ÓÉÍÕÍÁ ÉÚ Ä×ÕÈ ÞÉÓÅÌ, ÕÖÅ ÏÒÅÄÅÌÅÎÁ × ÒÅÌÀÄÉÉ, ÏÜÔÏÍÕ ÎÁÛÕ ÆÕÎË ÉÀ ÎÁÚÏ×ÅÍ max':
max' :: Int -> Int -> Int max' x y | x >= y = x | otherwise = y -- íÁËÓÉÍÕÍ ÉÚ ÔÒÅÈ ÞÉÓÅÌ maxThree :: Int -> Int -> Int -> Int maxThree x y z
II. úÎÁËÏÍÓÔ×Ï Ó ÑÚÙËÏÍ Haskell
54
| x >= y && x >= z | y >= z | otherwise
= x = y = z
óÏÚÄÁÊÔÅ ÓËÒÉÔ, ÓÏÄÅÒÖÁÝÉÊ ÜÔÉ ÏÒÅÄÅÌÅÎÉÑ, ÚÁÇÒÕÚÉÔÅ ÅÇÏ É ÒÉÍÅÎÉÔÅ Ë ÒÁÚÌÉÞÎÙÍ ÞÉÓÌÁÍ. äÏÂÁ×ØÔÅ × ÎÅÇÏ ÁÌØÔÅÒÎÁÔÉ×ÎÏÅ ÏÒÅÄÅÌÅÎÉÅ ÆÕÎË ÉÉ, ÏÒÅÄÅÌÑÀÝÅÊ ÍÁËÓÉÍÕÍ ÉÚ Ä×ÕÈ ÞÉÓÅÌ:
max'' :: Int -> Int -> Int max'' x y = if x >= y then x else y ïÒÅÄÅÌÉÔÅ ÆÕÎË ÉÀ maxThree', ÔÁËÖÅ ×ÙÞÉÓÌÑÀÝÕÀ ÍÁËÓÉÍÕÍ ÉÚ ÔÒÅÈ ÞÉÓÅÌ, ÎÏ ÕÖÅ Ó ÏÍÏÝØÀ ÆÕÎË ÉÉ, ÎÁÈÏÄÑÝÅÊ ÍÁËÓÉÍÕÍ Ä×ÕÈ ÞÉÓÅÌ:
maxThree' :: Int -> Int -> Int -> Int maxThree' x y z = max (max x y) z üÔÏ ÏÒÅÄÅÌÅÎÉÅ ÍÏÖÅÔ ÂÙÔØ ÚÁÉÓÁÎÏ Ó ÉÓÏÌØÚÏ×ÁÎÉÅÍ ÏÅ ÒÁÔÏÒÎÏÊ ÆÏÒÍÙ ÆÕÎË ÉÉ max:
maxThree'' :: Int -> Int -> Int -> Int maxThree'' x y z = (x `max` y) `max` z ÷ËÌÀÞÉ× ÏÔÏÂÒÁÖÅÎÉÅ ÓÔÁÔÉÓÔÉÞÅÓËÏÊ ÉÎÆÏÒÍÁ ÉÉ × ÉÎÔÅÒÒÅ ÔÁÔÏÒÅ, ×ÙÑÓÎÉÔÅ, ËÁËÏÅ ÉÚ ÏÒÅÄÅÌÅÎÉÊ ÍÁËÓÉÍÕÍÁ ÔÒÅÈ ÞÉÓÅÌ ÂÏ ÌÅÅ ÜËÏÎÏÍÉÞÎÏ.
J
3.5. óÏÏÓÔÁ×ÌÅÎÉÅ Ó ÏÂÒÁÚ ÏÍ ðÁÒÁÍÅÔÒÙ (ÁÒÇÕÍÅÎÔÙ) ÆÕÎË ÉÉ × ÅÅ ÏÒÅÄÅÌÅÎÉÉ, ÏÄÏÂÎÙÅ ÅÒÅÍÅÎÎÙÍ x É y × ÏÒÅÄÅÌÅÎÉÉ f x y = x * y, ÎÁÚÙ×ÁÀÔÓÑ ÁÒÁÍÅÔÒÁÍÉ ÆÕÎË ÉÉ. ðÒÉ ÚÁÒÏÓÁÈ ÆÕÎË ÉÉ ÅÒÅÄÁ ÀÔÓÑ ÁÒÁÍÅÔÒÙ. îÁÒÉÍÅÒ, × ÆÕÎË ÉÏÎÁÌØÎÏÍ ÚÁ ÒÏÓÅ
ÍÁÌØÎÙÍÉ ÆÁËÔÉÞÅÓËÉÅ
H
ÆÏÒ
f 17 (1 + g 6) 17 ÆÁËÔÉÞÅÓËÉÊ ÁÒÁÍÅÔÒ, ÓÏÇÌÁÓÏ×ÁÎÎÙÊ Ó x, É (1 + g 6) ÆÁË ÔÉÞÅÓËÉÊ ÁÒÁÍÅÔÒ, ÓÏÇÌÁÓÏ×ÁÎÎÙÊ Ó y. ðÒÉ ÚÁÒÏÓÅ ÆÕÎË ÉÉ ÆÁË ÔÉÞÅÓËÉÅ ÁÒÁÍÅÔÒÙ ÚÁÍÅÎÉÌÉ ÓÏÂÏÊ ÆÏÒÍÁÌØÎÙÅ ÁÒÁÍÅÔÒÙ ÉÚ ÏÒÅÄÅÌÅÎÉÑ. ðÏÜÔÏÍÕ ÒÅÚÕÌØÔÁÔ ÚÁÒÏÓÁ 17 * (1+ g 6).
3. úÁÄÁÎÉÅ ÆÕÎË ÉÊ
55
×ÙÒÁÖÅÎÉÑ
éÔÁË, ÆÁËÔÉÞÅÓËÉÅ ÁÒÁÍÅÔÒÙ ÜÔÏ . æÏÒÍÁÌØ ÎÙÅ ÁÒÁÍÅÔÒÙ ÂÙÌÉ (ÉÍÅÎÁÍÉ) ÅÒÅÍÅÎÎÙÈ. ÷ ÂÏÌØ ÛÉÎÓÔ×Å ÑÚÙËÏ× ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÑ ÆÏÒÍÁÌØÎÙÅ ÁÒÁÍÅÔÒÙ ÄÏÌÖ ÎÙ ×ÓÅÇÄÁ ÂÙÔØ ÉÍÅÎÁÍÉ ÅÒÅÍÅÎÎÙÈ. ÷ ÑÚÙËÅ Haskell ÉÍÅÀÔÓÑ ÎÅÓËÏÌØËÏ ÄÒÕÇÉÈ ×ÏÚÍÏÖÎÏÓÔÅÊ: ÆÏÒÍÁÌØÎÙÊ ÁÒÁÍÅÔÒ ÍÏÖÅÔ ÔÁËÖÅ ÂÙÔØ .
ÎÁÚ×ÁÎÉÑÍÉ
ÏÂÒÁÚ ÏÍ
òÁÓÓÍÏÔÒÉÍ ÓÌÅÄÕÀÝÅÅ ÆÕÎË ÉÏÎÁÌØÎÏÅ ÏÒÅÄÅÌÅÎÉÅ, ÇÄÅ ÏÂÒÁ ÚÅ ÉÓÏÌØÚÕÅÔÓÑ ËÁË ÆÏÒÍÁÌØÎÙÊ ÁÒÁÍÅÔÒ:
f [1, x, y℄ = x+y
ÁËÁÑ ÆÕÎË ÉÑ ÒÉÍÅÎÑÅÔÓÑ ÌÉÛØ Ë ÓÉÓËÁÍ, ÓÏÄÅÒÖÁÝÉÍ ÔÒÉ ÜÌÅÍÅÎÔÁ, ÒÉÞÅÍ ÅÒ×ÙÊ ÜÌÅÍÅÎÔ ÄÏÌÖÅÎ ÂÙÔØ ÒÁ×ÅÎ 1. ÷ÔÏÒÏÊ É ÔÒÅÔÉÊ ÜÌÅÍÅÎÔ × ÎÅÍ ÍÏÇÕÔ ÂÙÔØ ÒÏÉÚ×ÏÌØÎÙÍÉ. îÏ ÜÔÁ ÆÕÎË ÉÑ ÎÅ ÏÒÅÄÅÌÅÎÁ ÄÌÑ ÂÏÌÅÅ ËÏÒÏÔËÉÈ ÉÌÉ ÄÌÉÎÎÙÈ ÓÉÓËÏ×, ÉÌÉ ÓÉÓËÏ×, Õ ËÏÔÏÒÙÈ ÅÒ×ÙÊ ÜÌÅÍÅÎÔ ÎÅ ÒÁ×ÅÎ 1. Ï, ÞÔÏ ÆÕÎË ÉÉ ÎÅ ÏÒÅÄÅÌÅÎÙ ÒÉ ÎÅËÏÔÏÒÙÈ ÆÁËÔÉÞÅÓËÉÈ ÁÒÁÍÅÔÒÁÈ, Ñ×ÌÑÅÔÓÑ ×ÏÌÎÅ ÎÏÒÍÁÌØÎÙÍ Ñ×ÌÅÎÉÅÍ. ÁË ÆÕÎË ÉÑ sqrt ÎÅ ÏÒÅÄÅÌÅÎÁ ÄÌÑ ÏÔÒÉ ÁÔÅÌØÎÙÈ ÞÉÓÅÌ, Á ÏÅÒÁÔÏÒ / (ÄÅÌÅÎÉÅ) ÎÅ ÏÒÅÄÅÌÅÎ ÒÉ ÎÕÌÅ×ÏÍ ×ÔÏÒÏÍ ÁÒÁÍÅÔÒÅ. íÏÖÎÏ ÏÒÅÄÅÌÑÔØ ÆÕÎË ÉÉ Ó ÒÁÚÌÉÞÎÙÍÉ ÏÂÒÁÚ ÁÍÉ × ËÁÞÅ ÓÔ×Å ÆÏÒÍÁÌØÎÏÇÏ ÁÒÁÍÅÔÒÁ, ÎÁÒÉÍÅÒ,
sum' sum' sum' sum'
[℄ = 0 [x℄ = x [x, y℄ = x+y [x, y, z℄ = x+y+z
üÔÁ ÆÕÎË ÉÑ ÍÏÖÅÔ ÒÉÍÅÎÑÔØÓÑ Ë ÓÉÓËÁÍ Ó 0, 1, 2 ÉÌÉ 3 ÜÌÅÍÅÎ ÔÁÍÉ (× ÄÁÌØÎÅÊÛÅÍ ÜÔÁ ÆÕÎË ÉÑ ÂÕÄÅÔ ÏÒÅÄÅÌÅÎÁ ÎÁ ÓÉÓËÁÈ ÒÏ ÉÚ×ÏÌØÎÏÊ ÄÌÉÎÎÙ). ðÒÉ ×ÙÚÏ×Å ÆÕÎË ÉÉ ÉÎÔÅÒÒÅÔÁÔÏÒ ÆÁËÔÉÞÅÓËÉÊ Ó ÆÏÒÍÁÌØÎÙÍ ÁÒÁÍÅÔÒÏÍ; ÎÁÒÉÍÅÒ ÚÁÒÏÓ sum' [3, 4℄ ÓÏÏÔ×ÅÔÓÔ×ÕÅÔ ÔÒÅÔØÅÊ ÓÔÒÏËÅ ÏÒÅÄÅÌÅÎÉÑ. ÒÏÊËÁ ÂÕÄÅÔ ÓÏÏÔ×ÅÔÓÔ×Ï×ÁÔØ x × ÏÒÅÄÅÌÅÎÉÉ, Á 4 y.
×ÌÑÅÔ
ÓÏÏÓÔÁ
áÎÁÌÏÇÉÞÎÏ ÔÏÍÕ, ËÁË × ÏÒÅÄÅÌÅÎÉÉ ÆÕÎË ÉÉ ÎÅ×ÏÚÍÏÖÎÏ Ï Ñ×ÌÅÎÉÅ ÏÄÎÏÇÏ É ÔÏÇÏ ÖÅ ÁÒÁÍÅÔÒÁ Ä×ÁÖÄÙ, × ÏÂÒÁÚ ÁÈ ÎÅ ÄÏÕÓ ËÁÅÔÓÑ ÉÓÏÌØÚÏ×ÁÎÉÅ Ï×ÔÏÒÑÀÝÉÈÓÑ ÉÍÅÎ. óÌÅÄÕÀÝÅÅ ÏÒÅÄÅÌÅ ÎÉÅ ÆÕÎË ÉÉ ÎÅÒÁÂÏÔÏÓÏÓÏÂÎÏ, ÔÁË ËÁË ÉÍÑ ÅÒÅÍÅÎÎÏÊ x ×ÓÔÒÅ ÞÁÅÔÓÑ Ä×ÁÖÄÙ:
member x [℄ = False member x (x:ys) = True -- ïÛÉÂËÁ: Ä×ÁÖÄÙ ÉÓÏÌØÚÕÅÔÓÑ x member x (y:ys) = member x ys
II. úÎÁËÏÍÓÔ×Ï Ó ÑÚÙËÏÍ Haskell
56
÷ÏÔ ÒÉÍÅÒÙ ËÏÎÓÔÒÕË ÉÊ, ÄÏÕÓÔÉÍÙÈ × ËÁÞÅÓÔ×Å ÏÂÒÁÚ Ï× ÓÏÏÔ×ÅÔÓÔ×ÉÑ:
ÞÉÓÌÁ (ÎÁÒÉÍÅÒ, 3); ËÏÎÓÔÁÎÔÙ True É False; ÎÁÚ×ÁÎÉÑ ÁÒÁÍÅÔÒÏ× (ÉÍÅÎÁ) (ÎÁÒÉÍÅÒ, x); ÓÉÓËÉ, × ËÏÔÏÒÙÈ ÜÌÅÍÅÎÔÙ Ñ×ÌÑÀÔÓÑ ÔÁËÖÅ ÏÂÒÁÚ ÁÍÉ (ÎÁ
ÒÉÍÅÒ, [1, x, y℄); ÏÅÒÁÔÏÒ : Ó ÏÂÒÁÚ ÁÍÉ ÓÌÅ×Á É ÓÒÁ×Á (ÎÁÒÉÍÅÒ a:b); ÏÅÒÁÔÏÒ +, ÓÌÅ×Á ÏÔ ËÏÔÏÒÏÇÏ ÒÁÓÏÌÏÖÅÎ ÏÂÒÁÚÅ , Á ÓÒÁ×Á ÎÁÔÕÒÁÌØÎÏÅ ÞÉÓÌÏ (ÎÁÒÉÍÅÒ, n+1).
ïÔÍÅÔÉÍ, ÞÔÏ × ÏÂÒÁÚ ÁÈ, ÓÏÄÅÒÖÁÝÉÈ ÏÅÒÁÔÏÒ +, ÅÒÅÍÅÎÎÙÅ ×ÓÅ ÇÄÁ ÓÞÉÔÁÀÔÓÑ ÎÁÔÕÒÁÌØÎÙÍÉ ÞÉÓÌÁÍÉ.
I õÒÁÖÎÅÎÉÅ II.3.4
H
óÏÚÄÁÊÔÅ ÓËÒÉÔ, × ËÏÔÏÒÙÊ ÏÍÅÓÔÉÔÅ ÓÌÅÄÕÀÝÉÊ ËÏÄ
qq :: Int -> Int qq (x + 4) = x - 3 úÁÇÒÕÚÉÔÅ ÓËÒÉÔ × ÉÎÔÅÒÒÅÔÁÔÏÒ É ×ÙÚÏ×ÉÔÅ ÆÕÎË ÉÀ qq Ó ÎÅÓËÏÌØËÉÍÉ ÆÁËÔÉÞÅÓËÉÍÉ ÁÒÁÍÅÔÒÁÍÉ (ÓËÏÂËÉ × ÏÓÌÅÄÎÅÍ ×Ù ÚÏ×Å ÏÂÑÚÁÔÅÌØÎÙ!):
---> qq 34 27 ---> qq (34+4) 31 ðÒÉ×ÅÄÉÔÅ ÒÉÍÅÒ ×ÙÚÏ×Á ÆÕÎË ÉÉ, × ÒÅÚÕÌØÔÁÔÅ ËÏÔÏÒÏÇÏ ÂÕÄÅÔ ×Ù×ÅÄÅÎÏ ÞÉÓÌÏ 100.
J
ó ÏÍÏÝØÀ ÏÂÒÁÚ Ï× ÓÏÏÔ×ÅÔÓÔ×ÉÑ × ÑÚÙËÅ Haskell ÏÒÅÄÅÌÅÎÏ ÍÎÏÖÅÓÔ×Ï ÆÕÎË ÉÊ. îÁÒÉÍÅÒ, ÏÅÒÁÔÏÒ ËÏÎßÀÎË ÉÉ && × ÆÁÊÌÅ Prelude.hs ÏÒÅÄÅÌÅÎ ÔÁË:
False False True True
&& && && &&
False True False True
= = = =
False False False True
íÙ ÕÖÅ ÏÚÎÁËÏÍÉÌÉÓØ Ó ×ÓÔÒÏÅÎÎÙÍ ÏÅÒÁÔÏÒÏÍ :, ËÏÔÏÒÙÊ ÉÓÏÌØÚÕÅÔÓÑ ÒÉ ÏÓÔÒÏÅÎÉÉ ÓÉÓËÏ×. ÷ÙÒÁÖÅÎÉÅ x:y, ÏÚÎÁÞÁÀ ÝÅÅ ¾ÜÌÅÍÅÎÔ x, ÒÁÚÍÅÝÅÎÎÙÊ ÅÒÅÄ ÓÉÓËÏÍ y¿, ÉÓÏÌØÚÕÅÔÓÑ × ËÁÞÅÓÔ×Å ÏÂÒÁÚËÁ ÒÉ ÚÁÄÁÎÉÉ ÆÕÎË ÉÊ ÄÌÑ ÒÁÂÏÔÙ ÓÏ ÓÉÓËÁÍÉ.
3. úÁÄÁÎÉÅ ÆÕÎË ÉÊ
57
ðÒÉ ÉÓÏÌØÚÏ×ÁÎÉÉ ÏÅÒÁÔÏÒÁ : × ÏÂÒÁÚ Å, ÅÒ×ÙÊ ÜÌÅÍÅÎÔ ÓÉÓËÁ ÄÏÌÖÅÎ ÒÁÚÍÅÝÁÔØÓÑ ÅÒ×ÙÍ. ó ÉÓÏÌØÚÏ×ÁÎÉÅÍ ÔÁËÉÈ ÏÂÒÁÚ Ï× ÍÏÖÎÏ ÏÒÅÄÅÌÉÔØ Ä×Å ÏÞÅÎØ ÏÌÅÚÎÙÅ ÓÔÁÎÄÁÒÔÎÙÅ ÆÕÎË ÉÉ:
head (x:y) = x tail (x:y) = y
æÕÎË ÉÑ head ×ÏÚ×ÒÁÝÁÅÔ ÅÒ×ÙÊ ÜÌÅÍÅÎÔ ÓÉÓËÁ (ÇÏÌÏ×Õ, head); Á tail ×ÓÅ ËÒÏÍÅ ÅÒ×ÏÇÏ ÜÌÅÍÅÎÔÁ (È×ÏÓÔ, tail). üÔÉ ÆÕÎË ÉÉ ÍÏÇÕÔ ÒÉÍÅÎÑÔØÓÑ Ë ÌÀÂÏÍÕ ÓÉÓËÕ ÚÁ ÉÓËÌÀÞÅÎÉÅÍ ÕÓÔÏÇÏ (ÓÉ ÓÏË ÂÅÚ ÜÌÅÍÅÎÔÏ×): Õ ÕÓÔÏÇÏ ÓÉÓËÁ ÎÅÔ ÎÉ ÅÒ×ÏÇÏ ÜÌÅÍÅÎÔÁ, ÎÉ È×ÏÓÔÁ. ÷ ÎÅËÏÔÏÒÙÈ ÓÌÕÞÁÑÈ ÕÄÏÂÎÏ ÉÓÏÌØÚÏ×ÁÔØ ÄÒÕÇÕÀ ÆÏÒÍÕ ÏÂÒÁÚ Ï×, ÔÁË ÎÁÚÙ×ÁÅÍÙÅ ¾as-ÏÂÒÁÚ Ù¿. ïÎÁ ÒÉÍÅÎÑÅÔÓÑ, ÅÓÌÉ ÉÍÑ ÏÂÒÁÚ Á ÒÅÄÏÌÁÇÁÅÔÓÑ ÉÓÏÌØÚÏ×ÁÔØ × ÒÁ×ÏÊ ÞÁÓÔÉ ÕÒÁ× ÎÅÎÉÑ, ÚÁÄÁÀÝÅÇÏ ÆÕÎË ÉÀ. îÁÒÉÍÅÒ, ÆÕÎË ÉÑ, ÄÕÂÌÉÒÕÀÝÁÑ ÅÒ×ÙÊ ÜÌÅÍÅÎÔ ÓÉÓËÁ, ÍÏÖÅÔ ÂÙÔØ ÚÁÉÓÁÎÁ ÔÁË:
f (x:xs) = x:x:xs îÁÏÍÎÉÍ, ÞÔÏ ÏÅÒÁ ÉÑ : ÒÁ×ÏÁÓÓÏ ÉÁÔÉ×ÎÁ. ïÂÒÁÔÉÔÅ ×ÎÉÍÁ ÎÉÅ, ÞÔÏ ×ÙÒÁÖÅÎÉÅ x:xs ×ÈÏÄÉÔ × ÜÔÏ ÏÒÅÄÅÌÅÎÉÅ Ä×ÁÖÄÙ: ËÁË ÏÂÒÁÚÅ ( ) × ÌÅ×ÏÊ ÓÔÏÒÏÎÅ ÏÒÅÄÅÌÅÎÉÑ É × ×ÙÒÁÖÅÎÉÉ ÓÒÁ×Á. äÌÑ ÕÌÕÞÛÅÎÉÑ ÞÉÔÁÂÅÌØÎÏÓÔÉ ÒÏÇÒÁÍÍÙ ÈÏÔÅÌÏÓØ ÂÙ ×ËÌÀÞÁÔØ x:xs × ÏÄÏÂÎÏÅ ÏÒÅÄÅÌÅÎÉÅ ÌÉÛØ ÏÄÉÎ ÒÁÚ. üÔÉÍ Å ÌÑÍ É ÓÌÕÖÉÔ ÒÉÍÅÎÅÎÉÅ × ÓÌÅÄÕÀÝÅÊ ÆÏÒÍÅ:
as-pattern
as-ÏÂÒÁÚ Ï×
f s(x:xs) = x:s ÷ ÄÒÕÇÉÈ, ÄÏ×ÏÌØÎÏ ÞÁÓÔÏ ×ÓÔÒÅÞÁÀÝÉÈÓÑ ÓÉÔÕÁ ÉÑÈ, × ÒÁ×ÏÊ ÓÔÏÒÏÎÅ ÏÒÅÄÅÌÅÎÉÑ ÆÕÎË ÉÉ ÉÓÏÌØÚÕÀÔÓÑ ÌÉÛØ ÎÅËÏÔÏÒÙÅ ÞÁ ÓÔÉ ÏÂÒÁÚ Á ÓÏÏÔ×ÅÔÓÔ×ÉÑ. ÁË, × ÒÁÓÓÍÏÔÒÅÎÎÙÈ ×ÙÛÅ ÏÒÅÄÅÌÅ ÎÉÑÈ ÆÕÎË ÉÊ head É tail ÔÏÌØËÏ ÏÄÎÁ ÉÚ Ä×ÕÈ ÞÁÓÔÅÊ ÏÂÒÁÚ Á ÕÞÁÓÔ×ÕÅÔ × ×ÙÞÉÓÌÅÎÉÑÈ. ÷ ÏÄÏÂÎÙÈ ÓÌÕÞÁÑÈ ÄÌÑ ÏÂÏÚÎÁÞÅÎÉÑ ÔÅÈ ÞÁÓÔÅÊ ÏÂÒÁÚ Á, ËÏÔÏÒÙÅ ÎÅ ÉÓÏÌØÚÕÀÔÓÑ, ÒÉÍÅÎÑÅÔÓÑ ÓÉÍ ×ÏÌ _ (ÏÄÞÅÒËÉ×ÁÎÉÅ), ÎÁÚÙ×ÁÅÍÙÊ :
ÁÎÏÎÉÍÎÏÊ ÅÒÅÍÅÎÎÏÊ
head (x:_) = x tail (_:y) = y ÷ ÌÅ×ÏÓÔÏÒÏÎÎÅÊ ÞÁÓÔÉ ÏÒÅÄÅÌÅÎÉÑ ÏÄÏÂÎÙÅ ÏÂÒÁÚ Ù ÍÏÇÕÔ ×ÓÔÒÅÞÁÔØÓÑ ÎÅÓËÏÌØËÏ ÒÁÚ. ëÁÖÄÙÊ ÉÚ ÎÉÈ ÏÂÒÁÂÁÔÙ×ÁÅÔÓÑ ÎÅÚÁ ×ÉÓÉÍÏ, ÏÜÔÏÍÕ, × ÒÏÔÉ×ÏÏÌÏÖÎÏÓÔØ ÆÏÒÍÁÌØÎÙÍ ÁÒÁÍÅÔÒÁÍ, ÏÎÉ ÎÉËÁË ÎÅ Ó×ÑÚÁÎÙ ÍÅÖÄÕ ÓÏÂÏÊ.
58
II. úÎÁËÏÍÓÔ×Ï Ó ÑÚÙËÏÍ Haskell
I õÒÁÖÎÅÎÉÅ II.3.5
ïÒÅÄÅÌÉÍ ÆÕÎË ÉÀ middle, ×ÏÚ×ÒÁÝÁÀÝÕÀ ÓÒÅÄÎÉÊ ÜÌÅÍÅÎÔ ËÏÒÔÅÖÁ ÉÚ ÔÒÅÈ ×ÅÌÉÞÉÎ. ÁË ËÁË ÎÁÓ ÎÅ ÉÎÔÅÒÅÓÕÀÔ ÚÎÁÞÅÎÉÑ ÅÒ×ÏÇÏ É ÏÓÌÅÄÎÅÇÏ ÜÌÅÍÅÎÔÏ×, ÔÏ ÍÙ É ÎÅ ××ÏÄÉÍ ÉÈ ÉÍÅÎÁ:
middle (_,x,_) = x ðÒÉÍÅÎÉÔÅ ÜÔÕ ÆÕÎË ÉÀ Ë ÒÁÚÌÉÞÎÙÍ ÄÁÎÎÙÍ.
J
ïÈÒÁÎÎÙÅ ×ÙÒÁÖÅÎÉÑ ÍÏÇÕÔ ÏÔÎÏÓÉÔØÓÑ Ë ÌÀÂÙÍ ÅÒÅÍÅÎÎÙÍ × ÏÂÒÁÚ ÁÈ ÓÏÏÔ×ÅÔÓÔ×ÉÑ. åÓÌÉ ÎÅÔ ÏÈÒÁÎÎÏÇÏ ×ÙÒÁÖÅÎÉÑ, ÓÏÏÔ×ÅÔ ÓÔ×ÕÀÝÅÇÏ ÉÓÔÉÎÎÏÍÕ ÚÎÁÞÅÎÉÀ, ÔÏ ÏÉÓË ÏÂÒÁÚ Á ÓÏÏÔ×ÅÔÓÔ×ÉÑ ×ÏÚÏÂÎÏ×ÌÑÅÔÓÑ ÓÏ ÓÌÅÄÕÀÝÅÇÏ ÕÒÁ×ÎÅÎÉÑ.
I õÒÁÖÎÅÎÉÅ II.3.6
H
ïÒÅÄÅÌÉÍ ÆÕÎË ÉÀ, ÓÏÞÅÔÁÀÝÕÀ × ÓÅÂÅ ÏÂÒÁÚ Ù ÓÏÏÔ×ÅÔÓÔ×ÉÑ É ÏÈÒÁÎÎÙÅ ×ÙÒÁÖÅÎÉÑ. æÕÎË ÉÑ isOrder ÒÏ×ÅÒÑÅÔ, ÕÏÒÑÄÏÞÅÎÙ ÌÉ ÅÒ×ÙÅ Ä×Á ÜÌÅÍÅÎÔÁ ÓÉÓËÁ ÞÉÓÅÌ:
isOrder :: [Int℄ -> Bool isOrder (x1:x2:xs) | x1 <= x2 = True isOrder _ = False ðÒÉÍÅÎÉÔÅ ÆÕÎË ÉÀ isOrder Ë ÒÁÚÌÉÞÎÙÍ ÓÉÓËÁÍ:
---> isOrder [1,2,3℄ True ---> isOrder [2,1℄ False
J
3.6. ïÒÅÄÅÌÅÎÉÅ ÒÅËÕÒÓÉÅÊ ÉÌÉ ÉÎÄÕË ÉÑ ëÁË ÕÖÅ ÏÔÍÅÞÁÌÏÓØ, × ÏÒÅÄÅÌÅÎÉÉ ÆÕÎË ÉÉ ÍÏÖÎÏ ÉÓÏÌØ ÚÏ×ÁÔØ ÒÁÚÌÉÞÎÙÅ ÆÕÎË ÉÉ, ËÁË ÓÔÁÎÄÁÒÔÎÙÅ, ÔÁË É ÒÁÎÅÅ ÏÒÅÄÅ ÌÅÎÎÙÅ ÒÏÇÒÁÍÍÉÓÔÏÍ. ëÒÏÍÅ ÜÔÏÇÏ, ÆÕÎË ÉÑ ÍÏÖÅÔ ×ÙÒÁÖÁÔØÓÑ ÞÅÒÅÚ ÓÁÍÕ ÓÅÂÑ! ÁËÏÅ ÏÒÅÄÅÌÅÎÉÅ ÎÁÚÙ×ÁÅÔÓÑ (ÓÌÏ×Ï ¾ÒÅËÕÒÓÉÑ¿ ÂÕË×ÁÌØÎÏ ÅÒÅ×ÏÄÉÔÓÑ ËÁË ¾ÒÉÈÏÄÑ ÝÉÊ ÓÎÏ×Á¿; ÉÍÑ ÆÕÎË ÉÉ ÆÉÇÕÒÉÒÕÅÔ × ÅÅ ÓÏÂÓÔ×ÅÎÎÏÍ ÏÒÅÄÅÌÅ ÎÉÉ). ðÒÏÓÔÅÊÛÉÊ ÒÉÍÅÒ ÒÅËÕÒÓÉ×ÎÏÊ ÆÕÎË ÉÉ ×ÙÇÌÑÄÉÔ ÔÁË:
ÄÅÌÅÎÉÅÍ
f x = f x
ÒÅËÕÒÓÉ×ÎÙÍ ÏÒÅ
3. úÁÄÁÎÉÅ ÆÕÎË ÉÊ
59
úÄÅÓØ ÉÍÑ ÏÒÅÄÅÌÑÅÍÏÊ ÆÕÎË ÉÉ (f) ×ÓÔÒÅÞÁÅÔÓÑ × ×ÙÒÁÖÅÎÉÉ, ÒÁÓÏÌÏÖÅÎÎÏÍ ÓÒÁ×Á ÏÔ ÚÎÁËÁ ÒÁ×ÅÎÓÔ×Á. ïÄÎÁËÏ ÏÔÍÅÔÉÍ, ÞÔÏ ÔÁËÏÅ ÏÒÅÄÅÌÅÎÉÅ ÄÏ×ÏÌØÎÏ ÂÅÓÓÍÙÓÌÅÎÎÏ: ÞÔÏÂÙ ×ÙÞÉÓÌÉÔØ ÚÎÁ ÞÅÎÉÅ f 3, ÓÌÅÄÕÅÔ ×ÙÞÉÓÌÉÔØ ÚÎÁÞÅÎÉÅ f 3, ÄÌÑ ×ÙÞÉÓÌÅÎÉÑ ËÏÔÏ ÒÏÇÏ ÔÁËÖÅ ÓÌÅÄÕÅÔ ×ÙÞÉÓÌÉÔØ f 3, É ÔÁË ÄÁÌÅÅ ÄÏ ÂÅÓËÏÎÅÞÎÏÓÔÉ. òÅËÕÒÓÉ×ÎÏ ÏÒÅÄÅÌÅÎÎÙÅ ÆÕÎË ÉÉ ÂÕÄÕÔ ÏÌÅÚÎÙ ÌÉÛØ ÒÉ ×ÙÏÌÎÅÎÉÉ ÓÌÅÄÕÀÝÉÈ Ä×ÕÈ ÕÓÌÏ×ÉÊ:
ÁÒÁÍÅÔÒ ÒÅËÕÒÓÉ×ÎÏÇÏ ×ÙÚÏ×Á ÄÏÌÖÅÎ ÂÙÔØ ÂÏÌÅÅ ÒÏÓÔ
(ÎÁÒÉÍÅÒ, ÞÉÓÌÅÎÎÏ ÍÅÎØÛÉÊ, ÉÌÉ ÂÏÌÅÅ ËÏÒÏÔËÉÊ ÓÉÓÏË), ÞÅÍ ÁÒÁÍÅÔÒ ÏÒÅÄÅÌÑÅÍÏÊ ÆÕÎË ÉÉ; ÉÍÅÅÔÓÑ ÎÅÒÅËÕÒÓÉ×ÎÏÅ ÏÒÅÄÅÌÅÎÉÅ ÄÌÑ ÏÓÎÏ×ÎÏÇÏ (ÂÁÚÏ×ÏÇÏ) ÓÌÕÞÁÑ. èÏÒÏÛÉÍ ÒÉÍÅÒÏÍ ÒÅËÕÒÓÉ×ÎÏÊ ÆÕÎË ÉÉ Ñ×ÌÑÅÔÓÑ ÓÌÅÄÕÀ ÝÅÅ ÏÒÅÄÅÌÅÎÉÅ ÆÁËÔÏÒÉÁÌÁ:
fa t :: Integer -> Integer fa t n | n == 0 = 1 | n > 0 = n * fa t (n-1) õÓÌÏ×ÉÅ n == 0 Ñ×ÌÑÅÔÓÑ ÂÁÚÏ×ÙÍ; × ÜÔÏÍ ÓÌÕÞÁÅ ÒÅÚÕÌØÔÁÔ ÍÏÖÅÔ ÂÙÔØ ÏÒÅÄÅÌÅÎ ÎÅÏÓÒÅÄÓÔ×ÅÎÎÏ (Ô. Å. ÂÅÚ ÒÅËÕÒÓÉ×ÎÏÇÏ ×ÙÚÏ×Á). ïÒÅÄÅÌÅÎÉÅ ÄÌÑ ÓÌÕÞÁÑ n > 0 ÓÏÄÅÒÖÉÔ ÒÅËÕÒÓÉ×ÎÏÅ ÏÂÒÁÝÅÎÉÅ, Á ÉÍÅÎÎÏ ×ÙÚÏ× fa t (n-1). ðÁÒÁÍÅÔÒ ÜÔÏÇÏ ×ÙÚÏ×Á (n-1), ËÁË É ÔÒÅÂÕÅÔÓÑ, ÍÅÎØÛÅ ÞÅÍ n. äÒÕÇÉÍ ÓÏÓÏÂÏÍ ÏÔÌÉÞÉÔØ ÜÔÉ Ä×Á ÓÌÕÞÁÑ (ÂÁÚÏ×ÙÊ É ÒÅËÕÒ ÓÉ×ÎÙÊ) Ñ×ÌÑÅÔÓÑ ÓÏÏÓÔÁ×ÌÅÎÉÅ ÒÉ ÏÍÏÝÉ ÏÂÒÁÚ Ï×:
fa t' 0 fa t' (n+1)
= 1 = (n+1) * fa t' n
÷ ÜÔÏÍ ÒÉÍÅÒÅ ÁÒÁÍÅÔÒ ÒÅËÕÒÓÉ×ÎÏÇÏ ×ÙÚÏ×Á (n) ÍÅÎØÛÅ, ÞÅÍ ÁÒÁÍÅÔÒ ÏÒÅÄÅÌÑÅÍÏÊ ÆÕÎË ÉÉ (n+1). éÓÏÌØÚÏ×ÁÎÉÅ ÏÂÒÁÚ Ï× ÓÏÏÔ×ÅÔÓÔ×ÉÑ ÅÒÅËÌÉËÁÅÔÓÑ Ó ÍÁÔÅÍÁ ÔÉÞÅÓËÏÊ ÒÁËÔÉËÏÊ ¾ÏÒÅÄÅÌÅÎÉÑ Ï ÉÎÄÕË ÉÉ¿. åÓÌÉ ÒÅËÕÒÓÉ× ÎÏÅ ÏÒÅÄÅÌÅÎÉÅ ÒÁÚÄÅÌÑÅÔÓÑ ÎÁ ÎÅÓËÏÌØËÏ ÒÁÚÌÉÞÎÙÈ ÓÌÕÞÁÅ× ÓÏ ÏÓÔÁ×ÌÅÎÉÑ Ó ÏÂÒÁÚ ÁÍÉ (×ÍÅÓÔÏ ÉÓÏÌØÚÏ×ÁÎÉÑ ÏÈÒÁÎÎÙÈ ÌÏÇÉ ÞÅÓËÉÈ ×ÙÒÁÖÅÎÉÊ), ÔÏ ÅÇÏ ÎÁÚÙ×ÁÀÔ .
ÆÕÎË ÉÉ
I õÒÁÖÎÅÎÉÅ II.3.7
ÉÎÄÕËÔÉ×ÎÙÍ ÏÒÅÄÅÌÅÎÉÅÍ
äÁÄÉÍ ÒÅËÕÒÓÉ×ÎÏÅ ÏÒÅÄÅÌÅÎÉÅ ÆÕÎË ÉÉ power2, Ñ×ÌÑÀÝÅÊÓÑ ÁÎÁÌÏÇÏÍ ÍÁÔÅÍÁÔÉÞÅÓËÏÊ ÆÕÎË ÉÉ 2n :
II. úÎÁËÏÍÓÔ×Ï Ó ÑÚÙËÏÍ Haskell
60
power2 :: Int -> Int power2 n | n==0 = 1 | n>0 = 2 * power2 (n-1)
J
æÕÎË ÉÉ ÎÁ ÓÉÓËÁÈ ÔÁËÖÅ ÍÏÇÕÔ ÂÙÔØ ÚÁÄÁÎÙ ÒÅËÕÒÓÉ×ÎÏ. óÉÓÏË ÓÔÁÎÏ×ÉÔÓÑ ¾ÍÅÎØÛÅ¿ ÞÅÍ ÄÒÕÇÏÊ, ÅÓÌÉ ÏÎ ÓÏÄÅÒÖÉÔ ÍÅÎØ ÛÅÅ ËÏÌÉÞÅÓÔ×Ï ÜÌÅÍÅÎÔÏ× (ÅÓÌÉ ÏÎ ËÏÒÏÞÅ). éÚÍÅÎÉÍ ÆÕÎË ÉÀ sum' ÉÚ ÒÅÄÙÄÕÝÅÇÏ ÒÁÚÄÅÌÁ ÔÁË, ÞÔÏÂÙ ÏÎÁ ÏÚ×ÏÌÑÌÁ ÓËÌÁÄÙ ×ÁÔØ ÜÌÅÍÅÎÔÙ ÓÉÓËÁ ÒÏÉÚ×ÏÌØÎÏÊ ÄÌÉÎÙ. üÔÏÇÏ ÍÏÖÎÏ ÄÏÂÉÔØÓÑ ÒÁÚÌÉÞÎÙÍÉ ÓÏÓÏÂÁÍÉ. ïÂÙÞÎÕÀ ÒÅËÕÒÓÉ×ÎÕÀ ÆÕÎË ÉÀ (ÉÓÏÌØ ÚÕÀÝÕÀ ÏÈÒÁÎÎÙÅ ×ÙÒÁÖÅÎÉÑ) ÍÏÖÎÏ ÏÒÅÄÅÌÉÔØ ÔÁË:
sum' list | list == [℄ | otherwize
= 0 = head list + sum' (tail list)
éÎÄÕËÔÉ×ÎÁÑ ÆÏÒÍÁ (ÓÏÄÅÒÖÁÝÁÑ ÓÏÏÓÔÁ×ÌÅÎÉÅ Ó ÏÂÒÁÚ ÁÍÉ) ÔÁËÏÊ ÆÕÎË ÉÉ ÍÏÖÅÔ ×ÙÇÌÑÄÅÔØ ÓÌÅÄÕÀÝÉÍ ÏÂÒÁÚÏÍ:
sum' [℄ = 0 sum' (hd:tl) = hd + sum' tl ÷ ÜÔÏÍ ÏÒÅÄÅÌÅÎÉÉ ÅÒÅÍÅÎÎÁÑ hd (ÏÔ ÓÌÏ×Á head) ÓÏÏÔ×ÅÔÓÔ×ÕÅÔ ÇÏÌÏ×Å ÓÉÓËÁ, Á tl (ÏÔ tail) È×ÏÓÔÏ×ÏÍÕ ÓÉÓËÕ. ðÒÉ ×ÙÂÏÒÅ ÉÍÅÎ ÅÒÅÍÅÎÎÙÈ, ×ÈÏÄÑÝÉÈ × ÏÂÒÁÚ Ù, ÍÙ ÒÕËÏ×ÏÄÓÔ×Ï×ÁÌÉÓØ ÒÉÎ É ÏÍ ¾ÇÏ×ÏÒÑÝÉÈ ÉÍÅο, ÏÚ×ÏÌÑÀÝÉÍ ÏÌÎÅÅ ÏÔÒÁÚÉÔØ ÓÍÙÓÌ ÏÒÅ ÄÅÌÅÎÉÑ. ÷ ÂÏÌØÛÉÎÓÔ×Å ÓÌÕÞÁÅ× ÏÒÅÄÅÌÅÎÉÅ, ÉÓÏÌØÚÕÀÝÉÅ ÏÂÒÁÚ Ù ÓÏÏÔ×ÅÔÓÔ×ÉÑ, ÏÎÑÔÎÅÅ É ÑÓÎÅÅ, ÔÁË ËÁË ËÁÖÄÏÅ ÒÁ×ÉÌÏ, ÏÒÅÄÅ ÌÑÅÍÏÅ ÏÔÄÅÌØÎÙÍ ÏÂÒÁÚ ÏÍ, ÉÓÏÌØÚÕÅÔ ÜÌÅÍÅÎÔÙ ÏÂÒÁÚ Á ÓÒÁÚÕ ÏÓÌÅ ÅÇÏ ÕËÁÚÁÎÉÑ.
I õÒÁÖÎÅÎÉÅ II.3.8
äÁ×ÁÊÔÅ ÏÒÅÄÅÌÉÍ ÆÕÎË ÉÀ length', ÁÎÁÌÏÇÉÞÎÕÀ ÓÔÁÎÄÁÒÔÎÏÊ ÆÕÎË ÉÉ ÏÒÅÄÅÌÅÎÉÑ ÄÌÉÎÙ ÓÉÓËÁ. äÌÉÎÁ ÕÓÔÏÇÏ ÓÉÓËÁ, ÅÓÔÅ ÓÔ×ÅÎÎÏ, ÒÁ×ÎÁ 0, Á ÄÌÉÎÁ ÌÀÂÏÇÏ ÓÉÓËÁ, Õ ËÏÔÏÒÏÇÏ ÅÓÔØ È×ÏÓÔ (Ô. Å. ÎÅÕÓÔÏÇÏ) ÎÁ ÅÄÉÎÉ Õ ÂÏÌØÛÅ ÄÌÉÎÙ È×ÏÓÔÏ×ÏÇÏ ÓÉÓËÁ:
length' [℄ = 0 length' (hd:tl) = 1 + length' tl ïÔÍÅÔÉ×, ÞÔÏ × ×ÙÒÁÖÅÎÉÉ, ÓÔÏÑÝÅÍ ÓÒÁ×Á ÏÔ ÚÎÁËÁ =, ÎÅ ÉÓÏÌØ ÚÕÅÔÓÑ ÅÒÅÍÅÎÎÁÑ hd (ÏÎÁ ÌÉÛØ ÕËÁÚÙ×ÁÅÔ ÎÁ ÔÏ, ÞÔÏ Õ ÓÉÓËÁ
3. úÁÄÁÎÉÅ ÆÕÎË ÉÊ
61
ÅÓÔØ ÇÏÌÏ×ÎÏÊ ÜÌÅÍÅÎÔ), ÚÁÍÅÎÉÍ ÅÅ ÎÁ ÁÎÏÎÉÍÎÕÀ ÅÒÅÍÅÎÎÕÀ. ó ÅÅ ÉÓÏÌØÚÏ×ÁÎÉÅÍ ÆÕÎË ÉÑ ÒÉÍÅÒ ×ÉÄ:
length' [℄ = 0 length' (_:tl) = 1 + length' tl
J
3.7. óÎÏ×Á Ï Ä×ÕÍÅÒÎÏÍ ÓÉÎÔÁËÓÉÓÅ éÓÏÌØÚÏ×ÁÎÉÅ ÄÏÏÌÎÉÔÅÌØÎÙÈ ÒÏÂÅÌÏ× É ÕÓÔÙÈ ÓÔÒÏË Ï Ú×ÏÌÑÅÔ ÏÂÙÞÎÏ ÓÄÅÌÁÔØ ÔÅËÓÔ ÒÏÇÒÁÍÍÙ, ÎÁÉÓÁÎÎÏÊ ÎÁ ÌÀÂÏÍ ÑÚÙËÅ, ÂÏÌÅÅ ÏÎÑÔÎÙÍ ÄÌÑ ÞÔÅÎÉÑ É ÁÎÁÌÉÚÁ. ðÏÞÔÉ × ÌÀÂÏÅ ÍÅ ÓÔÏ ÒÏÇÒÁÍÍÙ, ÎÁÉÓÁÎÎÏÊ ÎÁ ÑÚÙËÅ Haskell, ÍÏÖÅÔ ÂÙÔØ ÄÏÂÁ ×ÌÅÎÏ ÒÏÉÚ×ÏÌØÎÏÅ ÞÉÓÌÏ ÒÏÂÅÌÏ×. ÁË, × ÏÓÌÅÄÎÅÍ ÒÉÍÅÒÅ ÍÙ ÄÏÂÁ×ÉÌÉ ÎÅÓËÏÌØËÏ ÒÏÂÅÌÏ×, ×ÙÄÅÌÑÑ É ×ÙÒÁ×ÎÉ×ÁÑ ÚÎÁË =. åÓÔÅ ÓÔ×ÅÎÎÏ, ÎÅÌØÚÑ ×ÓÔÁ×ÌÑÔØ ÒÏÂÅÌÙ × ÞÉÓÌÁ, ÉÍÅÎÁ ÆÕÎË ÉÊ É Å ÒÅÍÅÎÎÙÈ, × ËÌÀÞÅ×ÙÅ ÓÌÏ×Á: ÚÁÉÓØ 1 7, ËÏÎÅÞÎÏ ÖÅ, ÏÚÎÁÞÁÅÔ ÎÅÞÔÏ ÏÔÌÉÞÎÏÅ ÏÔ 17. ëÒÏÍÅ ÜÔÏÇÏ, ÍÏÖÎÏ, ÉÓÈÏÄÑ ÉÚ ÜÔÉÈ ÖÅ ÒÉÎ ÉÏ×, ÒÁÚÒÙ×ÁÔØ ÓÔÒÏËÉ É ÄÏÂÁ×ÌÑÔØ × ÔÅËÓÔ ÒÏÇÒÁÍÍÙ ÕÓÔÙÅ ÓÔÒÏËÉ. ïÄÎÁËÏ Ä×ÕÍÅÒÎÙÊ ÓÉÎÔÁËÓÉÓ ÑÚÙËÁ ÎÁËÌÁÄÙ×ÁÅÔ ÄÏÏÌÎÉÔÅÌØÎÙÅ ÏÇÒÁÎÉ ÞÅÎÉÑ ÎÁ ÒÁÚÒÙ×Ù ÓÔÒÏË. ÁË ÓÌÅÄÕÀÝÉÅ ÌÏËÁÌØÎÙÅ ÏÒÅÄÅÌÅÎÉÑ ÉÍÅÀÔ ÓÏ×ÓÅÍ ÒÁÚÌÉÞÎÙÊ ÓÍÙÓÌ:
where
where
a = f x y b = g z
a = f x y b = g z
ïÒÅÄÅÌÑÑ ÆÕÎË ÉÉ, ÒÕËÏ×ÏÄÓÔ×ÕÊÔÅÓØ ÓÌÅÄÕÀÝÉÍÉ ÒÉÎ ÉÁÍÉ:
ÓÔÒÏËÁ, ÒÁÓÏÌÏÖÅÎÎÁÑ Ó ÔÏÞÎÏ ÔÁËÉÍ ÖÅ ÏÔÓÔÕÏÍ, ËÁË
É ÒÅÄÙÄÕÝÁÑ, ÒÁÓÓÍÁÔÒÉ×ÁÅÔÓÑ ËÁË ÎÏ×ÏÅ ÏÒÅÄÅÌÅÎÉÅ; ÓÔÒÏËÁ, ÉÍÅÀÝÁÑ ÏÔÓÔÕ, ÞÅÍ ÒÅÄÙÄÕÝÁÑ, ÒÁÓ ÓÍÁÔÒÉ×ÁÅÔÓÑ ËÁË ÒÏÄÏÌÖÅÎÉÅ ÒÅÄÙÄÕÝÅÊ ÓÔÒÏËÉ; ÓÔÒÏËÁ, ÉÍÅÀÝÁÑ ÏÔÓÔÕ, ÏÚÎÁÞÁÅÔ, ÞÔÏ ÒÏÄÏÌ ÖÅÎÉÅ ÒÅÄÙÄÕÝÉÈ ÓÔÒÏË ÚÁ×ÅÒÛÅÎÏ.
ÂÏÌØÛÉÊ ÍÅÎØÛÉÊ
îÁÉÂÏÌØÛÉÊ ÉÎÔÅÒÅÓ ÒÅÄÓÔÁ×ÌÑÀÔ ÓÔÒÏËÉ, × ËÏÔÏÒÙÈ ÆÒÁÚÁ Ó ÉÓÏÌØÚÏ×ÁÎÉÅÍ ËÌÀÞÅ×ÏÇÏ ÓÌÏ×Á where ÉÓÏÌØÚÕÅÔÓÑ ×ÎÕÔÒÉ ÄÒÕ ÇÏÊ where-ÆÒÁÚÙ, ÎÁÒÉÍÅÒ,
f x y = g (x + w) where g u = u + v where v = u * u
II. úÎÁËÏÍÓÔ×Ï Ó ÑÚÙËÏÍ Haskell
62
w = 2 + y úÄÅÓØ w ÅÓÔØ ÌÏËÁÌØÎÁÑ ÅÒÅÍÅÎÎÁÑ ÄÌÑ ÆÕÎË ÉÉ f, ÎÏ ÎÅ ÄÌÑ g. üÔÏ ÓÌÅÄÕÅÔ ÉÚ ÔÏÇÏ, ÞÔÏ ÏÔÓÔÕ ÓÔÒÏËÉ, × ËÏÔÏÒÏÊ ÏÒÅÄÅÌÑÅÔÓÑ w ÍÅÎØÛÅ, ÞÅÍ × ÓÔÒÏËÅ, ÏÒÅÄÅÌÑÀÝÅÊ v. åÓÌÉ ÖÅ ÓÄÅÌÁÔØ ÏÔÓÔÕ ÒÉ ÏÒÅÄÅÌÅÎÉÉ w ÍÅÎØÛÅ, ÞÅÍ × ÓÔÒÏËÅ, ÏÒÅÄÅÌÑÀÝÅÊ g, ÔÏ ÉÎ ÔÅÒÒÅÔÁÔÏÒ ×ÙÄÁÓÔ ÓÏÏÂÝÅÎÉÅ Ï ÏÛÉÂËÅ. óÌÅÄÕÊÔÅ ÒÁ×ÉÌÕ:
ÜË×É×ÁÌÅÎÔÎÙÅ ÏÒÅÄÅÌÅÎÉÑ ÄÏÌÖÎÙ ÉÍÅÔØ ÒÁ×ÎÙÅ ÏÔÓÔÕÙ.
üÔÏ ÏÚÎÁÞÁÅÔ ÔÁËÖÅ, ÞÔÏ ×ÓÅ ÇÌÏÂÁÌØÎÙÅ ÏÒÅÄÅÌÅÎÉÑ ÆÕÎË ÉÊ ÄÏÌÖÎÙ ÉÍÅÔØ ÏÄÉÎ É ÔÏÔ ÖÅ ÏÔÓÔÕ (ÎÁÒÉÍÅÒ, ×ÓÅ ÄÏÌÖÎÙ ÎÁÞÉ ÎÁÔØÓÑ Ó ÎÕÌÅ×ÏÊ ÏÚÉ ÉÉ).
÷ÏÒÏÓÙ É ÚÁÄÁÎÉÑ II.3.1
ïÂßÑÓÎÉÔÅ, × ÞÅÍ ÒÁÚÌÉÞÉÅ × ÉÓÏÌØÚÏ×ÁÎÉÉ ËÏÎÓÔÒÕË ÉÊ x = 3 É x == 3. II.3.2
úÁÄÁÊÔÅ ÆÕÎË ÉÀ greater, ×ÏÚ×ÒÁÝÁÀÝÕÀ ÂÏÌØÛÉÊ ÉÚ Ä×ÕÈ ÁÒÇÕ ÍÅÎÔÏ×. II.3.3
ïÒÅÄÅÌÉÔÅ ÆÕÎË ÉÀ, ×ÏÚ×ÒÁÝÁÀÝÕÀ ÌÏÝÁÄØ ËÒÕÇÁ Ó ÒÁÄÉÕ ÓÏÍ r (ÉÓÏÌØÚÕÊÔÅ ×ÍÅÓÔÏ ÞÉÓÌÁ ÞÉÓÌÏ 22/7). II.3.4
îÁÉÛÉÔÅ Ä×Å ×ÅÒÓÉÉ ÆÕÎË ÉÉ numberSol, ËÏÔÏÒÁÑ ÂÅÒÅÔ ÔÒÉ ÞÉ ÓÌÁ a, b É É ×ÙÞÉÓÌÑÅÔ ÞÉÓÌÏ ÒÅÛÅÎÉÊ ÕÒÁ×ÎÅÎÉÑ ax2 + bx + = 0 (1) ÉÓÏÌØÚÕÑ ÏÈÒÁÎÎÙÅ ×ÙÒÁÖÅÎÉÑ; (2) ËÏÍÂÉÎÉÒÕÑ ÓÔÁÎÄÁÒÔÎÙÅ ÆÕÎË ÉÉ1. II.3.5
ðÕÓÔØ ÏÒÅÄÅÌÅÎÉÅ ÆÕÎË ÉÉ middleNumber, ÎÁÈÏÄÑÝÅÊ ÓÒÅÄÎÅÅ Ï ×ÅÌÉÞÉÎÅ ÉÚ ÔÒÅÈ ÞÉÓÅÌ, ÔÁËÏ×Ï: 1÷ÏÓÏÌØÚÕÊÔÅÓØ
ÏÒÅÄÅÌÅÎÎÏÊ × ÒÅÌÀÄÉÉ ÆÕÎË ÉÅÊ
Ñ×ÌÑÅÔÓÑ ÁÎÁÌÏÇÏÍ ÒÁÓÓÍÏÔÒÅÎÎÏÊ ÎÁÍÉ ÆÕÎË ÉÉ
sign.
signum,
ËÏÔÏÒÁÑ
3. úÁÄÁÎÉÅ ÆÕÎË ÉÊ
63
middleNumber :: Int -> Int -> Int -> Int middleNumber x y z | between y x z = x | between x y z = y | otherwise = z between :: Int -> Int -> Int -> Bool between = between úÁÍÅÎÉÔÅ ÒÉ×ÅÄÅÎÎÏÅ × ÏÓÌÅÄÎÅÊ ÓÔÒÏËÅ ÓËÒÉÔÁ ÆÉËÔÉ× ÎÏÅ ÏÒÅÄÅÌÅÎÉÅ ÆÕÎË ÉÉ between ÎÁ ÔÁËÏÅ, ÞÔÏÂÙ ÆÕÎË ÉÑ middleNumber ÂÙÌÁ ËÏÒÒÅËÔÎÏ ÏÒÅÄÅÌÅÎÁ.
çÌÁ×Á III
æÕÎË ÉÉ × ÑÚÙËÅ Haskell 1. ðÏÌÉÍÏÒÆÉÚÍ É ÅÒÅÇÒÕÚËÁ ÆÕÎË ÉÊ
îÅËÏÔÏÒÙÅ ÆÕÎË ÉÉ É ÏÅÒÁÔÏÒÙ ÍÏÇÕÔ ÒÁÂÏÔÁÔØ Ó ÒÁÚÌÉÞÎÙ ÍÉ ÔÉÁÍÉ ÄÁÎÎÙÈ. äÌÑ ÂÏÌØÛÉÎÓÔ×Á ÆÕÎË ÉÊ ÎÁ ÓÉÓËÁÈ (ÎÁÒÉ ÍÅÒ, length) ÎÅ ×ÁÖÎÏ, ËÁËÏ× ÔÉ ÜÌÅÍÅÎÔÏ× ÓÉÓËÁ. ÷ÅÄØ ÍÏÖÎÏ ÇÏ×ÏÒÉÔØ Ï ÄÌÉÎÅ ÓÉÓËÁ, ÓÏÓÔÏÑÝÅÇÏ ÉÚ ÅÌÙÈ ÞÉÓÅÌ, ÂÕÌÅ×ÙÈ ÅÒÅ ÍÅÎÎÙÈ ÉÌÉ ÄÁÖÅ ÉÚ ÆÕÎË ÉÊ. É ÜÔÏÊ ÆÕÎË ÉÉ × ÑÚÙËÅ Haskell ÔÁËÏ×:
length :: [a℄ -> Int üÔÁ ÚÁÉÓØ ÇÏ×ÏÒÉÔ Ï ÔÏÍ, ÞÔÏ ÁÒÇÕÍÅÎÔÏÍ ÆÕÎË ÉÉ Ñ×ÌÑÅÔÓÑ ÓÉ ÓÏË, ÒÉÞÅÍ ÎÅ ×ÁÖÎÏ, Ë ËÁËÏÍÕ ÔÉÕ ÒÉÎÁÄÌÅÖÁÔ ÅÇÏ ÜÌÅÍÅÎÔÙ. É ÅÒÅÍÅÎÎÙÈ ÕËÁÚÙ×ÁÅÔÓÑ Ó ÏÍÏÝØÀ ÅÒÅÍÅÎÎÏÊ ÔÉÁ, × ÄÁÎÎÏÍ ÓÌÕÞÁÅ ÅÒÅÍÅÎÎÏÊ a. éÍÑ ÅÒÅÍÅÎÎÏÊ ÔÉÁ, × ÏÔÌÉÞÉÅ ÏÔ ÎÁÚ×ÁÎÉÊ ÓÁÍÉÈ ÔÉÏ×, ÔÁËÉÈ ËÁË Int ÉÌÉ Bool ÄÏÌÖÎÏ ÎÁÞÉÎÁÔØÓÑ Ó ÂÕË×Ù. æÕÎË ÉÑ head, ËÏÔÏÒÁÑ ×ÏÚ×ÒÁÝÁÅÔ ÅÒ×ÙÊ ÜÌÅÍÅÎÔ ÎÅÕÓÔÏÇÏ ÓÉÓËÁ, ÉÍÅÅÔ ÔÉ
ÒÏÉÓÎÏÊ
head :: [a℄ -> a üÔÁ ÆÕÎË ÉÑ ÔÁËÖÅ ÏÅÒÉÒÕÅÔ ÓÉÓËÁÍÉ É ÔÉ ÜÌÅÍÅÎÔÏ× ÓÉÓ ËÁ ÄÌÑ ÎÅÅ ÎÅ ×ÁÖÅÎ. ÅÍ ÎÅ ÍÅÎÅÅ, ÒÅÚÕÌØÔÁÔ ÒÉÍÅÎÅÎÉÑ ÆÕÎË ÉÉ ÉÍÅÅÔ ÔÏÔ ÖÅ ÔÉ, ÞÔÏ É ×ÓÅ ÜÌÅÍÅÎÔÙ ÓÉÓËÁ. ðÏÌÉÍÏÒÆÎÙÅ ÆÕÎË ÉÉ, ÁÎÁÌÏÇÉÞÎÙÅ ×ÙÛÅ ÒÁÓÓÍÏÔÒÅÎÎÙÍ, ÉÓÏÌØÚÕÀÔ ÔÏÌØËÏ ÓÉÓËÁ. É, ÓÏÄÅÒÖÁÝÉÊ ÅÒÅÍÅÎÎÙÅ ÔÉÁ ÎÁÚÙ×ÁÅÔÓÑ , Ô. Å. ÒÉÍÅÎÑÅÍÙÊ Ë ÒÁÚÌÉÞÎÙÍ ÔÉÁÍ. æÕÎË ÉÑ, ÏÂßÑ×ÌÅÎÎÁÑ Ó ÏÌÉÍÏÒÆÎÙÍ ÔÉÏÍ, ÎÁÚÙ×ÁÅÔÓÑ ÏÌÉÍÏÒÆÎÏÊ ÆÕÎË ÉÅÊ. äÌÑ ÓÁÍÏÇÏ ÜÔÏÇÏ Ñ×ÌÅÎÉÑ ÉÓÏÌØÚÕÅÔÓÑ ÔÅÒÍÉÎ ÏÌÉÍÏÒÆÉÚÍ. ðÏÌÉÍÏÒÆÎÙÅ ÆÕÎË ÉÉ ×ÓÔÒÅÞÁÀÔÓÑ ÏÞÅÎØ ÞÁÓÔÏ. âÏÌØÛÉÎ ÓÔ×Ï ÆÕÎË ÉÊ × ÒÅÌÀÄÉÉ Ñ×ÌÑÅÔÓÑ ÏÌÉÍÏÒÆÎÙÍÉ ÆÕÎË ÉÑÍÉ.
ÓÔÒÕËÔÕÒÕ
ÏÌÉÍÏÒÆÎÙÍ
64
1. ðÏÌÉÍÏÒÆÉÚÍ É ÅÒÅÇÒÕÚËÁ ÆÕÎË ÉÊ
65
îÅ ÔÏÌØËÏ ÆÕÎË ÉÉ ÎÁ ÓÉÓËÁÈ ÍÏÇÕÔ ÏÂÌÁÄÁÔØ Ó×ÏÊÓÔ×ÏÍ Ï ÌÉÍÏÒÆÎÏÓÔÉ. ðÒÏÓÔÅÊÛÁÑ ÏÌÉÍÏÒÆÎÁÑ ÆÕÎË ÉÑ ÅÓÔØ ÆÕÎË ÉÑ ¾ÔÏÖÄÅÓÔ×ÅÎÎÏÓÔÉ¿ (ÇÏ×ÏÒÑ ÑÚÙËÏÍ ÍÁÔÅÍÁÔÉËÉ, ÜÔÏ ÔÁËÁÑ ÆÕÎË ÉÑ f, ÞÔÏ f(x) = x ÄÌÑ ÌÀÂÏÇÏ x). îÁÚÏ×ÅÍ ÅÅ id' (ÏÔ identify ÕÓÔÁÎÁ×ÌÉ×ÁÔØ ÔÏÖÄÅÓÔ×Ï, ÆÕÎË ÉÑ id ÏÒÅÄÅÌÅÎÁ × ÒÅÌÀÄÉÉ):
id' :: a -> a id' x = x æÕÎË ÉÑ id' ÍÏÖÅÔ ÏÅÒÉÒÏ×ÁÔØ ÜÌÅÍÅÎÔÁÍÉ ÌÀÂÏÇÏ ÔÉÁ. åÅ ÍÏÖ ÎÏ ÒÉÍÅÎÑÔØ Ë ÞÉÓÌÁÍ, ÌÏÇÉÞÅÓËÉÍ ×ÅÌÉÞÉÎÁÍ, ÓÉÓËÁÍ, ÓÉÓËÁÍ ÓÉÓËÏ× É Ô. Ä.
---> id' 456789 456789 ---> id' 3.4 3.4 ---> id' [1,2℄ [1,2℄ ---> id' [[True, True℄, [℄, [False℄℄ [[True,True℄,[℄,[False℄℄ ÷ÓÏÍÎÉÍ ÄÁÎÎÏÅ ÎÁ ÓÔÒ. 59 ÏÒÅÄÅÌÅÎÉÅ ÆÕÎË ÉÉ fa t:
fa t :: Integer -> Integer fa t n | n == 0 = 1 | n > 0 = n * fa t (n-1) ðÒÉ ×ÙÚÏ×Å Ó ÎÅÏÔÒÉ ÁÔÅÌØÎÙÍÉ ÁÒÇÕÍÅÎÔÁÍÉ ÜÔÁ ÆÕÎË ÉÑ ÒÁÂÏ ÔÁÅÔ ÚÁÍÅÞÁÔÅÌØÎÏ, ÏÄÎÁËÏ ÅÓÌÉ ×ÙÚ×ÁÔØ ÅÅ Ó ÁÒÇÕÍÅÎÔÏÍ, ÍÅÎØÛÉÍ ÎÕÌÑ, ÔÏ Hugs ×ÙÄÁÓÔ ÎÅ ÏÞÅÎØ ÑÓÎÏÅ ÓÏÏÂÝÅÎÉÅ Ï ÏÛÉÂËÅ:
---> fa t 30 265252859812191058636308480000000 ---> fa t 0 1 ---> fa t (-4) Program error: {fa t (-4)} äÅÌÏ × ÔÏÍ, ÞÔÏ ÜÔÁ ÆÕÎË ÉÑ ÎÅ ÏÒÅÄÅÌÅÎÁ ÄÌÑ ÏÔÒÉ ÁÔÅÌØÎÙÈ ÁÒ ÇÕÍÅÎÔÏ×. ÷ ÏÄÏÂÎÙÈ ÓÉÔÕÁ ÉÑÈ ÒÉÇÏÄÉÔÓÑ ÏÌÉÍÏÒÆÎÁÑ ÆÕÎË ÉÑ error, ÚÁÄÁÎÎÁÑ × ÒÅÌÀÄÉÉ, ËÏÔÏÒÁÑ ÉÓÏÌØÚÕÅÔ × ËÁÞÅÓÔ×Å ÁÒÁÍÅÔÒÁ ÓÔÒÏËÕ ÔÅËÓÔÁ Ó ÏÑÓÎÅÎÉÑÍÉ:
fa t :: Integer -> Integer fa t n | n == 0 = 1 | n > 0 = n * fa t (n-1)
H
H
III. æÕÎË ÉÉ × ÑÚÙËÅ Haskell
66
| n < 0 = error "ÏÔÒÉ ÁÔÅÌØÎÙÊ ÁÒÇÕÍÅÎÔ!"
H
H
ÅÅÒØ ×Ù×ÏÄ ÓÔÁÎÏ×ÉÔÓÑ ÂÏÌÅÅ ÏÎÑÔÎÙÍ:
---> fa t (-4) Program error: ÏÔÒÉ ÁÔÅÌØÎÙÊ ÁÒÇÕÍÅÎÔ! ïÂÓÕÄÉÍ ÔÉ ÆÕÎË ÉÉ error. ïÎÁ ÉÓÏÌØÚÕÅÔ ÓÔÒÏËÕ × ËÁÞÅ ÓÔ×Å ÁÒÇÕÍÅÎÔÁ, ÏÜÔÏÍÕ ÅÅ ÔÉ String -> A ÄÌÑ ËÁËÏÇÏ-ÔÏ ÔÉÁ A. éÚ ÏÉÓÁÎÉÑ ÒÏÇÒÁÍÍÙ ÑÓÎÏ, ÞÔÏ A = Integer, ÔÁË ËÁË ÔÏÌØËÏ ÁÓÓÏ ÉÉÒÏ×ÁÎÎÁÑ Ó ÜÔÉÍ ÔÉÏÍ ÄÁÎÎÙÈ ÆÕÎË ÉÑ fa t Ñ×ÌÑÅÔÓÑ ÈÏ ÒÏÛÏ ÏÒÅÄÅÌÅÎÎÏÊ: ÅÒ×ÙÊ É ×ÔÏÒÏÊ ÕÎËÔÙ ÏÅÒÉÒÕÀÔ Ó ÅÌÙÍÉ, ÏÜÔÏÍÕ ÔÒÅÔÉÊ ÕÎËÔ, ÄÏÌÖÅÎ ÓÌÅÄÏ×ÁÔØ ÔÏÍÕ ÖÅ. îÏ ÜÔÏ ÎÅ×ÏÚ ÍÏÖÎÏ, ÔÁË ËÁË ÆÕÎË ÉÑ error ×ÏÚ×ÒÁÝÁÅÔ ÓÔÒÏËÕ. åÓÌÉ ÖÅ ÍÙ ÏÇÒÁÎÉÞÉÍÓÑ ÔÏÌØËÏ ×Ù×ÏÄÏÍ ÞÉÓÅÌ, ÚÁÛÉÆÒÏ×Ù×ÁÀÝÉÈ ÎÁÛÅ ÓÏ ÏÂÝÅÎÉÅ Ï ÏÛÉÂËÅ, Ô. Å. ÏÒÅÄÅÌÉÍ ÅÅ ÔÉ ËÁË String -> Integer, ÔÏ ÍÙ ÓÉÌØÎÏ ÏÇÒÁÎÉÞÉÍ ÎÁÛÉ ×ÏÚÍÏÖÎÏÓÔÉ × ×Ù×ÏÄÅ ÓÏÏÂÝÅÎÉÊ. ëÒÏÍÅ ÜÔÏÇÏ, ÍÏÖÅÔ ÏÔÒÅÂÏ×ÁÔØÓÑ ×ÏÚ×ÒÁÝÅÎÉÅ ÆÕÎË ÉÅÊ error ÚÎÁÞÅÎÉÊ É ËÁËÉÈ-ÌÉÂÏ ÄÒÕÇÉÈ ÔÉÏ×, ÎÁÒÉÍÅÒ, × ÓÌÅÄÕÀÝÅÍ ÒÉ ÍÅÒÅ ×ÏÚ×ÒÁÝÁÅÔÓÑ ÌÏÇÉÞÅÓËÏÅ ÚÎÁÞÅÎÉÅ:
e1 :: Bool e1 = error "e1" ÷ÙÞÉÓÌÉÍ ÚÎÁÞÅÎÉÅ e1 É ÕÂÅÄÉÍÓÑ × ËÏÒÒÅËÔÎÏÓÔÉ ÏÒÅÄÅÌÅÎÉÑ:
---> e1 Program error: e1 ðÏÄÏÂÎÙÅ ÏÒÅÄÅÌÅÎÉÑ ×ÏÚÍÏÖÎÙ ÔÏÌØËÏ ÏÔÏÍÕ, ÞÔÏ ÆÕÎË ÉÑ error Ñ×ÌÑÅÔÓÑ ÏÌÉÍÏÒÆÎÏÊ ÆÕÎË ÉÅÊ. ÷ ÅÅ ÏÂßÑ×ÌÅÎÉÉ ÉÓÏÌØ ÚÕÅÔÓÑ ÅÒÅÍÅÎÎÁÑ ÔÉÁ:
error :: String -> a îÁ ÒÁËÔÉËÅ ÆÕÎË ÉÑ error ÞÁÓÔÏ ÉÓÏÌØÚÕÅÔÓÑ × ÒÏÌÉ ÎÅÏÒÅ ÄÅÌÅÎÎÏÇÏ ÚÎÁÞÅÎÉÑ (?) ÑÚÙËÁ Haskell. ÷ÙÚÏ× error ÒÉ×ÏÄÉÔ Ë ÒÅËÒÁÝÅÎÉÀ ×ÙÏÌÎÅÎÉÑ É ÅÞÁÔÉ ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÅÇÏ ÓÏÏÂÝÅÎÉÑ. æÕÎË ÉÑ error ÔÁËÖÅ ÒÉÍÅÎÑÅÔÓÑ ÄÌÑ ÓÏÚÄÁÎÉÑ ¾ÚÁÇÌÕÛÅË¿ ÒÏÇÒÁÍÍÎÙÈ ËÏÍÏÎÅÎÔ, ËÏÔÏÒÙÅ ÏËÁ ÅÝÅ ÎÅ ÎÁÉÓÁÎÙ, ÉÌÉ ×Å ÌÉÞÉÎ, ×ÈÏÄÑÝÉÈ × ÒÁÚÌÉÞÎÙÅ ÓÔÒÕËÔÕÒÙ ÄÁÎÎÙÈ, ÇÄÅ ×ÅÌÉÞÉÎÁ ÄÏÌÖÎÁ ÒÉÓÕÔÓÔ×Ï×ÁÔØ, ÎÏ ÎÉËÏÇÄÁ ÎÅ ÍÏÖÅÔ ÂÙÔØ ÉÓÏÌØÚÏ×ÁÎÁ.
I õÒÁÖÎÅÎÉÅ III.1.1
ïÒÅÄÅÌÉÍ ËÏÎÓÔÁÎÔÎÕÀ ÆÕÎË ÉÀ, ËÏÔÏÒÁÑ ÄÌÑ ÌÀÂÏÇÏ Ó×ÏÅÇÏ ÁÒ ÇÕÍÅÎÔÁ ×ÏÚ×ÒÁÝÁÅÔ 1:
1. ðÏÌÉÍÏÒÆÉÚÍ É ÅÒÅÇÒÕÚËÁ ÆÕÎË ÉÊ
67
onst1 :: a -> Int
onst1 x = 1 e2 :: Int e2 = onst1 (error "e2") ÅÅÒØ ÏÒÏÂÕÅÍ ×ÙÞÉÓÌÉÔØ ÚÎÁÞÅÎÉÅ e2:
H
---> e2 1 ëÁË ×ÉÄÉÍ, ÆÕÎË ÉÑ onst1 Ñ×ÌÑÅÔÓÑ ÎÅÓÔÒÏÇÏÊ Ï ÏÔÎÏÛÅÎÉÀ Ë Ó×ÏÅÍÕ ÁÒÇÕÍÅÎÔÕ, Ô. Å. onst1 ? = 1
J
ðÒÉÍÅÒÏÍ ÏÌÉÍÏÒÆÎÏÊ ÆÕÎË ÉÉ Ó ÎÕÌÅ×ÙÍ ÞÉÓÌÏÍ ÁÒÇÕÍÅÎ ÔÏ× ÍÏÖÅÔ ÓÌÕÖÉÔØ ÆÕÎË ÉÑ undefined, ËÏÔÏÒÁÑ ÏÄÏÂÎÏ ÆÕÎË ÉÉ error ÕÏÔÒÅÂÌÑÅÔÓÑ ÄÌÑ ÏÂÏÚÎÁÞÅÎÉÑ ÎÅÏÒÅÄÅÌÅÎÎÏÊ ×ÅÌÉÞÉÎÙ ÌÀÂÏÇÏ ÔÉÁ (?):
---> length [undefined, 3℄ 2 ---> True || undefined True íÎÏÇÉÅ ÆÕÎË ÉÉ ÏÔ ÎÅÓËÏÌØËÉÈ ÅÒÅÍÅÎÎÙÈ Ñ×ÌÑÀÔÓÑ ÏÌÉ ÍÏÒÆÎÙÍÉ. îÁÏÍÎÉÍ, ÞÔÏ ÒÉ ÕËÁÚÁÎÉÉ ÔÉÁ ÆÕÎË ÉÉ, ÚÁ×ÉÓÑ ÝÅÊ ÏÔ ÎÅÓËÏÌØËÉÈ ÁÒÇÕÍÅÎÔÏ×, ÒÁÚÍÅÝÁÀÔ ÓÉÍ×ÏÌÙ -> ËÁË ÍÅÖÄÕ ÔÉÁÍÉ ÁÒÁÍÅÔÒÏ×, ÔÁË É ÅÒÅÄ ÔÉÏÍ ÒÅÚÕÌØÔÁÔÁ. ÁË, ÆÕÎË ÉÑ ab Formula, ÒÉ×ÅÄÅÎÎÁÑ ÎÁ ÓÔÒ. 47, ÂÅÒÕÝÁÑ × ËÁÞÅÓÔ×Å ÁÒÁÍÅ ÔÒÏ× ÔÒÉ ÞÉÓÌÁ É ×ÏÚ×ÒÁÝÁÀÝÁÑ ÓÉÓÏË ÞÉÓÅÌ, ÉÍÅÅÔ ÔÉ:
ab Formula
:: Float -> Float -> Float -> [Float℄
ïÄÎÉÍ ÉÚ ÒÉÍÅÒÏ× ÏÌÉÍÏÒÆÎÏÊ ÆÕÎË ÉÉ ÏÔ Ä×ÕÈ ÁÒÇÕÍÅÎ ÔÏ× Ñ×ÌÑÅÔÓÑ ÆÕÎË ÉÑ map, ÏÒÅÄÅÌÅÎÎÁÑ × ÒÅÌÀÄÉÉ. åÅ ÅÒ×ÙÊ ÁÒÇÕÍÅÎÔ Ñ×ÌÑÅÔÓÑ ÆÕÎË ÉÅÊ, Á ×ÔÏÒÏÊ ÓÉÓËÏÍ. æÕÎË ÉÑ map ÒÉÍÅÎÑÅÔ ÆÕÎË ÉÀ (ÅÒ×ÙÊ ÁÒÇÕÍÅÎÔ) Ë ËÁÖÄÏÍÕ ÜÌÅÍÅÎÔÕ ÓÉÓ ËÁ É ÒÁÚÍÅÝÁÅÔ ÒÅÚÕÌØÔÁÔÙ ÔÁËÖÅ × ÓÉÓËÅ, ÎÁÒÉÍÅÒ,
---> map sqrt [1.0, 4.0, 9.0℄ [1.0,2.0,3.0℄ ---> map even [2, 4, 3, 6, 78℄ [True,True,False,True,True℄ ÷ ÅÒ×ÏÍ ÒÉÍÅÒÅ ÉÚ ËÁÖÄÏÇÏ ÜÌÅÍÅÎÔÁ ÓÉÓËÁ ÂÙÌ ÉÚ×ÌÅÞÅÎ Ë×Á ÄÒÁÔÎÙÊ ËÏÒÅÎØ, Á ×Ï ×ÔÏÒÏÍ ÜÌÅÍÅÎÔÙ ÓÉÓËÁ ÂÙÌÉ ÒÏ×ÅÒÅÎÙ ÎÁ ÞÅÔÎÏÓÔØ. ïÂßÑ×ÌÅÎÉÅ ÔÉÁ ÆÕÎË ÉÉ map ×ÙÇÌÑÄÉÔ ÔÁË:
H
H
III. æÕÎË ÉÉ × ÑÚÙËÅ Haskell
68
map :: (a -> b) -> [a℄ -> [b℄ åÅ ÅÒ×ÙÊ ÁÒÇÕÍÅÎÔ (× ÓËÏÂËÁÈ) ÒÏÉÚ×ÏÌØÎÁÑ ÆÕÎË ÉÑ, ÒÏ ËÏ ÔÏÒÕÀ ÉÚ×ÅÓÔÎÏ ÌÉÛØ ÔÏ, ÞÔÏ ÅÅ ÁÒÇÕÍÅÎÔ ÄÏÌÖÅÎ ÉÍÅÔØ ÔÉ, ÏÂÏ ÚÎÁÞÁÅÍÙÊ ÅÒÅÍÅÎÎÏÊ ÔÉÁ a, Á ×ÏÚ×ÒÁÝÁÅÔ ÏÎÁ ×ÅÌÉÞÉÎÕ ÔÉÁ b. ðÏÜÔÏÍÕ ×ÔÏÒÏÊ ÁÒÇÕÍÅÎÔ (ÓÉÓÏË) ÄÏÌÖÅÎ ÓÏÄÅÒÖÁÔØ ×ÅÌÉÞÉÎÙ ÔÉÁ a, Á ÒÅÚÕÌØÔÁÔ ÓÉÓÏË ×ÅÌÉÞÉÎ ÔÉÁ b. ïÔÍÅÔÉÍ, ÞÔÏ ÓËÏ ËÉ, × ËÏÔÏÒÙÅ ÚÁËÌÀÞÅÎ ÔÉ ÆÕÎË ÉÉ, ÎÅÏÂÈÏÄÉÍÙ. éÈ ÏÔÓÕÔÓÔ×ÉÅ ÂÕÄÅÔ ÏÚÎÁÞÁÔØ, ÞÔÏ Õ ÆÕÎË ÉÉ ÎÅ Ä×Á, Á ÁÒÁÍÅÔÒÁ. ðÏÒÏÂÕÅÍ ÏÒÅÄÅÌÉÔØ ÔÉ ËÏÍÏÚÉ ÉÉ ÆÕÎË ÉÊ. òÁÓÓÍÏÔÒÉÍ Ä×Å ÆÕÎË ÉÉ, ÏÂßÑ×ÌÅÎÎÙÅ ÓÌÅÄÕÀÝÉÍ ÏÂÒÁÚÏÍ:
ÔÒÉ
square sqrt
:: Int -> Int :: Int -> Float
÷ÙÒÁÖÅÎÉÑ square . square É sqrt . square ÏÓÍÙÓÌÅÎÎÙ É ÉÍÅ ÀÔ ÓÌÅÄÕÀÝÉÅ ÔÉÙ
square . square :: Int -> Int sqrt . square :: Int -> Float ïÄÎÁËÏ ËÏÍÏÚÉ ÉÑ ÆÕÎË ÉÊ ÉÍÅÅÔ × ÜÔÉÈ Ä×ÕÈ ÓÌÕÞÁÑÈ ÒÁÚÌÉÞ ÎÙÅ ÔÉÙ, Á ÉÍÅÎÎÏ
(.) :: (Int ->Int)
(.) :: (Int -> Float) -> (Int -> Int) -> (Int -> Float)
-> (Int -> Int) -> (Int -> Int)
É ëÁË ×ÉÄÉÍ, ÏÅÒÁ ÉÑ ËÏÍÏÚÉ ÉÉ ÆÕÎË ÉÊ ÔÁËÖÅ Ñ×ÌÑÅÔÓÑ ÏÌÉ ÍÏÒÆÎÏÊ. ðÒÉ ÏÂßÑ×ÌÅÎÉÉ ÅÅ ÔÉÁ ÉÓÏÌØÚÕÀÔÓÑ :
ÍÅÎÎÙÅ
ÔÉÏ×ÙÅ ÅÒÅ
(.) :: (b -> ) -> (a -> b) -> (a -> ) úÄÅÓØ a, b É ÚÁÄÁÀÔ ÔÉ ÅÒÅÍÅÎÎÙÈ. ðÒÉ ÚÁÉÓÉ ÔÉÏ×ÙÅ ÅÒÅ ÍÅÎÎÙÅ ÏÂÙÞÎÏ ÏÂÏÚÎÁÞÁÀÔÓÑ ÒÏÉÓÎÙÍÉ ÌÁÔÉÎÓËÉÍÉ ÂÕË×ÁÍÉ. òÁÓÒÏÓÔÒÁÎÅÎÎÏÊ ÒÁËÔÉËÏÊ Ñ×ÌÑÅÔÓÑ ÏÂÏÚÎÁÞÅÎÉÅ ÏÄÎÉÍ É ÔÅÍ ÖÅ ÉÍÅÎÅÍ ÆÕÎË ÉÊ, ÏÄÉÎÁËÏ×ÙÅ Ï ÓÕÔÉ, ÎÏ ÒÉÍÅÎÑÅÍÙÅ Ë ×ÅÌÉÞÉÎÁÍ ÒÁÚÌÉÞÎÏÇÏ ÔÉÁ. ÁË, ÏÅÒÁÔÏÒ + ÍÏÖÅÔ ÒÉÍÅÎÑÔØ ÓÑ ËÁË Ë ÅÌÙÍ ÞÉÓÌÁÍ (ÔÉa Int ÉÌÉ Integer), ÔÁË É Ë ÞÉÓÌÁÍ Ó ÌÁ×ÁÀÝÅÊ ÔÏÞËÏÊ (Float). òÅÚÕÌØÔÁÔ ÜÔÏÊ ÏÅÒÁ ÉÉ ÉÍÅÅÔ ÔÏÔ ÖÅ ÔÉ, ÞÔÏ É ÁÒÁÍÅÔÒÙ ÏÅÒÁ ÉÉ, ÎÁÒÉÍÅÒ, Int -> Int -> Int ÉÌÉ Float -> Float -> Float. îÏ ÎÅÌØÚÑ ÓÞÉÔÁÔØ + ÄÅÊÓÔ×ÉÔÅÌØ ÎÏ ÏÌÉÍÏÒÆÎÙÍ ÏÅÒÁÔÏÒÏÍ. åÓÌÉ ÂÙ ÔÉ ÅÇÏ ÂÙÌ a -> a -> a,
1. ðÏÌÉÍÏÒÆÉÚÍ É ÅÒÅÇÒÕÚËÁ ÆÕÎË ÉÊ
69
ÔÏ ÜÔÏ ÏÚÎÁÞÁÌÏ ÂÙ ×ÏÚÍÏÖÎÏÓÔØ ÓËÌÁÄÙ×ÁÔØ, ÎÁÒÉÍÅÒ, ÌÏÇÉÞÅ ÓËÉÅ ×ÅÌÉÞÉÎÙ ÉÌÉ ÆÕÎË ÉÉ, ÞÔÏ ÎÅ×ÏÚÍÏÖÎÏ. æÕÎË ÉÉ, Ñ×ÌÑÀÝÉ ÅÓÑ ¾ÏÇÒÁÎÉÞÅÎÎÏ ÏÌÉÍÏÒÆÎÙÍÉ¿ ÎÁÚÙ×ÁÀÔÓÑ (overloaded) ÆÕÎË ÉÑÍÉ. äÌÑ ÔÏÇÏ ÞÔÏÂÙ ÉÍÅÔØ ×ÏÚÍÏÖÎÏÓÔØ ÕËÁÚÙ×ÁÔØ ÔÉ ÅÒÅÇÒÕÖÅÎ ÎÙÈ ÆÕÎË ÉÊ, ×ÓÅ ÔÉÙ ÒÁÚÄÅÌÑÀÔ ÎÁ . ëÌÁÓÓ . ÷ ÒÅ ÌÀÄÉÉ ÏÒÅÄÅÌÅÎÎÏ ÍÎÏÇÏ ÒÁÚÌÉÞÎÙÈ ËÌÁÓÓÏ×, ÓÒÅÄÉ ËÏÔÏÒÙÈ
ÅÒÅÇÒÕÖÅÎÎÙÍÉ
ËÌÁÓÓÙ ÜÔÏ ÍÎÏ ÖÅÓÔ×Ï ÔÉÏ× Ó ÎÅËÏÔÏÒÙÍÉ ÏÂÝÉÍÉ ÈÁÒÁËÔÅÒÉÓÔÉËÁÍÉ
ËÌÁÓÓ, ÜÌÅÍÅÎÔÙ ËÏÔÏÒÏÇÏ ÍÏÇÕÔ ÓËÌÁÄÙ×ÁÔØÓÑ, ×ÙÞÉ ÔÁÔØÓÑ, ÕÍÎÏÖÁÔØÓÑ É ÄÅÌÉÔØÓÑ ÄÒÕÇ ÎÁ ÄÒÕÇÁ (ÞÉÓÌÏ×ÙÅ ÔÉÙ); Ord ËÌÁÓÓ, ÜÌÅÍÅÎÔÙ ËÏÔÏÒÏÇÏ ÍÏÇÕÔ ÂÙÔØ ÕÏÒÑÄÏÞÅÎÙ (ÕÏÒÑÄÏÞÅÎÎÙÅ ÔÉÙ); Eq ËÌÁÓÓ, ÜÌÅÍÅÎÔÙ ËÏÔÏÒÏÇÏ ÄÏÕÓËÁÀÔ ÒÏ×ÅÒËÕ ÎÁ ÒÁ×ÅÎ ÓÔ×Ï (ÓÒÁ×ÎÉ×ÁÅÍÙÅ ÔÉÙ). Num
ïÅÒÁÔÏÒ + ÉÍÅÅÔ ÔÉ Num a => a -> a -> a. üÔÁ ÚÁÉÓØ ÞÉÔÁ ÅÔÓÑ ÔÁË: ¾ïÅÒÁÔÏÒ + ÉÍÅÅÔ ÔÉ a -> a -> a, ÇÄÅ a ÉÚ ËÌÁÓÓÁ Num¿. ïÔÍÅÔÉÍ, ÞÔÏ × ÔÁËÏÊ ÚÁÉÓÉ ÉÓÏÌØÚÕÅÔÓÑ ÓÔÒÅÌËÁ ×ÉÄÁ => (ÉÎÏÇÄÁ × ÌÉÔÅÒÁÔÕÒÅ ÉÓÏÌØÚÕÅÔÓÑ ÏÂÏÚÎÁÞÅÎÉÅ )). îÅ ÓÌÅÄÕÅÔ ÕÔÁÔØ ÅÅ Ó ÏÄÉÎÁÒÎÏÊ ÓÔÒÅÌËÏÊ: ÔÁËÁÑ Ä×ÏÊÎÁÑ ÓÔÒÅÌËÁ ÍÏÖÅÔ ÉÓÏÌØÚÏ×ÁÔØÓÑ × ÏÂßÑ×ÌÅÎÉÉ ÔÉÁ ÌÉÛØ ÏÄÉÎ ÒÁÚ. ÷ÏÔ ÅÝÅ ÎÅÓËÏÌØËÏ ÒÉÍÅÒÏ× ÅÒÅÇÒÕÖÅÎÎÙÈ ÏÅÒÁÔÏÒÏ×:
(<) :: Ord a => a -> a -> Bool (==) :: Eq a => a -> a -> Bool ðÅÒÅÇÒÕÖÅÎÎÙÍÉ ÍÏÇÕÔ ÂÙÔØ É ÆÕÎË ÉÉ, ÏÒÅÄÅÌÑÅÍÙÅ ÒÏ ÇÒÁÍÍÉÓÔÏÍ, ÎÁÒÉÍÅÒ, ÆÕÎË ÉÑ
square :: Num a => a -> a square x = x*x Ñ×ÌÑÅÔÓÑ ËÏÒÒÅËÔÎÏ ÏÒÅÄÅÌÅÎÎÏÊ, ÔÁË ËÁË ÏÎÁ ÉÓÏÌØÚÕÅÔ ÏÅÒÁ ÔÏÒ *, ËÏÔÏÒÙÊ × Ó×ÏÀ ÏÞÅÒÅÄØ ÔÁËÖÅ ÅÒÅÇÒÕÖÅÎ.
I õÒÁÖÎÅÎÉÅ III.1.2
ïÒÅÄÅÌÉÍ ÏÌÉÍÏÒÆÎÕÀ ÆÕÎË ÉÀ, ÁÎÁÌÏÇÉÞÎÕÀ smallBig, ÒÁÓ ÓÍÏÔÒÅÎÎÏÊ ÎÁ ÓÔÒÁÎÉ Å 45. îÁ ÜÔÏÔ ÒÁÚ ÆÕÎË ÉÑ ÂÅÒÅÔ Ä×Á ÞÉÓÌÁ É ×ÙÄÁÅÔ ËÏÒÔÅÖ, ÓÏÄÅÒÖÁÝÉÊ ÉÈ × ÎÅÕÂÙ×ÁÀÝÅÍ ÏÒÑÄËÅ. áÒÇÕ ÍÅÎÔÙ ÆÕÎË ÉÉ ÓÒÁ×ÎÉ×ÁÀÔÓÑ ÍÅÖÄÕ ÓÏÂÏÊ, ÏÜÔÏÍÕ ÏÎÉ ÄÏÌÖÎÙ ÒÉÎÁÄÌÅÖÁÔØ ËÌÁÓÓÕ Ord. ïÒÅÄÅÌÑÑ ÆÕÎË ÉÀ, ×ÏÓÏÌØÚÕÅÍÓÑ ÏÈÒÁÎÎÙÍÉ ×ÙÒÁÖÅÎÉÑ ÍÉ:
III. æÕÎË ÉÉ × ÑÚÙËÅ Haskell
70
newSmallBig :: Ord a => a -> a -> (a, a) newSmallBig x y | x <= y = (x, y) | otherwise = (y, x)
J
÷ÏÒÏÓÙ É ÚÁÄÁÎÉÑ III.1.1
õËÁÖÉÔÅ ÔÉ ÓÌÅÄÕÀÝÉÊ ×ÅÌÉÞÉÎ: 3, even É even 3; head, [1, 2, 3℄ É head [1, 2, 3℄. þÔÏ ÒÏÉÚÏÊÄÅÔ, ÅÓÌÉ ÒÉÍÅÎÉÔØ ÏÌÉÍÏÒÆ ÎÕÀ ÆÕÎË ÉÀ Ë ÆÁËÔÉÞÅÓËÏÍÕ ÁÒÁÍÅÔÒÕ? III.1.2
÷ÙÂÅÒÉÔÅ ÒÁ×ÉÌØÎÙÊ ÏÔ×ÅÔ ÓÒÅÄÉ ÕËÁÚÁÎÎÙÈ: 1) ðÏÌÉÍÏÒÆÎÁÑ ÆÕÎË ÉÑ Á) Â) ×) Ç)
ÉÚÍÅÎÑÅÔ ÔÉÙ Ó×ÏÉÈ ÁÒÇÕÍÅÎÔÏ×; ËÏÍÂÉÎÉÒÕÅÔ ÄÁÎÎÙÅ ÒÁÚÌÉÞÎÙÈ ÔÉÏ×; ÍÏÖÅÔ ÒÉÍÅÎÑÔØÓÑ Ë ÒÁÚÌÉÞÎÙÍ ÔÉÁÍ ÁÒÇÕÍÅÎÔÏ×; ÏÓÔÅÅÎÎÏ ÉÚÍÅÎÑÅÔ Ó×ÏÊ ×ÉÄ × ÒÏ ÅÓÓÅ ×ÙÞÉÓÌÅÎÉÑ.
2) æÕÎË ÉÑ, ÏÂßÑ×ÌÅÎÎÁÑ ËÁË [a℄ -> [[a℄℄, Á) ÒÅÏÂÒÁÚÕÅÔ ÓÉÍ×ÏÌ × ÓÔÒÏËÕ; Â) ×ÙÄÅÌÑÅÔ ÏÄÓÔÒÏËÕ ÉÚ ÄÁÎÎÏÊ ÓÔÒÏËÉ; ×) ×ÏÚ×ÒÁÝÁÅÔ ÏÌÕÞÅÎÎÕÀ × ËÁÞÅÓÔ×Å ÁÒÇÕÍÅÎÔÁ ÓÔÒÏËÕ, ÉÚ ÍÅÎÑÑ ÏÒÑÄÏË ÓÉÍ×ÏÌÏ× × ÎÅÊ; Ç) ÔÒÁÎÓÆÏÒÍÉÒÕÅÔ ÓÔÒÏËÕ × ÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔØ ÏÄÓÔÒÏË. 3) æÕÎË ÉÑ, ÉÍÅÀÝÁÑ ÔÉ Eq a => a -> Bool, Á) Â) ×) Ç)
ÔÒÅÂÕÅÔ ÁÒÇÕÍÅÎÔ Ó ÉÍÅÎÅÍ Á; ÒÅÏÂÒÁÚÕÅÔ True × ÁÒÇÕÍÅÎÔÙ ÔÉÁ a; Ñ×ÌÑÅÔÓÑ ÏÌÉÍÏÒÆÎÏÊ ÆÕÎË ÉÅÊ; ÄÏÌÖÎÁ ÂÙÔØ ÒÁ×ÎÁ a.
4) åÓÌÉ × ÏÂßÑ×ÌÅÎÉÉ ÆÕÎË ÉÉ f ÓÏÄÅÒÖÉÔÓÑ ÔÒÉ ÓÔÒÅÌÏÞËÉ, ÔÏ ÔÉ f x ÂÕÄÅÔ ÓÏÄÅÒÖÁÔØ Á) ÏÄÎÕ ÓÔÒÅÌËÕ; Â) Ä×Å ÓÔÒÅÌËÉ; ×) ÔÒÉ ÓÔÒÅÌËÉ; Ç) ÞÅÔÙÒÅ ÓÔÒÅÌËÉ.
2. ïÅÒÁÔÏÒÙ
71
2. ïÅÒÁÔÏÒÙ 2.1. ðÒÅÆÉËÓÎÁÑ É ÉÎÆÉËÓÎÁÑ ÎÏÔÁ ÉÉ ÷ÙÚÏ×Ù ÆÕÎË ÉÊ, ËÏÔÏÒÙÅ ÍÙ ÒÁÓÓÍÁÔÒÉ×ÁÌÉ ×ÙÛÅ, ÉÓÏÌØÚÏ ×ÁÌÉ ÔÁË ÎÁÚÙ×ÁÅÍÕÀ ÒÅÆÉËÓÎÕÀ ÎÏÔÁ ÉÀ. ÷ ÜÔÏÍ ÓÌÕÞÁÅ ÉÍÑ ÆÕÎË ÉÉ ÒÅÄÛÅÓÔ×ÕÅÔ ÅÅ ÁÒÇÕÍÅÎÔÕ ÉÌÉ ÁÒÇÕÍÅÎÔÁÍ. ïÄÎÁËÏ ÉÚ ÜÌÅÍÅÎÔÁÒÎÏÊ ÍÁÔÅÍÁÔÉËÉ ÎÁÍ ÈÏÒÏÛÏ ÚÎÁËÏÍÙ ×ÙÒÁÖÅÎÉÑ ×ÉÄÁ 1 + 3. ÷ ÎÉÈ ÆÕÎË ÉÏÎÁÌØÎÙÊ ÓÉÍ×ÏÌ ÒÁÓÏÌÏÖÅÎ ÍÅÖÄÕ ÏÅÒÁÎ ÄÁÍÉ. æÕÎË ÉÀ, ÉÓÏÌØÚÕÀÝÕÀ ÔÁËÕÀ ÚÁÉÓØ, ÎÁÚÙ×ÁÀÔ ÉÎÆÉËÓ ÎÏÊ ÆÕÎË ÉÅÊ ÉÌÉ ÏÅÒÁÔÏÒÏÍ. ÷ ÑÚÙËÅ Haskell ÍÏÖÎÏ ÌÀÂÕÀ ÆÕÎË ÉÀ, ÚÁ×ÉÓÑÝÕÀ ÏÔ Ä×ÕÈ ÁÒ ÇÕÍÅÎÔÏ×, ÚÁÉÓÁÔØ × ÉÎÆÉËÓÎÏÊ (ÏÅÒÁÔÏÒÎÏÊ) ÆÏÒÍÅ. äÌÑ ÜÔÏÇÏ ÅÅ ÉÍÑ ÚÁËÌÀÞÁÅÔÓÑ × É ÏÍÅÝÁÅÔÓÑ ÍÅÖÄÕ ÁÒÇÕÍÅÎÔÁÍÉ, ÎÁÒÉÍÅÒ, ×ÙÚÏ× ÆÕÎË ÉÉ newSmallBig ÍÏÖÅÔ ÂÙÔØ ÓÄÅÌÁÎ ËÁË × ÒÅÆÉËÓÎÏÊ, ÔÁË É × ÉÎÆÉËÓÎÏÊ ÆÏÒÍÅ
ÏÂÒÁÔÎÙÅ ÁÏÓÔÒÏÆÙ
---> newSmallBig 31 4 (4,31) ---> 31 `newSmallBig` 4 (4,31) óÉÎÔÁËÓÉÓ ÑÚÙËÁ Haskell ÏÚ×ÏÌÑÅÔ ÏÒÅÄÅÌÑÔØ ÏÅÒÁÔÏÒÙ, Ô. Å. ÔÁËÉÅ ÆÕÎË ÉÉ ÏÔ Ä×ÕÈ ÁÒÇÕÍÅÎÔÏ×, ÒÉ ×ÙÚÏ×Å ËÏÔÏÒÙÈ ÆÕÎË É ÏÎÁÌØÎÙÊ ÓÉÍ×ÏÌ ÒÁÚÍÅÝÁÅÔÓÑ ÍÅÖÄÕ ÁÒÇÕÍÅÎÔÁÍÉ. éÍÑ ÏÅÒÁÔÏ ÒÁ ÍÏÖÅÔ ÓÏÓÔÏÑÔØ ËÁË ÉÚ ÏÄÎÏÇÏ (ÎÁÒÉÍÅÒ, +), ÔÁË É ÉÚ Ä×ÕÈ ÉÌÉ ÂÏÌÅÅ ÓÉÍ×ÏÌÏ× (&&). ðÒÉ ÏÓÔÒÏÅÎÉÉ ÉÍÅÎÉ ÏÅÒÁÔÏÒÁ ÍÏÇÕÔ ÉÓ ÏÌØÚÏ×ÁÔØÓÑ ÔÏÌØËÏ ÓÌÅÄÕÀÝÉÅ ÚÎÁËÉ:
: # $ % & * + - = . / \ < > ? ! ^ | äÏÕÓÔÉÍÙ, ÎÁÒÉÍÅÒ, ÓÌÅÄÕÀÝÉÅ ÉÍÅÎÁ ÏÅÒÁÔÏÒÏ×:
+ ++ && || <= % -*- \/ /\
== /= ... <+>
. ?
// $ :->
ïÅÒÁÔÏÒÙ, ÒÁÓÏÌÏÖÅÎÎÙÅ × ÅÒ×ÏÊ ÓÔÒÏËÅ, ÕÖÅ ÏÒÅÄÅÌÅÎÙ × ÒÅÌÀÄÉÉ. ïÅÒÁÔÏÒÙ ÉÚ ×ÔÏÒÏÊ ÓÔÒÏËÉ ÍÏÖÎÏ ÏÒÅÄÅÌÉÔØ. ïÅÒÁ ÔÏÒ, ÎÁÞÉÎÁÀÝÉÊÓÑ Ó Ä×ÏÅÔÏÞÉÑ (:) ÏÚÎÁÞÁÅÔ ÆÕÎË ÉÀ-ËÏÎÓÔÒÕË ÔÏÒ (ÏÄÒÏÂÎÅÅ ÔÁËÉÅ ÆÕÎË ÉÉ ÂÕÄÕÔ ÒÁÓÓÍÏÔÒÅÎÙ × ÏÄÎÏÊ ÉÚ ÓÌÅ ÄÕÀÝÉÈ ÇÌÁ×). éÍÅÅÔÓÑ ÏÄÉÎÎÁÄ ÁÔØ ËÏÍÂÉÎÁ ÉÊ ÓÉÍ×ÏÌÏ×, ËÏÔÏÒÙÅ ÎÅ ÍÏÇÕÔ ÉÓÏÌØÚÏ×ÁÔØÓÑ × ËÁÞÅÓÔ×Å ÉÍÅÎ ÏÅÒÁÔÏÒÏ×, ÔÁË ËÁË ÏÎÉ ÕÖÅ ÎÁÄÅ ÌÅÎÙ ÓÅ ÉÆÉÞÅÓËÉÍ ÓÍÙÓÌÏÍ × ÑÚÙËÅ Haskell:
::
= .. --
\
|
<-
->
~
=>
H
III. æÕÎË ÉÉ × ÑÚÙËÅ Haskell
72
ïÅÒÁÔÏÒ ÏÒÅÄÅÌÑÅÔÓÑ ÔÁË ÖÅ, ËÁË É ÒÅÆÉËÓÎÙÅ ÆÕÎË ÉÉ, Ó ÕÞÅÔÏÍ ÔÏÇÏ, ÞÔÏ ÅÇÏ ÉÍÑ × ÏÂßÑ×ÌÅÎÉÉ ÔÉÁ É ÒÉ ÏÒÅÄÅÌÅÎÉÉ ÅÇÏ × ×ÉÄÅ ÒÅÆÉËÓÎÏÊ ÆÕÎË ÉÉ (Ô. Å. ÏÍÅÝÁÑ ÅÇÏ ÉÍÑ ÅÒÅÄ ÁÒ ÇÕÍÅÎÔÁÍÉ) . åÓÌÉ ÖÅ × ÏÒÅÄÅÌÅÎÉÉ ÉÓÏÌØÚÕÅÔÓÑ ÉÎÆÉËÓÎÁÑ ÎÏÔÁ ÉÑ, ÔÏ ÉÍÑ ÏÅÒÁÔÏÒÁ ÎÅ ÓÌÅÄÕÅÔ ÚÁËÌÀÞÁÔØ × ÓËÏÂËÉ.
ÉÍÑ ÏÅÒÁÔÏÒÁ ÓÌÅÄÕÅÔ ÚÁËÌÀÞÉÔØ × ËÒÕÇÌÙÅ ÓËÏÂËÉ
I õÒÁÖÎÅÎÉÅ III.2.1
H
ïÒÅÄÅÌÉÍ ÏÅÒÁÔÏÒ, ËÏÔÏÒÙÊ ÄÌÑ Ä×ÕÈ ÅÌÙÈ ÞÉÓÅÌ ×ÙÄÁÅÔ Á ÒÕ, ÓÏÓÔÏÑÝÕÀ ÉÚ ÞÉÓÌÁ, ÏÌÕÞÅÎÎÏÇÏ ÒÉ ÄÅÌÅÎÉÉ ÎÁ ÅÌÏ ÅÒ×ÏÇÏ ÞÉÓÌÁ ÎÁ ×ÔÏÒÏÅ, É ÏÓÔÁÔËÁ ÏÔ ÄÅÌÅÎÉÑ:
(%%) :: Int -> Int -> (Int, Int) (%%) x y = (div x y, rem x y) ó ÉÓÏÌØÚÏ×ÁÎÉÅÍ ÉÎÆÉËÓÎÏÊ ÎÏÔÁ ÉÉ ÏÓÌÅÄÎÅÅ ÏÒÅÄÅÌÅÎÉÅ ÚÁ ÉÛÅÔÓÑ ÔÁË:
x %% y = ( div x y, rem x y) ðÒÉ ×ÙÚÏ×Å ÏÅÒÁÔÏÒÁ ÍÏÖÎÏ ÉÓÏÌØÚÏ×ÁÔØ ËÁË ÒÅÆÉËÓÎÕÀ, ÔÁË É ÉÎÆÉËÓÎÕÀ ÎÏÔÁ ÉÀ:
---> 23 %% 4 (5,3) ---> (%%) 23 4 (5,3)
J
ëÒÏÍÅ ÏÒÅÄÅÌÅÎÉÑ ÏÅÒÁÔÏÒÁ, ÁÎÁÌÏÇÉÞÎÏÇÏ ÏÒÅÄÅÌÅÎÉÀ ÒÅ ÆÉËÓÎÏÊ ÆÕÎË ÉÉ, ÞÁÓÔÏ ÕËÁÚÙ×ÁÅÔÓÑ ÒÉÏÒÉÔÅÔ ÏÅÒÁÔÏÒÁ É ÔÉ ÅÇÏ ÁÓÓÏ ÉÁÔÉ×ÎÏÓÔÉ.
2.2. ðÒÉÏÒÉÔÅÔ ÏÅÒÁÔÏÒÏ×
H
äÌÑ ÏÄÎÏÚÎÁÞÎÏÇÏ ÏÒÅÄÅÌÅÎÉÑ ÏÒÑÄËÁ ×ÙÞÉÓÌÅÎÉÑ ×ÙÒÁÖÅ ÎÉÑ, ÓÏÄÅÒÖÁÝÅÇÏ ÎÅÓËÏÌØËÏ ÒÁÚÌÉÞÎÙÈ ÏÅÒÁÔÏÒÏ×, ÕÞÉÔÙ×ÁÀÔ ÒÉÏÒÉÔÅÔ ÏÅÒÁÔÏÒÏ×. ÷ ÅÒ×ÕÀ ÏÞÅÒÅÄØ ×ÙÏÌÎÑÀÔÓÑ ÔÅ ÏÅÒÁ ÔÏÒÙ, ËÏÔÏÒÙÅ ÉÍÅÀÔ ÂÏÌØÛÉÊ ÒÉÏÒÉÔÅÔ. ÷ ÞÁÓÔÎÏÓÔÉ, × ÑÚÙËÅ Haskell, ËÁË É ÍÁÔÅÍÁÔÉËÅ, ×ÏÚ×ÅÄÅÎÉÅ × ÓÔÅÅÎØ ÉÍÅÅÔ ÂÏÌÅÅ ×ÙÓÏ ËÉÊ ÒÉÏÒÉÔÅÔ, ÞÅÍ ÕÍÎÏÖÅÎÉÅ, ËÏÔÏÒÏÅ × Ó×ÏÀ ÏÞÅÒÅÄØ ×ÙÏÌÎÑ ÅÔÓÑ ÒÁÎØÛÅ ÓÌÏÖÅÎÉÑ.
---> 1 + 3 ^ 4 * 2 163
2. ïÅÒÁÔÏÒÙ
73
ðÒÉÏÒÉÔÅÔ
ïÅÒÁÔÏÒÙ
9 8 7 6 5 4 3 2 1 0
. É !! ^, ^^ É ** *, /, :%, %, `div`, `quot`, `rem` É `mod` +É: É ++ ==, /=, <, <=, >, >=, `elem` É `notElem` && || >>, >>= É =<< $, $! É `seq`
üÔÏÔ ×ÙÚÏ× ÜË×É×ÁÌÅÎÔÅÎ ×ÙÚÏ×Õ 1 + ((3 ^ 4) * 2). îÁÏÍÎÉÍ, ÞÔÏ ÏÅÒÁÔÏÒ ÒÉÍÅÎÅÎÉÑ ÆÕÎË ÉÉ ÉÍÅÅÔ ÓÁ ÍÙÊ ÓÔÁÒÛÉÊ ÒÉÏÒÉÔÅÔ. ÁË, ÚÁÉÓØ square 3 + 4 ÔÒÁËÔÕÅÔÓÑ ËÁË (square 3) + 4. ÷ ÑÚÙËÅ Haskell ÒÉÏÒÉÔÅÔ ÏÅÒÁÔÏÒÁ ÚÁÄÁÅÔÓÑ ÅÌÙÍ ÞÉÓÌÏÍ. þÅÍ ÂÏÌØÛÅ ÞÉÓÌÏ, ÔÅÍ ×ÙÛÅ ÒÉÏÒÉÔÅÔ ÏÅÒÁÔÏÒÁ É ÔÅÍ ÒÁÎØÛÅ ÏÎ ×ÙÏÌÎÑÅÔÓÑ. îÉÖÅ ÒÉ×ÅÄÅÎÁ ÔÁÂÌÉ Á ÒÉÏÒÉÔÅÔÏ× ÏÅÒÁÔÏÒÏ×, ÏÒÅÄÅÌÅÎÎÙÈ × ÒÅÌÀÄÉÉ.
2.3. áÓÓÏ ÉÁÔÉ×ÎÏÓÔØ ÏÅÒÁÔÏÒÏ× ëÏÇÄÁ × ×ÙÒÁÖÅÎÉÉ ÉÓÏÌØÚÕÀÔÓÑ ÏÅÒÁÔÏÒÙ Ó ÒÁ×ÎÙÍ ÒÉÏ ÒÉÔÅÔÏÍ, ÔÏ ÏÒÑÄÏË ×ÙÞÉÓÌÅÎÉÊ ÚÁÄÁÅÔÓÑ Ó ÏÍÏÝØÀ ÓËÏÂÏË ÉÌÉ, ÒÉ ÉÈ ÏÔÓÕÔÓÔ×ÉÉ, ÔÉÏÍ ÁÓÓÏ ÉÁÔÉ×ÎÏÓÔÉ ÏÅÒÁÔÏÒÏ×. ïÅÒÁÔÏ ÒÙ ÍÏÇÕÔ ÂÙÔØ ÁÓÓÏ ÉÁÔÉ×ÎÙ, ÏÂÌÁÄÁÔØ ÔÏÌØËÏ Ó×ÏÊÓÔ×ÏÍ ÁÓÓÏ É ÁÔÉ×ÎÏÓÔÉ ÓÌÅ×Á ÉÌÉ ÁÓÓÏ ÉÁÔÉ×ÎÏÓÔÉ ÓÒÁ×Á. ïÅÒÁÔÏÒÙ ÍÏÇÕÔ ÂÙÔØ É ÎÅÁÓÓÏ ÉÁÔÉ×ÎÙ. îÁÏÍÎÉÍ ÏÒÅÄÅÌÅÎÉÅ ÁÓÓÏ ÉÁÔÉ×ÎÏÓÔÉ. ðÕÓÔØ ÎÅËÉÊ ÏÅÒÁÔÏÒ. åÓÌÉ ×ÙÒÁÖÅÎÉÅ x y z ×ÙÞÉÓÌÑÅÔÓÑ ËÁË (x y ) z ÄÌÑ ÌÀÂÙÈ ÚÎÁÞÅÎÉÊ x, y É z ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÉÈ ÔÉÏ×, ÔÏ ÔÁËÏÊ ÏÅÒÁÔÏÒ ÎÁÚÙ×ÁÅÔÓÑ ïÅÒÁ ÉÑ ×ÙÞÉÔÁÎÉÑ Ñ×ÌÑÅÔÓÑ ÏÅÒÁ ÉÅÊ ÁÓÓÏ ÉÁÔÉ×ÎÏÊ ÓÌÅ×Á:
ÁÓÓÏ ÉÁÔÉ×ÎÙÍ ÓÌÅ×Á.
---> 8 - 4 - 1 3 óÎÁÞÁÌÁ ÂÙÌÏ ×ÙÞÉÓÌÅÎÏ ×ÙÒÁÖÅÎÉÅ 8 4 1.
4, ÒÁ×ÎÏÅ 4, Á ÚÁÔÅÍ ÕÖÅ
H
III. æÕÎË ÉÉ × ÑÚÙËÅ Haskell
74
åÓÌÉ ÒÉ ×ÙÞÉÓÌÅÎÉÉ ×ÙÒÁÖÅÎÉÅ x y z = x (y z ) ÄÌÑ ÌÀÂÙÈ ÚÎÁÞÅÎÉÊ x, y É z ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÉÈ ÔÉÏ×, ÔÏ ÔÁËÏÊ ÏÅÒÁ ÔÏÒ ÎÁÚÙ×ÁÅÔÓÑ ðÒÉÍÅÒÏÍ ÁÓÓÏ ÉÁÔÉ×ÎÏ ÓÔÉ ÓÒÁ×Á Ñ×ÌÑÅÔÓÑ ÏÅÒÁ ÉÑ ×ÏÚ×ÅÄÅÎÉÑ × ÓÔÅÅÎØ ^: 2 ^ 2 ^ 3 ÒÁ×ÎÏ 28 = 256 ËÁË ÜÔÏ É ÒÉÎÑÔÏ × ÍÁÔÅÍÁÔÉËÅ, Á ÎÅ 43 = 64.
ÁÓÓÏ ÉÁÔÉ×ÎÙÍ ÓÒÁ×Á.
äÒÕÇÉÍÉ ÒÉÍÅÒÁÍÉ ÒÁ×ÏÁÓÓÏ ÉÁÔÉ×ÎÙÈ ÏÅÒÁÔÏÒÏ× Ñ×ÌÑÀÔ ÓÑ ÏÅÒÁÔÏÒÙ : (ÏÍÅÓÔÉÔØ ÜÌÅÍÅÎÔ × ÎÁÞÁÌÏ ÓÉÓËÁ) É ÏÅÒÁÔÏÒ -> (ÕËÁÚÁÎÉÅ ÔÉÁ ÆÕÎË ÉÉ): A -> B -> C ÏÚÎÁÞÁÅÔ A -> (B -> C). ïÅÒÁÔÏÒ ÎÁÚÙ×ÁÅÔÓÑ , ÅÓÌÉ
ÁÓÓÏ ÉÁÔÉ×ÎÙÍ
(x y ) z = x (y z ) = x y z
ðÒÉÍÅÒÁÍÉ ÁÓÓÏ ÉÁÔÉ×ÎÙÈ ÏÅÒÁÔÏÒÏ× Ñ×ÌÑÀÔÓÑ + É *. äÌÑ ÔÁËÉÈ ÏÅÒÁÔÏÒÏ× ×ÙÂÏÒ ÏÒÑÄËÁ ×ÙÞÉÓÌÅÎÉÊ ÎÅ ÉÍÅÅÔ ÚÎÁÞÅÎÉÑ.
ÎÅÁÓÓÏ ÉÁÔÉ×ÎÙÍ
H
é, ÎÁËÏÎÅ , ÏÅÒÁÔÏÒ ÎÁÚÙ×ÁÅÔÓÑ , ÅÓÌÉ ×Ù ÒÁÖÅÎÉÅ x y z ÎÅ ÉÍÅÅÔ ÓÍÙÓÌÁ É ×ÓÅÇÄÁ ÔÒÅÂÕÅÔÓÑ ÄÏÂÁ×ÌÅÎÉÅ ÓËÏÂÏË ÄÌÑ ÚÁÄÁÎÉÑ ÏÒÑÄËÁ ×ÙÞÉÓÌÅÎÉÑ ÏÄÏÂÎÏÇÏ ×ÙÒÁÖÅÎÉÑ. îÅÁÓÓÏ ÉÁÔÉ×ÎÙ ×ÓÅ ÏÅÒÁÔÏÒÙ ÓÒÁ×ÎÅÎÉÑ, ÎÁÒÉÍÅÒ,
---> ERROR ---> True ---> True
True == False == False - Ambiguous use of operator "(==)" with "(==)" True == (False == False) (True == False) == False
äÌÑ ÔÏÇÏ ÞÔÏÂÙ ÒÏ×ÅÒÉÔØ, ÒÉÎÁÄÌÅÖÉÔ ÌÉ ×ÅÌÉÞÉÎÁ x ÉÎÔÅÒ×ÁÌÕ (2; 6), ÎÅ ÓÌÅÄÕÅÔ ÉÓÁÔØ 2 < x < 6, ÒÁ×ÉÌØÎÏ ÓÌÅÄÕÀÝÅÅ ÓÒÁ×ÎÅ ÎÉÅ: 2 < x && x <6. ïÔÍÅÔÉÍ, ÞÔÏ ÒÉÍÅÎÅÎÉÅ ÆÕÎË ÉÊ ×ÓÅÇÄÁ ÁÓÓÏ ÉÁÔÉ×ÎÏ ÓÌÅ×Á, ÚÁÉÓØ f x y ÏÚÎÁÞÁÅÔ (f x) y (ÒÉÞÉÎÙ ÜÔÏÇÏ ÏÂÓÕÖÄÁÀÔ ÓÑ ÄÁÌÅÅ).
2.4. ïÒÅÄÅÌÅÎÉÅ ÏÅÒÁÔÏÒÏ× ðÒÉÏÒÉÔÅÔ É ÁÓÓÏ ÉÁÔÉ×ÎÏÓÔØ ÏÅÒÁÔÏÒÏ× ÚÁÄÁÀÔÓÑ Ó ÏÍÏÝØÀ ÏÄÎÏÇÏ ÉÚ ÓÌÅÄÕÀÝÉÈ ËÌÀÞÅ×ÙÈ ÓÌÏ×: infixr ÄÌÑ ÏÅÒÁÔÏÒÁ ÁÓÓÏ ÉÁÔÉ×ÎÏÇÏ ÓÒÁ×Á, infixl ÄÌÑ ÏÅÒÁÔÏÒÁ ÁÓÓÏ ÉÁÔÉ×ÎÏÇÏ ÓÌÅ×Á É infix ÄÌÑ ÎÅÁÓÓÏ ÉÁÔÉ×ÎÏÇÏ ÏÅÒÁÔÏÒÁ. ðÏÓÌÅ ËÌÀÞÅ×ÏÇÏ ÓÌÏ×Á ÕËÁÚÙ×ÁÅÔÓÑ ÞÉÓÌÏ, ÚÁÄÁÀÝÅÅ ÒÉÏÒÉÔÅÔ, Á ÚÁÔÅÍ ÉÍÑ ÏÅÒÁÔÏÒÁ.
óÔÒÏËÁ, ÚÁÄÁÀÝÁÑ ÁÓÓÏ ÉÁÔÉ×ÎÏÓÔØ É ÒÉÏÒÉÔÅÔ, ÄÏÌÖÎÁ ÒÁÓ ÏÌÁÇÁÔØÓÑ ÄÏ ÏÒÅÄÅÌÅÎÉÑ ÏÅÒÁÔÏÒÁ.
2. ïÅÒÁÔÏÒÙ
75
÷ÏÔ ËÁË, ÎÁÒÉÍÅÒ, ÚÁÄÁÅÔÓÑ × ÒÅÌÀÄÉÉ ÒÁ×ÏÁÓÓÏ ÉÁÔÉ×ÎÙÊ ÏÅÒÁÔÏÒ ^ (×ÏÚ×ÅÄÅÎÉÅ × ÓÔÅÅÎØ) Ó ÒÉÏÒÉÔÅÔÏÍ ÒÁ×ÎÙÍ 8:
infixr 8 ^
I õÒÁÖÎÅÎÉÅ III.2.2
ïÒÅÄÅÌÉÍ ÏÅÒÁÔÏÒ !-!, ÁÎÁÌÏÇÉÞÎÙÊ ×ÙÞÉÔÁÎÉÀ, ÎÏ ÁÓÓÏ ÉÁÔÉ× ÎÙÊ ÓÒÁ×Á. ÷ÙÚÏ× 7 3 1 ÄÏÌÖÅÎ ÏÂÒÁÂÁÔÙ×ÁÔØÓÑ ËÁË 7 (3 1). äÌÑ ÜÔÏÇÏ ÏÍÅÓÔÉÍ × ÆÁÊÌ sub.hs ÓÌÅÄÕÀÝÉÊ ÔÅËÓÔ:
infixr 6 !-!
(!-!) :: Num a => a -> a -> a (!-!) x y = x - y úÁÇÒÕÚÉ× ÓËÒÉÔ, ÍÏÖÎÏ ÒÉÓÔÕÁÔØ Ë ÉÓÏÌØÚÏ×ÁÎÉÀ ÎÏ×ÏÇÏ ÏÅ ÒÁÔÏÒÁ:
---> 7 !-! 3 !-! 1 5
J
åÓÌÉ ÔÕ ÉÌÉ ÉÎÕÀ ÆÕÎË ÉÀ, ÏÒÅÄÅÌÑÅÍÕÀ ÒÏÇÒÁÍÍÉÓÔÏÍ, ÌÁÎÉÒÕÅÔÓÑ ÉÓÏÌØÚÏ×ÁÔØ × ËÁÞÅÓÔ×Å ÏÅÒÁÔÏÒÁ, ÔÏ ÏÄÏÂÎÙÍ ÏÂÒÁ ÚÏÍ ÍÏÖÎÏ ÚÁÄÁÔØ ÅÅ ÁÓÓÏ ÉÁÔÉ×ÎÏÓÔØ É ÒÉÏÒÉÔÅÔ.
I õÒÁÖÎÅÎÉÅ III.2.3
éÚ ËÕÒÓÁ ÍÁÔÅÍÁÔÉËÉ ÉÚ×ÅÓÔÎÏ ÏÎÑÔÉÅ ÞÉÓÌÁ ÓÏÞÅÔÁÎÉÊ Cnk , ÞÁÓÔÏ ÏÂÏÚÎÁÞÁÅÍÏÅ ÔÁËÖÅ, ËÁË nk É ×ÙÞÉÓÌÑÅÍÏÅ Ï ÆÏÒÍÕÌÅ
n k
=
n! k! (n k)!
ïÒÅÄÅÌÉÍ ÆÕÎË ÉÀ hoose É ÜË×É×ÁÌÅÎÔÎÙÊ ÅÊ ÏÅÒÁÔÏÒ !^!, ÎÁÈÏÄÑÝÉÊ ÞÉÓÌÏ ÓÏÞÅÔÁÎÉÊ. ÁË ËÁË ÉÎÏÇÄÁ ÒÉÈÏÄÉÔÓÑ ×ÙÞÉÓÌÑÔØ ×ÙÒÁÖÅÎÉÑ, ÁÎÁÌÏÇÉÞ a + b ÎÙÅ , ÔÏ, ÞÔÏÂÙ ÎÅ ÉÓÏÌØÚÏ×ÁÔØ ÄÏÏÌÎÉÔÅÌØÎÙÅ ÓËÏÂËÉ, ÈÏ ÔÅÌÏÓØ ÂÙ ÉÍÅÔØ ÒÉÏÒÉÔÅÔ Õ ÏÒÅÄÅÌÑÅÍÏÇÏ ÏÅÒÁÔÏÒÁ ÍÅÎØÛÉÊ, ÞÅÍ Õ ÓÌÏÖÅÎÉÑ (ÒÁ×ÎÙÊ 6). ó ÄÒÕÇÏÊ ÓÔÏÒÏÎÙ, ÄÏ×ÏÌØÎÏ ÞÁÓÔÏ
a ÉÓÏÌØÚÕÀÔÓÑ ×ÙÒÁÖÅÎÉÑ ×ÉÄÁ b < d , É ÏÜÔÏÍÕ ÒÉÏÒÉÔÅÔ ÄÏÌÖÅÎ ÂÙÔØ ÂÏÌØÛÅ ÒÉÏÒÉÔÅÔÁ ÏÅÒÁÔÏÒÏ× ÓÒÁ×ÎÅÎÉÑ, ËÏÔÏÒÙÊ ÒÁ×ÅÎ 4. óÌÅÄÏ×ÁÔÅÌØÎÏ, ÓÁÍÙÍ ÏÄÈÏÄÑÝÉÍ ÒÉÏÒÉÔÅÔÏÍ ÂÕÄÅÔ ÚÎÁÞÅÎÉÅ 5.
H
III. æÕÎË ÉÉ × ÑÚÙËÅ Haskell
76
ÁË ËÁË ÓÍÙÓÌ ×ÙÒÁÖÅÎÉÑ a ` hoose` b ` hoose` ÎÅ ÏÞÅÎØ ÏÎÑÔÅÎ, ÔÏ ÓÄÅÌÁÅÍ ÎÁÛ ÏÅÒÁÔÏÒ ÎÅÁÓÓÏ ÉÁÔÉ×ÎÙÍ. ðÏÍÅÓÔÉÔÅ ÓÌÅÄÕÀÝÉÊ ÓËÒÉÔ × ÆÁÊÌ hoose.hs:
infix 5 ` hoose`, !^! fa t n | n == 0 = 1 | n > 0 = n * fa t (n-1) | n < 0 = error "ÏÔÒÉ ÁÔÅÌØÎÙÊ ÁÒÇÕÍÅÎÔ!"
hoose x y = fa t x / (fa t y * fa t (x-y)) x !^! y = fa t x / (fa t y * fa t (x-y))
H
úÁÇÒÕÚÉÔÅ ÓËÒÉÔ, ÏÓÌÅ ÞÅÇÏ ÒÉÍÅÎÉÔÅ ÏÅÒÁÔÏÒÙ ÏÄÓÞÅÔÁ ÞÉÓÌÁ ÓÏÞÅÔÁÎÉÊ Ë ÔÅÍ ÉÌÉ ÉÎÙÍ ÄÁÎÎÙÍ:
---> 4.0 ---> 4.0 ---> 20.0 ---> True ---> 10.0
4 ` hoose` 3 4 !^! 3 4 + 2 !^! 3 4 !^! 3 < 5 !^! 2 5 !^! 2
J
÷ÏÒÏÓÙ É ÚÁÄÁÎÉÑ III.2.1
õËÁÖÉÔÅ, ËÁËÉÅ ÉÚ ÒÉ×ÅÄÅÎÎÙÈ ÎÉÖÅ ËÏÍÂÉÎÁ ÉÊ ÓÉÍ×ÏÌÏ×, ÅÓÌÉ ÏÎÉ ×ÓÔÒÅÞÁÀÔÓÑ × ÒÏÇÒÁÍÍÅ ÎÁ ÑÚÙËÅ Haskell, Ñ×ÌÑÀÔÓÑ
ÚÁÒÅÚÅÒ×ÉÒÏ×ÁÎÎÙÍ ÓÌÏ×ÏÍ ÉÌÉ ÓÉÍ×ÏÌÏÍ; ÉÍÅÎÅÍ ÆÕÎË ÉÉ ÉÌÉ ÁÒÁÍÅÔÒÁ; ÏÅÒÁÔÏÒÏÍ; ÎÉÞÅÍ ÉÚ ×ÙÛÅ ÅÒÅÞÉÓÌÅÎÎÏÇÏ.
=> a'a
3a _X
a3a ***
:: 'a'
:= A
:e in
X_1 :-<
<=>
3. ëÁÒÒÉÎÇ ( urrying)
77
3. ëÁÒÒÉÎÇ ( urrying) 3.1. þÁÓÔÉÞÎÁÑ ÁÒÁÍÅÔÒÉÚÁ ÉÑ ïÂÙÞÎÏ × ÏÓÎÏ×Å ÒÏ ÅÓÓÁ ÕÒÏÝÅÎÉÑ ×ÙÒÁÖÅÎÉÑ ÌÅÖÉÔ ÉÄÅÑ ÚÁÍÅÎÙ ÓÌÏÖÎÏÇÏ, ÓÔÒÕËÔÕÒÉÒÏ×ÁÎÎÏÇÏ ÁÒÇÕÍÅÎÔÁ ÏÓÌÅÄÏ×ÁÔÅÌØ ÎÏÓÔØÀ ÂÏÌÅÅ ÒÏÓÔÙÈ. äÌÑ ÉÌÌÀÓÔÒÁ ÉÉ ÒÁÓÓÍÏÔÒÉÍ ÓÎÏ×Á ÆÕÎË ÉÀ smaller, ÏÒÅ ÄÅÌÅÎÎÕÀ ÓÌÅÄÕÀÝÉÍ ÏÂÒÁÚÏÍ
smaller :: (Integer, Integer) -> Integer smaller (x, y) = if x <= y then x else y æÕÎË ÉÑ smaller ÂÅÒÅÔ ÒÏÓÔÏÊ ÁÒÇÕÍÅÎÔ, ÓÏÄÅÒÖÁÝÉÊ ÁÒÕ Å ÌÙÈ ÞÉÓÅÌ, É ×ÏÚ×ÒÁÝÁÅÔ ÅÌÏÅ. äÁÄÉÍ ÄÒÕÇÏÅ ÏÒÅÄÅÌÅÎÉÅ ÔÏÊ ÖÅ ÓÁÍÏÊ Ï ÓÕÝÅÓÔ×Õ ÆÕÎË ÉÉ
smaller :: Integer -> Integer -> Integer smaller x y = if x <= y then x else y æÕÎË ÉÑ smaller ÂÅÒÅÔ Ä×Á ÁÒÇÕÍÅÎÔÁ, ÏÄÉÎ ÚÁ ÄÒÕÇÉÍ. âÏÌÅÅ ÔÏÞ ÎÏ, smaller ÆÕÎË ÉÑ, ËÏÔÏÒÁÑ ÂÅÒÅÔ ÅÌÏÅ x ËÁË ÁÒÇÕÍÅÎÔ É ×ÏÚ ×ÒÁÝÁÅÔ ÆÕÎË ÉÀ smaller x. ÷ Ó×ÏÀ ÏÞÅÒÅÄØ ÆÕÎË ÉÑ smaller x ÂÅÒÅÔ ÅÌÏÅ y × ËÁÞÅÓÔ×Å ÁÒÇÕÍÅÎÔÁ É ×ÏÚ×ÒÁÝÁÅÔ ÅÌÏÅ, Ñ×ÌÑÀ ÝÅÅÓÑ ÍÅÎØÛÉÍ ÉÚ x É y. äÒÕÇÏÊ ÒÉÍÅÒ. ðÕÓÔØ ÆÕÎË ÉÑ plus ÓËÌÁÄÙ×ÁÅÔ Ä×Á ÁÒÇÕÍÅÎ ÔÁ:
plus :: (Integer, Integer) -> Integer plus (x, y) = x + y plus plus x y
:: Integer -> Integer -> Integer = x + y
äÌÑ ËÁÖÄÏÇÏ ÅÌÏÇÏ x ÆÕÎË ÉÑ plus x ÄÏÂÁ×ÌÑÅÔ x Ë Ó×ÏÅÍÕ Å ÌÏÍÕ ÁÒÇÕÍÅÎÔÕ. ÷ ÞÁÓÔÎÏÓÔÉ, plus 1 ÆÕÎË ÉÑ, ËÏÔÏÒÁÑ Õ×Å ÌÉÞÉ×ÁÅÔ ÁÒÇÕÍÅÎÔ ÎÁ 1, plus 0 ÔÏÖÄÅÓÔ×ÅÎÎÁÑ ÆÕÎË ÉÑ ÎÁ ÍÎÏÖÅÓÔ×Å ÅÌÙÈ ÞÉÓÅÌ. üÔÏÔ ÒÏÓÔÏÊ ÒÉÅÍ ÚÁÍÅÎÙ ÓÔÒÕËÔÕÒÉÒÏ×ÁÎÎÙÈ ×ÙÒÁÖÅÎÉÊ ÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔØÀ ÎÅÓËÏÌØËÉÈ ÒÏÓÔÙÈ ÎÁÚÙ×ÁÅÔÓÑ , ÉÌÉ ÞÁÓÔÉÞÎÙÍ ÒÉÍÅÎÅÎÉÅÍ ÆÕÎË ÉÉ, Ï ×ÔÏÒÏÊ ÞÁ ÓÔÉ ÉÍÅÎÉ ÁÍÅÒÉËÁÎÓËÏÇÏ ÌÏÇÉËÁ Haskell B. Curry, ÞØÅ ÉÍÑ ÎÏÓÉÔ É ÑÚÙË Haskell. ÁËÖÅ ÉÓÏÌØÚÕÀÔÓÑ ÔÅÒÍÉÎÙ É . ðÒÉÍÅÎÉ× ËÁÒÒÉÎÇ,
( urrying)
ÎÉÅ ÆÕÎË ÉÉ ÞÁÓÔÉÞÎÁÑ ÁÒÁÍÅÔÒÉÚÁ ÉÑ
ËÁÒÒÉÎÇÏÍ
ÞÁÓÔÉÞÎÏÅ ×ÙÞÉÓÌÅ
III. æÕÎË ÉÉ × ÑÚÙËÅ Haskell
78
ÍÙ ÉÚÂÁ×ÉÌÉÓØ ÏÔ ÓÏÓÔÁ×ÎÏÇÏ ÏÂßÅËÔÁ ÁÒÙ, ÏÌÕÞÉ× ÆÕÎË ÉÀ, ÚÁ×ÉÓÑÝÕÀ ÏÔ Ä×ÕÈ ÒÏÓÔÙÈ ÏÂßÅËÔÏ× (ÞÉÓÅÌ). ëÁË ÕÖÅ ÕÏÍÉÎÁÌÏÓØ, ÏÅÒÁ ÉÑ ÒÉÍÅÎÅÎÉÑ ÆÕÎË ÉÉ ÁÓÓÏ É ÁÔÉ×ÎÁ ÓÌÅ×Á, ÏÜÔÏÍÕ ÚÁÉÓØ
smaller 3 4 plus x y square square 3
H
ÏÚÎÁÞÁÅÔ ÏÚÎÁÞÁÅÔ ÏÚÎÁÞÁÅÔ
(smaller 3) 4 (plus x) y (square square) 3
ëÁË ×ÉÄÉÍ, × ÏÓÌÅÄÎÅÍ ÒÉÍÅÒÅ ÎÅÏÂÈÏÄÉÍÏ ÄÏÂÁ×ÉÔØ ÓËÏÂËÉ (ÚÁ ÉÓÁ× square (square x)), ÔÁË ËÁË ×ÙÒÁÖÅÎÉÅ square square ÎÅ ÉÍÅÅÔ ÓÍÙÓÌÁ ÏÔÏÍÕ. ñÚÙË Haskell ÏÚ×ÏÌÑÅÔ ÅÒÅÄÁÔØ ÒÉ ×ÙÚÏ×Å ÆÕÎË ÉÉ ÌÉÛØ ÞÁÓÔØ ÅÅ ÁÒÁÍÅÔÒÏ×. åÓÌÉ ÆÕÎË ÉÉ plus ÏÌÕÞÉÔ ÔÏÌØËÏ ÏÄÉÎ ÁÒÁÍÅÔÒ, ÎÁÒÉÍÅÒ, plus 1, ÔÏ ÏÎÁ ÏÓÔÁÎÅÔÓÑ × ÓÏÓÔÏÑÎÉÉ ÏÖÉ ÄÁÎÉÑ ÏÓÔÁ×ÛÉÈÓÑ ÁÒÁÍÅÔÒÏ×. ÁËÁÑ ÆÕÎË ÉÑ ÍÏÖÅÔ ÉÓÏÌØÚÏ ×ÁÔØÓÑ ÄÌÑ ÏÒÅÄÅÌÅÎÉÑ ÎÏ×ÙÈ ÆÕÎË ÉÊ:
su
essor :: Integer -> Integer su
essor = plus 1 ÷ÙÚÏ× ÞÁÓÔÉÞÎÏ ÒÉÍÅÎÅÎÎÏÊ ÆÕÎË ÉÉ ÎÉÞÅÍ ÎÅ ÏÔÌÉÞÁÅÔÓÑ ÏÔ ×ÙÚÏ×Ï× ÄÒÕÇÉÈ ÆÕÎË ÉÊ:
---> su
essor 4 5 ïÂÒÁÔÉÔÅ ×ÎÉÍÁÎÉÅ ÎÁ ÏÒÅÄÅÌÅÎÉÅ ÆÕÎË ÉÉ: × ÎÅÍ ÎÅ ÕÞÁÓÔ×Õ ÅÔ ÁÒÁÍÅÔÒ. ÁËÁÑ ÆÏÒÍÁ ÚÁÉÓÉ Ñ×ÌÑÅÔÓÑ ÂÏÌÅÅ ¾ÆÕÎË ÉÏÎÁÌØ ÎÏÊ¿, ÞÅÍ Ó ÉÓÏÌØÚÏ×ÁÎÉÅÍ ÁÒÇÕÍÅÎÔÁ:
su
essor x = plus 1 x ïÔÍÅÔÉÍ Ä×Á ÒÅÉÍÕÝÅÓÔ×Á ÞÁÓÔÉÞÎÏ ÒÉÍÅÎÅÎÎÙÈ ÆÕÎË ÉÊ. ÷Ï-ÅÒ×ÙÈ, ËÁÒÒÉÎÇ ÏÍÏÇÁÅÔ ÕÍÅÎØÛÉÔØ ÞÉÓÌÏ ÓËÏÂÏË ÒÉ ÚÁÉÓÉ ×ÙÒÁÖÅÎÉÑ. ÷Ï-×ÔÏÒÙÈ, ÕÏÔÒÅÂÌÅÎÉÅ ËÁÒÒÉÎÇÏ×ÙÈ ÆÕÎË ÉÊ Ï Ú×ÏÌÑÅÔ ÓÄÅÌÁÔØ ÒÏÇÒÁÍÍÕ ÅÝÅ ¾ÆÕÎË ÉÏÎÁÌØÎÅÅ¿. ðÏÑÓÎÉÍ Ï ÓÌÅÄÎÅÅ ÕÔ×ÅÒÖÄÅÎÉÅ ÒÉÍÅÒÏÍ. òÁÓÓÍÏÔÒÉÍ ÆÕÎË ÉÀ twi e, ËÏ ÔÏÒÁÑ ÏÚ×ÏÌÑÅÔ ÒÉÍÅÎÉÔØ ÏÄÎÕ É ÔÕ ÖÅ ÆÕÎË ÉÀ Ä×ÁÖÄÙ
twi e :: (Integer -> Integer) -> (Integer -> Integer) twi e f x = f (f x) ÁËÏÅ ÏÒÅÄÅÌÅÎÉÅ ÏÌÎÏÓÔØÀ ÓÏÏÔ×ÅÔÓÔ×ÕÅÔ ÓÉÎÔÁËÓÉÓÕ ÑÚÙËÁ Haskell. ðÅÒ×ÙÊ ÁÒÇÕÍÅÎÔ ÆÕÎË ÉÉ twi e Ñ×ÌÑÅÔÓÑ ÆÕÎË ÉÅÊ Ó ÏÂßÑ×ÌÅÎÉÅÍ ÔÉÁ Integer -> Integer, ×ÔÏÒÏÊ ÁÒÇÕÍÅÎÔ ÅÌÏÅ ÞÉÓÌÏ. ðÒÉÍÅÎÉ× twi e ÌÉÛØ Ë ÅÒ×ÏÍÕ ÁÒÇÕÍÅÎÔÕ f, ÍÙ ÏÌÕÞÉÍ
3. ëÁÒÒÉÎÇ ( urrying)
79
ÆÕÎË ÉÀ twi e f, Ä×ÁÖÄÙ ÒÉÍÅÎÑÀÝÕÀ ÆÕÎË ÉÀ f. ó ÅÅ ÏÍÏ ÝØÀ ÍÏÖÎÏ ÏÒÅÄÅÌÉÔØ ÆÕÎË ÉÀ quad, ×ÏÚ×ÏÄÑÝÕÀ Ó×ÏÊ ÁÒÇÕÍÅÎÔ × ÞÅÔ×ÅÒÔÕÀ ÓÔÅÅÎØ, ÎÁÒÉÍÅÒ, ÔÁË
quad :: Integer -> Integer quad = twi e square íÙ ÏÌÕÞÉÌÉ ÏÒÅÄÅÌÅÎÉÅ ÆÕÎË ÉÉ, × ËÏÔÏÒÏÍ ÎÅ ÚÁÄÅÊÓÔ×Ï×ÁÎÙ ÎÉËÁËÉÅ ÁÒÁÍÅÔÒÙ. ó ÄÒÕÇÏÊ ÓÔÏÒÏÎÙ, ÒÉ ÏÒÅÄÅÌÅÎÉÉ twi e × ÎÅËÁÒÒÉÎÇÏ×ÏÊ ÆÏÒÍÅ
twi e :: (Integer -> Integer, Integer) -> Integer twi e (f, x) = f (f x)
ÕÖÅ ÎÅ×ÏÚÍÏÖÎÏ ×ÙÚ×ÁÔØ ÆÕÎË ÉÀ ÂÅÚ ÕËÁÚÁÎÉÑ ÁÒÇÕÍÅÎÔÁ, Ë ËÏ ÔÏÒÏÍÕ ÆÕÎË ÉÑ ÒÉÍÅÎÑÅÔÓÑ. ÷ÍÅÓÔÏ ÓÌÏ× ¾ ¿, ÍÙ ÄÏÌÖÎÙ ÇÏ×ÏÒÉÔØ ¾ ¿. ÷ÔÏÒÏÊ ÓÔÉÌØ ÂÏÌÅÅ ÇÒÏÍÏÚÄËÉÊ.
square ÄÌÑ ÌÀÂÏÇÏ x
quad, ÇÄÅ quad = twi e quad, ÇÄÅ quad x = twi e (square, x)
÷ ÓÌÕÞÁÅ ÎÅÏÂÈÏÄÉÍÏÓÔÉ ×ÓÅÇÄÁ ÍÏÖÎÏ ÒÅÏÂÒÁÚÏ×ÁÔØ ÆÕÎË ÉÀ Ë ×ÉÄÕ ÞÁÓÔÉÞÎÏ ÒÉÍÅÎÅÎÎÏÊ Ó ÏÍÏÝØÀ ÆÕÎË ÉÉ urry, ËÏÔÏÒÁÑ ÂÅÒÅÔ ÎÅ ËÁÒÒÉÎÇÏ×ÕÀ ÆÕÎË ÉÀ É ÒÅÏÂÒÁÚÕÅÔ ÅÅ Ë ÞÁÓÔÉÞÎÏ ÒÉ ÍÅÎÅÎÎÏÊ ÆÏÒÍÅ. ÷ÏÔ ÅÅ ÏÒÅÄÅÌÅÎÉÅ, ÓÏÄÅÒÖÁÝÅÅÓÑ × ÒÅÌÀÄÉÉ
urry
urry f x y
:: ((a,b) -> ) -> (a -> b -> ) = f (x,y)
É ÚÁÇÏÌÏ×ËÁ × ÆÕÎË ÉÉ urry ÂÕÄÅÔ ÒÁÓÓÍÏÔÒÅÎ ÄÁÌÅÅ. úÁÍÅÔÉÍ, ÞÔÏ urry ÓÁÍÁ ÒÅÄÓÔÁ×ÌÑÅÔ ÓÏÂÏÊ ÞÁÓÔÉÞÎÏ ÒÉÍÅÎÅÎÎÕÀ ÆÕÎË ÉÀ: ÏÎÁ ÏÌÕÞÁÅÔ ÔÒÉ ÁÒÇÕÍÅÎÔÁ, ÏÄÉÎ ÚÁ ÄÒÕÇÉÍ. ÅÅÒØ ÍÙ ÍÏ ÖÅÍ ÉÓÏÌØÚÏ×ÁÔØ urry f ÄÌÑ ÏÌÕÞÅÎÉÑ ÞÁÓÔÉÞÎÏ ÒÉÍÅÎÅÎÎÏÇÏ ×ÁÒÉÁÎÔÁ ÌÀÂÏÊ ÆÕÎË ÉÉ f. îÁÒÉÍÅÒ, plus = urry plus. æÕÎË ÉÑ un urry ÏÓÕÝÅÓÔ×ÌÑÅÔ ÏÂÒÁÔÎÏÅ ÒÅÏÂÒÁÚÏ×ÁÎÉÅ ÏÎÁ ÒÅ×ÒÁÝÁÅÔ ÆÕÎË ÉÀ Ó Ä×ÕÍÑ ÁÒÁÍÅÔÒÁÍÉ × ÅÅ ÎÅËÁÒÒÉÎÇÏ ×ÕÀ ÆÏÒÍÕ:
un urry :: (a -> b -> ) -> ((a,b) -> ) un urry f (x, y) = f x y 3.2. óËÏÂËÉ × ÆÕÎË ÉÏÎÁÌØÎÏÊ ÚÁÉÓÉ ÷ÏÚÍÏÖÎÏÓÔØ ÞÁÓÔÉÞÎÏÊ ÁÒÁÍÅÔÒÉÚÁ ÉÉ ÏÚ×ÏÌÑÅÔ Ï ÎÏ×ÏÍÕ ×ÚÇÌÑÎÕÔØ ÎÁ ÔÉ ÆÕÎË ÉÉ plus . æÕÎË ÉÑ plus 1 ÉÍÅÅÔ ÔÏÔ ÖÅ
III. æÕÎË ÉÉ × ÑÚÙËÅ Haskell
80
ÔÉ, ÞÔÏ É su
essor: Integer -> Integer. óÌÅÄÏ×ÁÔÅÌØÎÏ, ÆÕÎË ÉÑ plus , ËÏÔÏÒÁÑ × ËÁÞÅÓÔ×Å ÁÒÁÍÅÔÒÁ ÏÌÕÞÁÅÔ ÏÄÎÏ ÅÌÏÅ ÞÉ ÓÌÏ, ÄÏÌÖÎÁ ÉÍÅÔØ ÔÉ Integer -> (Integer -> Integer) (×ÅÄØ ÅÅ ÒÅÚÕÌØÔÁÔ ÆÕÎË ÉÑ, ÁÎÁÌÏÇÉÞÎÁÑ su
essor). ðÒÅÄÏÌÏÖÉÍ, ÞÔÏ -> ÁÓÓÏ ÉÁÔÉ×ÎÁ ÓÒÁ×Á É ÏÕÓÔÉÍ ÓËÏÂËÉ:
plus
:: Integer -> Integer -> Integer
üÔÏ ÏÂßÑ×ÌÅÎÉÅ × ÔÏÞÎÏÓÔÉ ÓÏ×ÁÄÁÅÔ Ó ÏÂßÑ×ÌÅÎÉÅÍ ÆÕÎË ÉÉ, ÚÁ ×ÉÓÑÝÉÊ ÏÔ Ä×ÕÈ ÁÒÇÕÍÅÎÔÏ×, ÏÂÓÕÖÄÁ×ÛÕÀÓÑ ÎÁ ÓÔÒÁÎÉ Å 77. ÷ ÄÅÊÓÔ×ÉÔÅÌØÎÏÓÔÉ ÜÔÏ ÎÅ ÅÓÔØ ÆÕÎË ÉÑ Ó Ä×ÕÍÑ ÁÒÁÍÅÔÒÁÍÉ. üÔÏ ÆÕÎË ÉÑ, ÚÁ×ÉÓÑÝÁÑ ÏÔ ÏÄÎÏÇÏ ÁÒÁÍÅÔÒÁ É ×ÏÚ×ÒÁÝÁÀÝÁÑ ÆÕÎË ÉÀ, ËÏÔÏÒÁÑ ÔÁËÖÅ ÂÅÒÅÔ ÔÏÌØËÏ ÏÄÉÎ ÁÒÁÍÅÔÒ, É ×ÙÏÌ ÎÑÅÔ ÖÅÌÁÅÍÏÅ ÄÅÊÓÔ×ÉÅ. á ×ÓÅ ×ÍÅÓÔÅ ÓÏÚÄÁÅÔ ÉÌÌÀÚÉÀ ÔÏÇÏ, ÞÔÏ ÉÓÈÏÄÎÁÑ ÆÕÎË ÉÑ ÚÁ×ÉÓÉÔ ÏÔ Ä×ÕÈ ÁÒÇÕÍÅÎÔÏ×.
ðÒÉÅÍ ÒÅÄÓÔÁ×ÌÅÎÉÑ ÆÕÎË ÉÉ ÏÔ ÎÅÓËÏÌØËÉÈ ÁÒÁÍÅÔÒÏ×, × ×ÉÄÅ ÆÕÎË ÉÉ ÏÔ ÏÄÎÏÇÏ ÁÒÇÕÍÅÎÔÁ, ÎÁÚÙ×ÁÅÔÓÑ . ¾îÅ×ÉÄÉÍÙÊ¿ ÏÅÒÁÔÏÒ ÒÉÍÅÎÅÎÉÑ ÆÕÎË ÉÉ ÁÓÓÏ ÉÁÔÉ×ÅÎ ÓÌÅ×Á. üÔÏ ÏÚÎÁÞÁÅÔ, ÞÔÏ ×ÙÒÁÖÅÎÉÅ plus 1 2 ×ÙÞÉÓÌÑÅÔÓÑ ËÁË ËÁÒÒÉÎÇ
(plus 1) 2, ÞÔÏ × ÔÏÞÎÏÓÔÉ ÓÏÏÔ×ÅÔÓÔ×ÕÅÔ ÔÉÕ ÆÕÎË ÉÉ plus ÏÎÁ ÂÅÒÅÔ ÏÄÉÎ ÁÒÇÕÍÅÎÔ (ÎÁÒÉÍÅÒ, ÞÉÓÌÏ 1) É ×ÏÚ×ÒÁÝÁÅÔ ÆÕÎË ÉÀ, ËÏÔÏÒÁÑ ÒÉÍÅÎÑÅÔÓÑ Ë ÓÌÅÄÕÀÝÅÍÕ ÁÒÇÕÍÅÎÔÕ (2 × ÎÁÛÅÍ ÒÉÍÅÒÅ). ðÒÅÄÏÌÏÖÉ×, ÞÔÏ ÒÉÍÅÎÅÎÉÅ ÆÕÎË ÉÉ ÁÓÓÏ ÉÁÔÉ×ÎÏ ÓÌÅ×Á, ÔÏ ÏÌÕÞÉÌÉ ÂÙ plus (1 2), ÞÔÏ ÏÚÎÁÞÁÅÔ ÒÉÍÅÎÅÎÉÅ ÞÉÓÌÁ 1 Ë ÞÉÓÌÕ 2 (ÓÏ×ÅÒÛÅÎÎÏ ÎÅÏÎÑÔÎÏ, ËÁË ÜÔÏ ÍÏÖÎÏ ÂÙÌÏ ÂÙ ÓÄÅÌÁÔØ!), Á ÚÁÔÅÍ Ë ÒÅÚÕÌØÔÁÔÕ ÒÉÍÅÎÑÅÔÓÑ ÆÕÎË ÉÑ plus . ïÔÓÀÄÁ ÏÌÕÞÁÅÍ ÓÌÅÄÕÀÝÉÅ ÒÁ×ÉÌÁ ÒÁÓÓÔÁÎÏ×ËÉ ÓËÏÂÏË. åÓ ÌÉ ÉÍÅÅÔÓÑ ÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔØ ÎÅËÏÔÏÒÙÈ ×ÅÌÉÞÉÎ × ×ÙÒÁÖÅÎÉÉ, ÅÒ×ÁÑ ÉÚ ËÏÔÏÒÙÈ ÒÉÍÅÎÑÅÔÓÑ Ë ÄÒÕÇÉÍ, ÎÁÒÉÍÅÒ, f a b d, ÔÏ ÏÎÁ ÉÎÔÅÒÒÅÔÉÒÕÅÔÓÑ ËÁË ((((f a) b) ) d). åÓÌÉ ×ÅÌÉÞÉÎÁ a ÉÍÅÅÔ ÔÉ A, ×ÅÌÉÞÉÎÁ b ÔÉ B É ÔÁË ÄÁÌÅÅ, ÔÏ ÔÉ ÆÕÎË ÉÉ f × ÜÔÏÍ ÓÌÕÞÁÅ ÔÁËÏ× f :: A -> B -> C -> D -> E, ÉÌÉ, ÄÏ ÂÁ×ÌÑÑ ×ÓÅ ÓËÏÂËÉ, f :: A -> (B -> (C -> (D -> E))). ëÏÎÅÞÎÏ, ÚÁÉÓØ ÂÅÚ ÓËÏÂÏË ÎÁÍÎÏÇÏ ÕÄÏÂÎÅÅ É ÏÎÑÔÎÅÅ. áÓÓÏ ÉÁÔÉ×ÎÏÓÔØ -> É ÒÉÍÅÎÅÎÉÑ ÆÕÎË ÉÉ, ×ÙÂÒÁÎÎÙÅ ÔÁËÉÍ ÏÂÒÁÚÏÍ, ÏÚ×ÏÌÑÅÔ ÒÉÍÅÎÑÔØ ËÁÒÒÉÎÇ ÓÏ×ÅÒÛÅÎÎÏ ÎÅÚÁÍÅÔÎÏ: ÒÉÍÅÎÅÎÉÅ ÆÕÎË ÉÉ ÁÓÓÏ ÉÁÔÉ×ÎÏ ÓÌÅ×Á, Á ÏÅÒÁ ÉÑ -> ÁÓÓÏ ÉÁÔÉ×ÎÁ ÓÒÁ×Á. ìÅÇËÏ ÚÁ ÏÍÎÉÔØ ÓÌÅÄÕÀÝÅÅ ÒÁ×ÉÌÏ:
ÅÓÌÉ ÇÄÅ-ÔÏ ÏÔÓÕÔÓÔ×ÕÀÔ ÓËÏÂËÉ, ÔÏ ÏÎÉ ÄÏÌÖÎÙ ÒÁÚÍÅÝÁÔØÓÑ ÔÁË, ÞÔÏÂÙ ÂÙÌ ×ÏÚÍÏÖÅÎ ËÁÒÒÉÎÇ.
3. ëÁÒÒÉÎÇ ( urrying)
81
óËÏÂËÉ ÒÅËÏÍÅÎÄÕÅÔÓÑ ÓÔÁ×ÉÔØ ÔÏÌØËÏ ÔÁÍ, ÇÄÅ ÏÎÉ ÄÅÊÓÔ×ÉÔÅÌØÎÏ ÎÅÏÂÈÏÄÉÍÙ. ðÒÉ×ÅÄÅÍ ÎÅÓËÏÌØËÏ ÒÉÍÅÒÏ×. óËÏÂËÉ ÔÒÅÂÕÀÔÓÑ ÒÉ ÕËÁÚÁÎÉÉ ÔÉÁ ÆÕÎË ÉÉ, ÅÓÌÉ ÏÎÁ (ÒÉ ËÁÒÒÉÎÇÅ ÆÕÎË ÉÑ ×ÙÄÁÅÔ ÆÕÎË ÉÀ × ËÁÞÅÓÔ×Å ÒÅÚÕÌØÔÁÔÁ). îÁÒÉÍÅÒ, × ÒÅÌÀÄÉÉ ÏÉÓÁÎÁ ÆÕÎË ÉÑ map, ËÏÔÏÒÁÑ ÒÉÍÅÎÑÅÔ ÔÕ ÉÌÉ ÉÎÕÀ ÆÕÎË ÉÀ ËÏ ×ÓÅÍ ÜÌÅÍÅÎÔÁÍ ÓÉÓËÁ:
ÆÕÎË ÉÀ × ËÁÞÅÓÔ×Å ÁÒÁÍÅÔÒÁ
ÂÅÒÅÔ
---> map sqrt [1, 4, 9, 16℄ [1.0,2.0,3.0,4.0℄ ---> map even [1, 2, 3, 4℄ [False,True,False,True℄ ---> map (plus 1) [1, 2, 3, 4℄ [2,3,4,5℄
H
É ÆÕÎË ÉÉ map ÔÁËÏ×:
map :: (a -> b) -> [a℄ -> [b℄ óËÏÂËÉ × ×ÙÒÁÖÅÎÉÉ (a -> b) ÎÅÏÂÈÏÄÉÍÙ, ÔÁË ËÁË ÉÎÁÞÅ ÏÌÕÞÁ ÌÏÓØ ÂÙ, ÞÔÏ ÆÕÎË ÉÑ map ÚÁ×ÉÓÉÔ ÏÔ ÔÒÅÈ ÁÒÁÍÅÔÒÏ×. óËÏÂËÉ ÎÅÏÂÈÏÄÉÍÙ ÔÁËÖÅ, ÅÓÌÉ × ×ÙÒÁÖÅÎÉÉ ÒÅÚÕÌØÔÁÔ ×ÙÏÌ ÎÅÎÉÑ ÏÄÎÏÊ ÆÕÎË ÉÉ ÅÒÅÄÁÅÔÓÑ ÄÒÕÇÏÊ, ÎÁÒÉÍÅÒ, ÅÓÌÉ ÔÒÅÂÕÅÔ ÓÑ ×ÙÞÉÓÌÉÔØ ËÏÒÅÎØ Ë×ÁÄÒÁÔÎÙÊ ÉÚ ÓÉÎÕÓÁ ÞÉÓÌÁ:
---> sin (pi/2) 1.0 ---> sqrt (sin (pi/2)) 1.0 ÷ ÅÒ×ÏÍ ÓÌÕÞÁÅ ÓËÏÂËÉ ÎÅÏÂÈÏÄÉÍÙ, ÔÁË ËÁË ÒÉÏÒÉÔÅÔ ÏÅÒÁ ÉÉ ÒÉÍÅÎÅÎÉÑ ÆÕÎË ÉÉ ×ÙÛÅ ÒÉÏÒÉÔÅÔÁ ÄÅÌÅÎÉÑ, Á ×Ï ×ÔÏÒÏÍ ÓÌÕ ÞÁÅ ÂÅÚ ÓËÏÂÏË ÏÌÕÞÉÌÏÓØ ÂÙ ×ÏÏÂÝÅ ÂÅÓÓÍÙÓÌÅÎÎÏÅ ×ÙÒÁÖÅÎÉÅ sqrt sin (pi/2) ÏÙÔËÁ ÉÚ×ÌÅÞØ Ë×ÁÄÒÁÔÎÙÊ ËÏÒÅÎØ ÉÚ ÆÕÎË ÉÉ.
3.3. ïÅÒÁÔÏÒÎÙÅ ÓÅË ÉÉ þÁÓÔÉÞÎÏ ÁÒÁÍÅÔÒÉÚÏ×ÁÎÎÙÅ ÏÅÒÁÔÏÒÙ ÄÏÕÓËÁÀÔ ÉÓÏÌØÚÏ ×ÁÎÉÅ Ä×ÕÈ ÓÅ ÉÁÌØÎÙÈ ÎÏÔÁ ÉÊ ÒÉ ÉÈ ÚÁÉÓÉ:
(x) ÏÅÒÁÔÏÒ ÞÁÓÔÉÞÎÏ ÁÒÁÍÅÔÒÉÚÏ×ÁÎ ÅÒÅÍÅÎÎÏÊ x × ËÁÞÅÓÔ×Å ÒÁ×ÏÇÏ ÁÒÇÕÍÅÎÔÁ; (x) ÏÅÒÁÔÏÒ ÞÁÓÔÉÞÎÏ ÁÒÁÍÅÔÒÉÚÏ×ÁÎ ÅÒÅÍÅÎÎÏÊ x × ËÁÞÅÓÔ×Å ÌÅ×ÏÇÏ ÁÒÇÕÍÅÎÔÁ.
H
III. æÕÎË ÉÉ × ÑÚÙËÅ Haskell
82
ÏÅÒÁÔÏÒÎÙÅ ÓÅË ÉÉ
H
ÁËÉÅ ÎÏÔÁ ÉÉ ÎÏÓÑÔ ÎÁÚ×ÁÎÉÅ . þÁÝÅ ×ÓÅÇÏ ÏÅÒÁÔÏÒÎÙÅ ÓÅË ÉÉ ÉÓÏÌØÚÕÀÔÓÑ, ÅÓÌÉ ÔÒÅÂÕÅÔÓÑ ÅÒÅÄÁÔØ ÞÁ ÓÔÉÞÎÏ ÁÒÁÍÅÔÒÉÚÏ×ÁÎÎÕÀ ÆÕÎË ÉÀ × ËÁÞÅÓÔ×Å ÁÒÁÍÅÔÒÁ:
---> map (2*) [1, 2, 3℄ [2,4,6℄
I õÒÁÖÎÅÎÉÅ III.3.1
H
òÁÓÓÍÏÔÒÉÍ ÎÅÓËÏÌØËÏ ÒÉÍÅÒÏ× ÆÕÎË ÉÊ, ÚÁÉÓÁÎÎÙÈ × ×ÉÄÅ ÏÅ ÒÁÔÏÒÎÙÈ ÓÅË ÉÊ. óÏÚÄÁÊÔÅ ÓËÒÉÔ se tions.hs, × ËÏÔÏÒÙÊ ÏÍÅ ÓÔÉÔÅ ÓÌÅÄÕÀÝÉÊ ËÏÄ:
su
essor double half reverse' square twoPower oneDigit isZero
= = = = = = = =
(+1) (2*) (/2.0) (1.0/) (^2) (2^) (<=9) (==0)
---------
Õ×ÅÌÉÞÉÔØ ÞÉÓÌÏ ÎÁ 1 ÕÍÎÏÖÉÔØ ÞÉÓÌÏ ÎÁ 2 ÏÌÏ×ÉÎÁ ÞÉÓÌÁ ÏÂÒÁÔÎÁÑ ×ÅÌÉÞÉÎÁ Ë×ÁÄÒÁÔ ÞÉÓÌÁ ×ÏÚ×ÅÄÅÎÉÅ Ä×Á × ÓÔÅÅÎØ ÞÉÓÌÏ ÉÚ ÏÄÎÏÊ ÉÆÒÙ ÞÉÓÌÏ ÒÁ×ÎÏ 0
úÁÇÒÕÚÉÔÅ ÓËÒÉÔ É ÏÒÁÂÏÔÁÊÔÅ Ó ÆÕÎË ÉÑÍÉ, ÏÒÅÄÅÌÅÎÎÙÍÉ × ×ÉÄÅ ÏÅÒÁÔÏÒÎÙÈ ÓÅË ÉÊ:
---> su
essor 100000 100001 ---> double 256 512 ---> half 512 256.0 ---> reverse' 2 0.5 ---> square 8 64 ---> twoPower 8 256 ---> oneDigit 23 False ---> oneDigit 2 True ---> isZero 0 True
J
3. ëÁÒÒÉÎÇ ( urrying)
83
÷ÏÒÏÓÙ É ÚÁÄÁÎÉÑ III.3.1
ïÒÅÄÅÌÉÔÅ ÆÕÎË ÉÀ un urry, ËÏÔÏÒÁÑ ÏÓÕÝÅÓÔ×ÌÑÅÔ ÒÅÏÂÒÁÚÏ ×ÁÎÉÅ, ÏÂÒÁÔÎÏÅ Ë ÄÅÊÓÔ×ÉÀ ÆÕÎË ÉÉ urry. III.3.2
ëÁËÉÅ ÓËÏÂËÉ Ñ×ÌÑÀÔÓÑ ÌÉÛÎÉÍÉ × ÓÌÅÄÕÀÝÉÈ ×ÙÒÁÖÅÎÉÑÈ?
(plus 3) (plus 4 5) sqrt (3.0) + (sqrt 4.0) (+) (3) (4) (2*3) +(4*5) (2+3)*(4+5) (a -> b) -> ( -> d)
III.3.3
äÁÊÔÅ ÏÒÅÄÅÌÅÎÉÑ ÔÒÅÈ ÆÕÎË ÉÊ ÓÏ ÓÌÅÄÕÀÝÉÍÉ ÏÂßÑ×ÌÅÎÉÑÍÉ ÔÉÁ:
(Float -> Float) -> Float Float -> (Float -> Float) (Float -> Float) -> (Float
III.3.4
-> Float)
÷ ÑÚÙËÅ Pas al ÏÅÒÁÔÏÒ && ÉÍÅÅÔ ÔÏÔ ÖÅ ÒÉÏÒÉÔÅÔ, ÞÔÏ É , Á || ÔÏÔ ÖÅ, ÞÔÏ É +. ñ×ÌÑÅÔÓÑ ÌÉ ÜÔÏ ÒÁ×ÉÌØÎÙÍ?
çÌÁ×Á IV
æÕÎË ÉÉ ×ÙÓÛÅÇÏ ÏÒÑÄËÁ ÷ ÜÔÏÊ ÇÌÁ×Å ÂÕÄÅÔ ÒÁÓÓÍÏÔÒÅÎÏ ÅÝÅ ÏÄÎÏ ×ÁÖÎÏÅ Ó×ÏÊÓÔ×Ï ÆÕÎË ÉÏÎÁÌØÎÙÈ ÑÚÙËÏ×, Á ÉÍÅÎÎÏ, ×ÏÚÍÏÖÎÏÓÔØ ÒÉÍÅÎÅÎÉÑ ÆÕÎË ÉÊ ×ÙÓÛÅÇÏ ÏÒÑÄËÁ. ÷ ÒÁÎÅÅ ÒÉ×ÅÄÅÎÎÙÈ ÒÉÍÅÒÁÈ ËÁ ÖÄÁÑ ÆÕÎË ÉÑ ÒÁÓÓÍÁÔÒÉ×ÁÌÁÓØ ËÁË ÓÔÁÔÉÞÅÓËÁÑ (ÎÅÉÚÍÅÎÎÁÑ) ÞÁÓÔØ ËÏÄÁ ÄÌÑ ÒÅÏÂÒÁÚÏ×ÁÎÉÑ ×ÈÏÄÎÙÈ ×ÅÌÉÞÉÎ × ×ÙÈÏÄÎÙÅ. üÔÏ ÔÁË ÎÁÚÙ×ÁÅÍÙÅ ÆÕÎË ÉÉ ÅÒ×ÏÇÏ ÏÒÑÄËÁ. ëÏÎ Å ÉÑ ÆÕÎË ÉÊ ×ÙÓÛÅÇÏ ÏÒÑÄËÁ ×ÏÚÎÉËÁÅÔ ÉÚ ÉÄÅÉ Ï ÔÏÍ, ÞÔÏ ÆÕÎË ÉÉ ÄÏÌÖÎÙ ÉÍÅÔØ ÔÏÔ ÖÅ ÓÔÁÔÕÓ, ÞÔÏ É ÌÀÂÏÊ ÉÎÏÊ ÏÂßÅËÔ: ÏÄÎÉ ÆÕÎË ÉÉ ÍÏ ÇÕÔ ÂÙÔØ ×ÈÏÄÎÙÍÉ É ×ÙÈÏÄÎÙÍÉ ÄÁÎÎÙÍÉ ÄÒÕÇÉÈ. ÷ ÜÔÏÊ ÇÌÁ×Å ÍÙ ÏÚÎÁËÏÍÉÍÓÑ ÓÏ ÓÔÉÌÑÍÉ ÒÉÍÅÎÅÎÉÑ ÆÕÎË ÉÊ ×ÙÓÛÅÇÏ ÏÒÑÄËÁ É ÒÁÓÓÍÏÔÒÉÍ ÒÑÄ ÒÉÍÅÒÏ× ÉÈ ÉÓÏÌØÚÏ×Á ÎÉÑ ÎÁ ÒÁËÔÉËÅ.
1. æÕÎË ÉÉ ÎÁ ÓÉÓËÁÈ ÷ ÆÕÎË ÉÏÎÁÌØÎÏÍ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÉ ÆÕÎË ÉÉ ×Ï ÍÎÏÇÉÈ ÁÓÅËÔÁÈ ×ÅÄÕÔ ÓÅÂÑ ÔÁË ÖÅ, ËÁË É ÄÒÕÇÉÅ ÔÉÙ ÄÁÎÎÙÈ, ÎÁÒÉÍÅÒ, ÞÉÓÌÁ ÉÌÉ ÓÉÓËÉ. ÁË,
ÆÕÎË ÉÉ ÉÍÅÀÔ ÔÉ; ÆÕÎË ÉÉ ÍÏÇÕÔ ÂÙÔØ
ÒÅÚÕÌØÔÁÔÏÍ ÒÁÂÏÔÙ ÄÒÕÇÉÈ ÆÕÎË
ÉÊ; ÆÕÎË ÉÉ ÍÏÇÕÔ ÉÓÏÌØÚÏ×ÁÔØÓÑ × ËÁÞÅÓÔ×Å ÁÒÁÍÅÔÒÁ (ÁÒ ÇÕÍÅÎÔÁ) ÄÒÕÇÉÈ ÆÕÎË ÉÊ.
æÕÎË ÉÉ, ÉÓÏÌØÚÕÀÝÉÅ ÄÒÕÇÉÅ ÆÕÎË ÉÉ × ËÁÞÅÓÔ×Å ÁÒÁÍÅÔÒÁ ÞÁÓÔÏ ÎÁÚÙ×ÁÀÔ ÆÕÎË ÉÑÍÉ ×ÙÓÛÅÇÏ ÏÒÑÄËÁ, ÏÄÞÅÒËÉ×ÁÑ ÔÁËÉÍ ÎÁÚ×ÁÎÉÅÍ ÉÈ ÏÔÌÉÞÉÅ ÏÔ ÏÂÙËÎÏ×ÅÎÎÙÈ ÆÕÎË ÉÊ. ÷ÓÔÒÅÞÁ×ÛÁÑÓÑ ÎÁÍ ÒÁÎÅÅ ÆÕÎË ÉÑ map Ñ×ÌÑÅÔÓÑ ÒÉÍÅÒÏÍ ÆÕÎË ÉÉ ×ÙÓÛÅÇÏ ÏÒÑÄËÁ. Ï, ËÁË ÂÕÄÕÔ ÒÅÏÂÒÁÚÏ×Ù×ÁÔØÓÑ ÜÌÅ ÍÅÎÔÙ ÓÉÓËÁ, ÏÒÅÄÅÌÑÅÔÓÑ ÆÕÎË ÉÅÊ, Ñ×ÌÑÀÝÅÊÓÑ ÅÒ×ÙÍ ÁÒÇÕ ÍÅÎÔÏÍ map. 84
1. æÕÎË ÉÉ ÎÁ ÓÉÓËÁÈ
85
æÕÎË ÉÑ map ÍÏÖÅÔ ÂÙÔØ ÏÒÅÄÅÌÅÎÁ ÓÌÅÄÕÀÝÉÍ ÏÂÒÁÚÏÍ:
map :: (a -> b) -> [a℄ -> [b℄ map f [ ℄ = [℄ map f (x:xs) = f x : map f xs üÔÏ ÏÒÅÄÅÌÅÎÉÅ ÉÓÏÌØÚÕÅÔ ÓÒÁ×ÎÅÎÉÅ Ó ÏÂÒÁÚ ÏÍ: ÆÕÎË ÉÑ ÏÒÅÄÅÌÑÅÔÓÑ ÏÔÄÅÌØÎÏ ÄÌÑ ÓÌÕÞÁÑ, ËÏÇÄÁ ×ÔÏÒÏÊ ÁÒÇÕÍÅÎÔ Ñ×ÌÑÅÔ ÓÑ ÕÓÔÙÍ ÓÉÓËÏÍ, É ÄÌÑ ÓÌÕÞÁÑ ÓÉÓËÁ, ÓÏÓÔÏÑÝÅÇÏ ÉÚ ÅÒ×ÏÇÏ ÜÌÅÍÅÎÔÁ x É ÏÓÔÁÔËÁ (È×ÏÓÔÁ) xs. æÕÎË ÉÑ ÒÅËÕÒÓÉ×ÎÁ: × ÓÌÕÞÁÅ ÎÅÕÓÔÏÇÏ ÓÉÓËÁ ÆÕÎË ÉÑ map ×ÙÚÙ×ÁÅÔÓÑ ÓÎÏ×Á. ðÒÉ ÜÔÏÍ ÅÅ Á ÒÁÍÅÔÒ ÓÔÁÎÏ×ÉÔÓÑ ËÏÒÏÞÅ (xs ËÏÒÏÞÅ, ÞÅÍ x:xs), ÔÁË ÞÔÏ × ËÏÎ Å ËÏÎ Ï× ÂÕÄÅÔ ÉÓÏÌØÚÏ×ÁÎÁ ÎÅÒÅËÕÒÓÉ×ÎÁÑ ÞÁÓÔØ ÏÒÅÄÅÌÅÎÉÑ. äÒÕÇÏÊ ÞÁÓÔÏ ÉÓÏÌØÚÕÅÍÏÊ ÆÕÎË ÉÅÊ ×ÙÓÛÅÇÏ ÏÒÑÄËÁ, ÒÉ ÍÅÎÑÅÍÏÊ Ë ÓÉÓËÁÍ, Ñ×ÌÑÅÔÓÑ ÆÕÎË ÉÑ filter. ïÎÁ ×ÏÚ×ÒÁÝÁÅÔ ÔÅ ÜÌÅÍÅÎÔÙ ÓÉÓËÁ, ËÏÔÏÒÙÅ ÕÄÏ×ÌÅÔ×ÏÒÑÀÔ ÎÅËÏÔÏÒÏÍÕ ÕÓÌÏ×ÉÀ. þÔÏ ÜÔÏ ÂÕÄÅÔ ÚÁ ÕÓÌÏ×ÉÅ, ÏÒÅÄÅÌÑÅÔÓÑ ÆÕÎË ÉÅÊ, Ñ×ÌÑÀÝÅÊÓÑ ÅÒ×ÙÍ ÁÒÇÕÍÅÎÔÏÍ ÆÕÎË ÉÉ filter. óÌÅÄÕÀÝÉÅ ÓÔÒÏËÉ ÄÅÍÏÎ ÓÔÒÉÒÕÀÔ ÅÅ ÉÓÏÌØÚÏ×ÁÎÉÅ:
---> filter even [1..10℄ [2,4,6,8,10℄ ---> filter (>10) [2, 17, 8, 12, 5℄ [17,12℄ åÓÌÉ ÜÌÅÍÅÎÔÙ ÓÉÓËÁ ÉÍÅÀÔ ÔÉ Á, ÔÏ ÆÕÎË ÉÑ-ÁÒÁÍÅÔÒ ÄÏÌÖÎÁ ÉÍÅÔØ ÔÉ Á -> Bool. ïÒÅÄÅÌÅÎÉÅ filter ÔÁËÖÅ ÒÅËÕÒÓÉ×ÎÏ:
filter :: (a -> Bool) -> [a℄ -> [a℄ filter p [ ℄ = [ ℄ filter p (x:xs) | p x = x : filter p xs | otherwise = filter p xs ÷ ÓÌÕÞÁÅ, ËÏÇÄÁ ÓÉÓÏË ÎÅ ÕÓÔ (Ô. e. ÒÅÄÓÔÁ×ÉÍ × ×ÉÄÅ x:xs), ×ÏÚ ÍÏÖÎÙ Ä×Á ×ÁÒÉÁÎÔÁ: ÌÉÂÏ ÅÒ×ÙÊ ÜÌÅÍÅÎÔ x ÕÄÏ×ÌÅÔ×ÏÒÑÅÔ ÕÓÌÏ ×ÉÀ Ò, ÌÉÂÏ ÎÅÔ. åÓÌÉ ÕÄÏ×ÌÅÔ×ÏÒÑÅÔ, ÔÏ È ÏÍÅÝÅÎ × ÒÅÚÕÌØÔÉÒÕ ÀÝÉÊ ÓÉÓÏË, Á ÏÓÔÁ×ÛÁÑÓÑ ÞÁÓÔØ ÓÉÓËÁ ÒÉ ÏÍÏÝÉ ÒÅËÕÒÓÉÉ ÂÕÄÅÔ ÚÁÔÅÍ ÔÁËÖÅ ÏÄ×ÅÒÇÎÕÔÁ ¾ÆÉÌØÔÒÏ×ÁÎÉÀ¿. äÁ×ÁÊÔÅ ÏÒÅÄÅÌÉÍ ÅÝÅ ÏÄÎÕ ÏÞÅÎØ ÏÌÅÚÎÕÀ ÆÕÎË ÉÀ ×ÙÓ ÛÅÇÏ ÏÒÑÄËÁ, ÒÉÍÅÎÑÅÍÕÀ Ë ÓÉÓËÁÍ. óÎÁÞÁÌÁ ÏÓÍÏÔÒÉÍ ÎÁ ÏÒÅÄÅÌÅÎÉÑ ÔÒÅÈ, ËÁÚÁÌÏÓØ ÂÙ, ÔÁËÉÈ ÒÁÚÎÙÈ ÆÕÎË ÉÊ, ËÁË sum (×ÙÞÉÓÌÑÀÝÅÊ ÓÕÍÍÕ ×ÓÅÈ ÜÌÅÍÅÎÔÏ× ÓÉÓËÁ ÞÉÓÅÌ), produ t (ÒÏ ÉÚ×ÅÄÅÎÉÅ ÓÉÓËÁ ÞÉÓÅÌ) É and (ËÏÔÏÒÁÑ ×ÏÚ×ÒÁÝÁÅÔ True, ÅÓÌÉ ×ÓÅ ÜÌÅÍÅÎÔÙ ÓÉÓËÁ, ÓÏÄÅÒÖÁÝÅÇÏ ÌÏÇÉÞÅÓËÉÅ ×ÅÌÉÞÉÎÙ, ÒÁ×ÎÙ True):
H
IV. æÕÎË ÉÉ ×ÙÓÛÅÇÏ ÏÒÑÄËÁ
86
sum sum
[ ℄ = 0 (x:xs) = x + sum xs
produ t [ ℄ = 1 produ t (x:xs) = x * produ t xs and and
[ ℄ = True (x:xs) = x && and xs
óÔÒÕËÔÕÒÁ ×ÓÅÈ ÜÔÉÈ ÔÒÅÈ ÏÒÅÄÅÌÅÎÉÊ ÏÄÉÎÁËÏ×Á. òÁÚÌÉÞÉÑ ÌÉÛØ × (1, 0, True) É
ÚÎÁÞÅÎÉÑÈ, ×ÏÚ×ÒÁÝÁÅÍÙÈ ÎÁ ÕÓÔÙÈ ÓÉÓËÁÈ ÏÅÒÁÔÏÒÁÈ, ÉÓÏÌØÚÕÅÍÙÈ ÄÌÑ ÒÉÓÏÅÄÉÎÅÎÉÑ ÅÒ×ÏÇÏ ÜÌÅÍÅÎÔÁ
Ë ÒÅÚÕÌØÔÁÔÕ ÒÅËÕÒÓÉ×ÎÏÇÏ ÏÂÒÁÝÅÎÉÑ (+, * ÉÌÉ &&). ðÅÒÅÄÁ×ÁÑ ÜÔÉ Ä×Å ÅÒÅÍÅÎÎÙÅ ËÁË ÁÒÁÍÅÔÒÙ, ÍÏÖÎÏ ÏÒÅÄÅ ÌÉÔØ ÏÄÎÕ ÉÚ ÓÁÍÙÈ ÏÌÅÚÎÙÈ ÆÕÎË ÉÊ ×ÙÓÛÅÇÏ ÏÒÑÄËÁ:
foldr :: ( a -> b -> b) -> b -> [a℄ -> b foldr f e [ ℄ = e foldr f e (x:xs) = x `f` foldr f e xs ÅÅÒØ ÒÅÄÙÄÕÝÉÅ ÔÒÉ ÆÕÎË ÉÉ ÍÏÇÕÔ ÂÙÔØ ÏÒÅÄÅÌÅÎÙ ÒÉ ÏÍÏÝÉ ÞÁÓÔÉÞÎÏÊ ÁÒÁÍÅÔÒÉÚÁ ÉÉ ÏÄÎÏÊ É ÔÏÊ ÖÅ ÆÕÎË ÉÉ:
sum = foldr (+) produ t = foldr (*) and = foldr (&&)
0 1 True
æÕÎË ÉÑ foldr (ÒÏÉÚÎÏÓÉÔÓÑ ËÁË ¾fold right¿), ÎÁÚÙ×ÁÅÍÁÑ × ÒÕÓ ÓËÏÑÚÙÞÎÏÊ ÌÉÔÅÒÁÔÕÒÅ Ó×ÅÒÔËÏÊ ÓÒÁ×Á, ÍÏÖÅÔ ÂÙÔØ ÉÓÏÌØÚÏ ×ÁÎÁ ÄÌÑ ÏÒÅÄÅÌÅÎÉÑ ÍÎÏÖÅÓÔ×Á ÄÒÕÇÉÈ ÆÕÎË ÉÊ, ÏÅÒÉÒÕÀÝÉÈ ÓÉÓËÁÍÉ, É ÏÜÔÏÍÕ ÅÅ ÏÒÅÄÅÌÅÎÉÅ ×ËÌÀÞÅÎÏ × ÆÁÊÌ Prelude.hs.
I õÒÁÖÎÅÎÉÅ IV.1.1
ðÏÍÅÓÔÉÔÅ ÏÒÅÄÅÌÅÎÉÅ ÆÕÎË ÉÉ foldr × Ó ÏÔÄÅÌØÎÙÊ ÓËÒÉÔ É ÚÁÇÒÕÚÉÔÅ ÅÇÏ. îÅ ÚÁÂÕÄØÔÅ ÄÏÂÁ×ÉÔØ × ÓËÒÉÔ ÓÌÅÄÕÀÝÕÀ ÓÔÒÏ ËÕ, ÄÅÌÁÀÝÕÀ ¾ÎÅ×ÉÄÉÍÙÍ¿ ËÁÎÏÎÉÞÅÓËÏÅ ÏÒÅÄÅÌÅÎÉÅ ÆÕÎË ÉÉ foldr:
import Prelude hiding (foldr)
H
ðÏÓÍÏÔÒÉÔÅ ÎÁ ÒÅÚÕÌØÔÁÔÙ ÒÉÍÅÎÅÎÉÑ ÆÕÎË ÉÉ:
---> foldr (+) 0 [1, 2, 3, 4℄ 10 ---> foldr (*) 1 [1, 2, 3, 4℄
1. æÕÎË ÉÉ ÎÁ ÓÉÓËÁÈ
87
24 ---> foldr (&&) True [True, True, False, True℄ False äÏÂÁ×ØÔÅ × ÓËÒÉÔ ÏÒÅÄÅÌÅÎÉÑ ÆÕÎË ÉÊ sum, produ t É and, ÒÉ ×ÅÄÅÎÎÙÅ ×ÙÛÅ. îÅ ÚÁÂÕÄØÔÅ ÓËÒÙÔØ ÉÈ ÓÔÁÎÄÁÒÔÎÙÅ ÏÒÅÄÅÌÅÎÉÑ, ÚÁÇÒÕÖÅÎÎÙÅ ÉÚ ÒÅÌÀÄÉÉ. ðÒÉÍÅÎÉÔÅ ÏÌÕÞÅÎÎÙÅ ÆÕÎË ÉÉ Ë ÒÁÚ ÌÉÞÎÙÍ ÓÉÓËÁÍ.
J
îÁÚ×ÁÎÉÅ foldr ÍÏÖÎÏ ÏÂßÑÓÎÉÔØ ÓÌÅÄÕÀÝÉÍ ÏÂÒÁÚÏÍ. ðÒÅÄ ÏÌÏÖÉÍ, ÞÔÏ Õ ÎÁÓ ÅÓÔØ ÓÉÓÏË [a, b, , d℄. üÔÏÔ ÖÅ ÓÉÓÏË, ÉÓÏÌØÚÕÑ ÏÅÒÁ ÉÀ ÄÏÂÁ×ÌÅÎÉÑ ÜÌÅÍÅÎÔÁ × ÎÁÞÁÌÏ ÓÉÓËÁ ÍÏÖÎÏ ÚÁÉÓÁÔØ × ×ÉÄÅ a:(b:( :(d:[ ℄))). æÕÎË ÉÑ foldr ÚÁÍÅÎÑÅÔ Õ ÓÔÏÊ ÓÉÓÏË [ ℄ ÎÁ ÎÅËÉÊ ÎÁÞÁÌØÎÙÊ ÜÌÅÍÅÎÔ e, Á ÏÅÒÁ ÉÀ : ÎÁ ÂÉÎÁÒÎÙÊ ÏÅÒÁÔÏÒ, ËÏÔÏÒÙÊ ÍÙ ÏÂÏÚÎÁÞÉÍ ÓÉÍ×ÏÌÏÍ , É ×ÏÚ×ÒÁ ÝÁÅÔ ÒÅÚÕÌØÔÁÔ. . Å. ÏÎÁ ÒÅÏÂÒÁÚÕÅÔ ÓÉÓÏË
a : (b : ( : (d : [ ℄))) Ë ×ÅÌÉÞÉÎÅ
a
(b ( (d e )))
ÁË ËÁË ÏÅÒÁ ÉÑ : ÁÓÓÏ ÉÁÔÉ×ÎÁ ÓÒÁ×Á, ÔÏ ÓËÏÂËÉ × ÅÒ×ÏÍ ×ÙÒÁÖÅÎÉÉ ÍÏÖÎÏ ÂÙÌÏ ÂÙ ÏÕÓÔÉÔØ. íÙ, ÏÄÎÁËÏ, ÏÓÔÁ×ÌÑÅÍ ÉÈ × ÒÅÚÕÌØÔÉÒÕÀÝÅÍ ×ÙÒÁÖÅÎÉÉ, ÏÔÏÍÕ ÞÔÏ ÎÅ Õ×ÅÒÅÎÙ × ÔÏÍ, ÞÔÏ ÁÓÓÏ ÉÁÔÉ×ÎÁ ÓÒÁ×Á.
foldr () e [x1 ; x2 ; : : : ; xn ℄
ÇÄÅ
=
x1 (x2 (: : : (xn e) : : :))
ÂÉÎÁÒÎÙÊ ÏÅÒÁÔÏÒ, Á e ÓÔÁÒÔÏ×ÏÅ ÚÎÁÞÅÎÉÅ.
äÒÕÇÉÍÉ ÓÌÏ×ÁÍÉ, ÆÕÎË ÉÑ foldr ¾Ó×ÏÒÁÞÉ×ÁÅÔ¿ ÓÉÓÏË × ÏÄÎÏ ÚÎÁÞÅÎÉÅ, ×ÓÔÁ×ÌÑÑ ÍÅÖÄÕ ×ÓÅÍÉ ÜÌÅÍÅÎÔÁÍÉ ÓÉÓËÁ ÄÁÎÎÙÊ ÏÅÒÁ ÔÏÒ, ÒÏÄ×ÉÇÁÑÓØ ÒÉ ÜÔÏÍ ÓÒÁ×Á ÎÁÌÅ×Ï ÏÔ ÚÁÄÁÎÎÏÇÏ ÎÁÞÁÌØÎÏÇÏ ÚÎÁÞÅÎÉÑ. íÏÖÅÔ ×ÏÚÎÉËÎÕÔØ ÏÔÒÅÂÎÏÓÔØ × ÁÎÁÌÏÇÉÞÎÏÊ ÆÕÎË ÉÉ, ÏÓÕ ÝÅÓÔ×ÌÑÀÝÅÊ Ó×ÅÒÔËÕ ÓÉÓËÁ ÓÌÅ×Á. äÌÑ ÉÌÌÀÓÔÒÁ ÉÉ, ÒÅÄÏÌÏ ÖÉÍ, ÞÔÏ ÍÙ ÈÏÔÉÍ ÏÌÕÞÉÔØ ÆÕÎË ÉÀ de imal, ËÏÔÏÒÁÑ ÂÅÒÅÔ ÓÉÓÏË ÉÆÒ [x0 , x1 , x2 , ..., xn ℄ É ×ÏÚ×ÒÁÝÁÅÔ ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÅÅ ÄÅÓÑÔÉÞÎÏÅ ÞÉÓÌÏ, ×ÙÞÉÓÌÑÅÍÏÅ ËÁË
de imal [x0 ; x1 ; : : : ; xn ℄ =
n X k=0
xk 10n
k
IV. æÕÎË ÉÉ ×ÙÓÛÅÇÏ ÏÒÑÄËÁ
88
ïÄÉÎ ÉÚ ÄÏÓÔÁÔÏÞÎÏ ÜÆÆÅËÔÉ×ÎÙÈ ÓÏÓÏÂÏ× ×ÙÞÉÓÌÅÎÉÑ de imal ÚÁËÌÀÞÁÅÔÓÑ × ÒÏ ÅÓÓÅ ÕÍÎÏÖÅÎÉÑ ËÁÖÄÏÊ ÉÆÒÙ ÎÁ ÄÅÓÑÔØ É ÄÏÂÁ×ÌÅÎÉÑ Ë ÒÅÚÕÌØÔÁÔÕ ÓÌÅÄÕÀÝÅÊ ÉÆÒÙ. îÁÒÉÍÅÒ,
de imal [x0 ; x1 ; x2 ℄ = 10 (10 (10 0 + x0 ) + x1 ) + x2
ÓÈÅÍÁ çÏÒ
ÁËÏÊ ÒÉÅÍ ÄÅËÏÍÏÚÉ ÉÉ ÓÕÍÍ ÓÔÅÅÎÅÊ ÉÚ×ÅÓÔÅÎ ËÁË . ïÒÅÄÅÌÉÍ ÏÅÒÁÔÏÒ ËÁË n x = 10 n + x. ÏÇÄÁ ÍÏÖÎÏ ÅÒÅÉÓÁÔØ ÕÒÁ×ÎÅÎÉÅ, ÒÉ×ÅÄÅÎÎÏÅ ×ÙÛÅ ÓÌÅÄÕÀÝÉÍ ÏÂÒÁÚÏÍ
ÎÅÒÁ
de imal [x0 ; x1 ; x2 ℄ = ((0 x0 ) x1 ) x2 üÔÏ ×ÙÒÁÖÅÎÉÅ ×ÙÇÌÑÄÉÔ ÏÞÔÉ ËÁË ÆÕÎË ÉÑ foldr, ÚÁ ÉÓ ËÌÀÞÅÎÉÅÍ ÔÏÇÏ, ÞÔÏ ÓËÏÂËÉ ÒÁÓÓÔÁ×ÌÅÎÙ Ï ÄÒÕÇÏÍÕ É ×ÙÞÉÓÌÅ ÎÉÑ ÎÁÞÉÎÁÀÔÓÑ ÓÌÅ×Á, Á ÎÅ ÓÒÁ×Á. æÁËÔÉÞÅÓËÉ, ÜÔÏ Ä×ÏÊÓÔ×ÅÎ ÎÙÊ ÒÏ ÅÓÓ: ×ÍÅÓÔÏ ÏÂÒÁÂÏÔËÉ ÓÒÁ×Á ÎÁÌÅ×Ï, ÚÄÅÓØ ×ÙÞÉÓÌÅÎÉÅ ÒÏÉÚ×ÏÄÉÔÓÑ ÓÌÅ×Á ÎÁÒÁ×Ï. òÁÓÓÍÏÔÒÅÎÎÙÊ ÒÉÍÅÒ ÏÂßÑÓÎÑÅÔ ÒÉÞÉÎÙ ÏÑ×ÌÅÎÉÑ ×ÔÏÒÏÊ ÆÕÎË ÉÉ Ó×ÅÒÔËÉ, ÎÁÚÙ×ÁÅÍÏÊ foldl (ÏÔ fold left Ó×ÅÒÔËÁ ÓÌÅ×Á).
foldl () e [x1 ; x2 ; : : : ; xn ℄
ÇÄÅ
=
(: : : ((e x1 ) x2 ) : : :) xn
ÂÉÎÁÒÎÙÊ ÏÅÒÁÔÏÒ, Á e ÓÔÁÒÔÏ×ÏÅ ÚÎÁÞÅÎÉÅ.
úÁÍÅÔÉÍ, ÞÔÏ ÅÓÌÉ e ÅÓÔØ ÁÓÓÏ ÉÁÔÉ×ÎÁÑ ÅÄÉÎÉ Á ÄÌÑ ÏÅÒÁ ÉÉ , ÔÏ foldr () e É foldl () e ÏÒÅÄÅÌÑÀÔ ÏÄÎÕ É ÔÕ ÖÅ ÆÕÎË ÉÀ ÎÁ ËÏÎÅÞÎÙÈ ÓÉÓËÁÈ.
I õÒÁÖÎÅÎÉÅ IV.1.2
óÏÚÄÁÊÔÅ ÆÁÊÌ É ÏÍÅÓÔÉÔÅ × ÎÅÇÏ ÏÒÅÄÅÌÅÎÉÅ ÆÕÎË ÉÉ foldl. ïÂÒÁÔÉÔÅ ×ÎÉÍÁÎÉÅ ÎÁ ÏÂßÑ×ÌÅÎÉÅ ÅÅ ÔÉÁ.
import Prelude hiding (foldl) foldl :: ( b -> a -> b) -> b -> [a℄ -> b foldl f e [ ℄ = e foldl f e (x:xs) = foldl f ( e `f` x) xs úÁÇÒÕÚÉÔÅ ÓËÒÉÔ × ÉÎÔÅÒÒÅÔÁÔÏÒ É ÒÉÍÅÎÉÔÅ ÆÕÎË ÉÀ foldl Ë ÒÁÚÌÉÞÎÙÍ ÏÅÒÁÔÏÒÁÍ É ÓÉÓËÁÍ.
J
òÁÚÂÅÒÅÍ ÏÏÄÒÏÂÎÅÅ ÒÏ ÅÓÓ ÒÉÍÅÎÅÎÉÑ ÜÔÏÊ ÆÕÎË ÉÉ Ë ÓÉÓËÕ ÉÚ ÔÒÅÈ ÜÌÅÍÅÎÔÏ×:
1. æÕÎË ÉÉ ÎÁ ÓÉÓËÁÈ = = = =
89
foldl () e [ a, b, ℄ foldl () (e a) [b, ℄ foldl () ((e a) b) [ ℄ foldl () (((e a) b) ) [ ℄ ((e a) b)
ó ÏÍÏÝØÀ foldl ÆÕÎË ÉÀ de imal ÍÏÖÎÏ ÏÒÅÄÅÌÉÔØ ÔÁË:
op :: Integer -> Integer -> Integer op a b = 10* a + b de imal :: [Integer℄ -> Integer de imal = foldl op 0 íÙ ÉÓÏÌØÚÏ×ÁÌÉ × ÏÂßÑ×ÌÅÎÉÉ ÔÉ Integer, Á ÎÅ Int ÄÌÑ ÔÏ ÇÏ, ÞÔÏÂÙ ÍÏÖÎÏ ÂÙÌÏ ÒÁÂÏÔÁÔØ ÓÏ ÓÉÓËÁÍÉ ÄÏÓÔÁÔÏÞÎÏ ÂÏÌØÛÏÊ ÄÌÉÎÙ.
I õÒÁÖÎÅÎÉÅ IV.1.3
óÏÚÄÁÊÔÅ ÓËÒÉÔ, ÏÚ×ÏÌÑÀÝÉÊ ×ÙÞÉÓÌÉÔØ ÞÉÓÌÏ, ÒÅÄÓÔÁ×ÌÅÎ ÎÏÅ ÓÉÓËÏÍ Ó×ÏÉÈ ÉÆÒ. éÓÏÌØÚÕÊÔÅ ÄÌÑ ×ÙÞÉÓÌÅÎÉÑ ÆÕÎË ÉÀ de imal. äÏÂÁ×ØÔÅ × ÓËÒÉÔ ÏÒÅÄÅÌÅÎÉÅ ÆÕÎË ÉÉ de imal', ÏÔ ÌÉÞÁÀÝÅÅÓÑ ÔÏÌØËÏ ÏÂßÑ×ÌÅÎÉÅÍ ÔÉÁ, ÄÌÑ ÞÅÇÏ ÚÁÍÅÎÉÔÅ ÔÉ Integer ÎÁ Int. ïÂßÑÓÎÉÔÅ ÏÔ×ÅÔ, ÏÌÕÞÅÎÎÙÊ × ÏÓÌÅÄÎÅÍ ÉÚ ÒÉ ×ÅÄÅÎÎÙÈ ÒÉÍÅÒÏ× ×ÙÞÉÓÌÅÎÉÑ:
---> de imal [1, 2, 3, 4, 5, 6, 7, 8, 9,0℄ 1234567890 ---> de imal [1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0℄ 12345678901234567890 ---> de imal' [1, 2, 3, 4, 5, 6, 7, 8, 9, 0℄ 1234567890 ---> de imal' [1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0℄ -350287150
J
æÕÎË ÉÉ ×ÙÓÛÅÇÏ ÏÒÑÄËÁ, ÔÁËÉÅ ËÁË map É foldr, ÉÇÒÁÀÔ × ÆÕÎË ÉÏÎÁÌØÎÏÍ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÉ ÒÏÌØ, ËÏÔÏÒÕÀ ×ÙÏÌÎÑÀÔ ÕÒÁ×ÌÑÀÝÉÅ ÓÔÒÕËÔÕÒÙ (ÁÎÁÌÏÇÉÞÎÙÅ for É while) × ÒÏ ÅÄÕÒ ÎÙÈ ÑÚÙËÁÈ. ïÄÎÁËÏ, ÜÔÉ ÕÒÁ×ÌÑÀÝÉÅ ÓÔÒÕËÔÕÒÙ Ñ×ÌÑÀÔÓÑ ×ÓÔÒÏ ÅÎÎÙÍÉ × ÑÚÙË, × ÔÏ ×ÒÅÍÑ ËÁË ÆÕÎË ÉÉ ÍÏÖÎÏ ÏÒÅÄÅÌÉÔØ ÓÁÍÏ ÓÔÏÑÔÅÌØÎÏ. üÔÏ ÄÅÌÁÅÔ ÆÕÎË ÉÏÎÁÌØÎÏÅ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÅ ÏÞÅÎØ ÇÉÂËÉÍ: ÉÍÅÅÔÓÑ ÌÉÛØ ÎÅÂÏÌØÛÏÅ ÞÉÓÌÏ ×ÓÔÒÏÅÎÎÙÈ ÆÕÎË ÉÊ, ÎÏ
H
IV. æÕÎË ÉÉ ×ÙÓÛÅÇÏ ÏÒÑÄËÁ
90
ÒÏÇÒÁÍÍÉÓÔ ÓÁÍÏÓÔÏÑÔÅÌØÎÏ ÍÏÖÅÔ ÓÄÅÌÁÔØ ×ÓÅ, ÞÔÏ ÅÍÕ ÏÔÒÅÂÕ ÅÔÓÑ.
÷ÏÒÏÓÙ É ÚÁÄÁÎÉÑ IV.1.1
ïÂßÑÓÎÉÔÅ ÒÁÚÌÉÞÉÑ × ÏÂßÑ×ÌÅÎÉÑÈ ÔÉÁ ÆÕÎË ÉÊ foldr É foldl. IV.1.2
ðÏÞÅÍÕ × ÍÁÔÅÍÁÔÉËÅ ÏÅÒÁ ÉÑ ×ÏÚ×ÅÄÅÎÉÑ × ÓÔÅÅÎØ ÉÍÅÅÔ ÒÁ×ÕÀ ÁÓÓÏ ÉÁÔÉ×ÎÏÓÔØ
2. éÔÅÒÁ ÉÑ
ÉÔÅÒÁ ÉÉ
ðÒÏ ÅÓÓ ÄÏ×ÏÌØÎÏ ÛÉÒÏËÏ ÒÉÍÅÎÑÅÔÓÑ × ÍÁÔÅÍÁÔÉ ËÅ. ïÎ ÚÁËÌÀÞÁÅÔÓÑ × ÓÌÅÄÕÀÝÅÍ: ÂÅÒÅÔÓÑ ÎÅËÏÅ ÎÁÞÁÌØÎÏÅ ÚÎÁÞÅ ÎÉÅ É Ë ÎÅÍÕ ÒÉÍÅÎÑÅÔÓÑ ËÁËÁÑ-ÔÏ ÏÒÅÄÅÌÅÎÎÁÑ ÆÕÎË ÉÑ ÄÏ ÔÅÈ ÏÒ, ÏËÁ ÎÅ ÂÕÄÅÔ ÏÌÕÞÅÎ ÒÅÚÕÌØÔÁÔ, ÕÄÏ×ÌÅÔ×ÏÒÑÀÝÉÊ ÚÁÄÁÎÎÏ ÍÕ ÕÓÌÏ×ÉÀ. éÔÅÒÁ ÉÑ ÍÏÖÅÔ ÂÙÔØ ÌÅÇËÏ ÏÒÅÄÅÌÅÎÁ ËÁË ÆÕÎË ÉÑ ×ÙÓÛÅÇÏ ÏÒÑÄËÁ. ÷ ÒÅÌÀÄÉÀ ×ËÌÀÞÅÎÁ ÏÄÏÂÎÁÑ ÆÕÎË ÉÑ, ÎÁÚÙ×ÁÅÍÁÑ until, ÓÏ ÓÌÅÄÕÀÝÉÍ ÏÂßÑ×ÌÅÎÉÅÍ ÔÉÁ:
until :: (a -> Bool) -> (a -> a) -> a -> a ëÁË ÓÌÅÄÕÅÔ ÉÚ ÏÂßÑ×ÌÅÎÉÑ, ÆÕÎË ÉÑ ÉÍÅÅÔ ÔÒÉ ÁÒÁÍÅÔÒÁ: ÌÏÇÉ ÞÅÓËÏÅ ÕÓÌÏ×ÉÅ, ËÏÔÏÒÏÍÕ ÄÏÌÖÅÎ ÕÄÏ×ÌÅÔ×ÏÒÉÔØ ËÏÎÅÞÎÙÊ ÒÅÚÕÌØ ÔÁÔ (ÆÕÎË ÉÑ, ÉÍÅÀÝÁÑ ÔÉ a -> Bool), ÆÕÎË ÉÑ, ËÏÔÏÒÁÑ ÅÒÉ ÏÄÉÞÅÓËÉ ÒÉÍÅÎÑÅÔÓÑ Ë ÒÏÍÅÖÕÔÏÞÎÏÍÕ ÒÅÚÕÌØÔÁÔÕ (a -> a), É ÓÔÁÒÔÏ×ÏÅ ÚÎÁÞÅÎÉÅ, ÉÍÅÀÝÅÅ ÔÉ a. ëÏÎÅÞÎÙÊ ÒÅÚÕÌØÔÁÔ ÔÁËÖÅ ÉÍÅÅÔ ÔÉ a. ÷ÙÚÏ× until p f x ÞÉÔÁÅÔÓÑ ËÁË: ¾ Ò f x¿. ïÒÅÄÅÌÅÎÉÅ ÆÕÎË ÉÉ until ÒÅËÕÒÓÉ×ÎÏ. òÅËÕÒÓÉ×ÎÙÊ É ÎÅ ÒÅËÕÒÓÉ×ÎÙÊ ÓÌÕÞÁÉ ×ÙÚÏ×Á ÎÁ ÜÔÏÔ ÒÁÚ ÎÅ ÉÓÏÌØÚÕÀÔ ÓÏÏÓÔÁ×ÌÅ ÎÉÅ Ó ÏÂÒÁÚ ÏÍ (patterns, ÁÔÔÅÒÎÙ), Á ÓÏÄÅÒÖÁÔ ÏÈÒÁÎÎÙÅ ×ÙÒÁ ÖÅÎÉÑ:
ÎÅ ×ÙÏÌÎÅÎÏ, ÒÉÍÅÎÑÔØ Ë ÜÌÅÍÅÎÔÕ
until p f x | p x = | otherwise =
ÄÏ ÔÅÈ ÏÒ, ÏËÁ
x until p f (f x)
3. ëÏÍÏÚÉ ÉÑ ÆÕÎË ÉÊ
91
åÓÌÉ ÎÁÞÁÌØÎÏÅ ÚÎÁÞÅÎÉÅ È ÓÒÁÚÕ ÖÅ ÕÄÏ×ÌÅÔ×ÏÒÑÅÔ ÕÓÌÏ×ÉÀ Ò, ÔÏ ÇÄÁ ÏÎÏ É Ñ×ÌÑÅÔÓÑ ÒÅÚÕÌØÔÁÔÏÍ. ÷ ÒÏÔÉ×ÎÏÍ ÓÌÕÞÁÅ ÆÕÎË ÉÑ f ÏÄÉÎ ÒÁÚ ÒÉÍÅÎÑÅÔÓÑ Ë È. ðÏÌÕÞÅÎÎÙÊ ÒÅÚÕÌØÔÁÔ (f x) ÉÓÏÌØÚÕ ÅÔÓÑ × ÒÏÌÉ ÓÔÁÒÔÏ×ÏÇÏ ÚÎÁÞÅÎÉÑ × ÒÅËÕÒÓÉ×ÎÏÍ ×ÙÚÏ×Å until. ëÁË É ×ÓÅ ÆÕÎË ÉÉ ×ÙÓÛÅÇÏ ÏÒÑÄËÁ, ÆÕÎË ÉÑ until ÍÏÖÅÔ ×Ù ÚÙ×ÁÔØÓÑ Ó ÞÁÓÔÉÞÎÏ ÁÒÁÍÅÔÒÉÚÏ×ÁÎÎÙÍÉ ÆÕÎË ÉÑÍÉ × ËÁÞÅÓÔ×Å ÁÒÁÍÅÔÒÁ. îÁÒÉÍÅÒ, ×ÙÒÁÖÅÎÉÅ, ÒÉ×ÅÄÅÎÎÏÅ ÎÉÖÅ, ×ÙÞÉÓÌÑÅÔ ÎÁÉÍÅÎØÛÕÀ ÓÔÅÅÎØ ÞÉÓÌÁ Ä×Á, ÎÅ ÒÅ×ÙÛÁÀÝÕÀ 1000 (ÎÁÞÉÎÁÑ Ó ÅÄÉÎÉ Ù É ÕÄ×ÁÉ×ÁÑ ÒÅÚÕÌØÔÁÔ ÄÏ ÔÅÈ ÏÒ, ÏËÁ ÏÎ ÎÅ ÓÔÁÎÅÔ ÂÏÌØÛÅ 1000):
---> until (>1000) (2*) 1 1024 ÷ ÏÔÌÉÞÉÅ ÏÔ ÒÁÎÅÅ ÒÁÓÓÍÏÔÒÅÎÎÙÈ ÒÅËÕÒÓÉ×ÎÙÈ ÆÕÎË ÉÊ, ÁÒÁ ÍÅÔÒ ÒÅËÕÒÓÉ×ÎÏÇÏ ×ÙÚÏ×Á ÆÕÎË ÉÉ until , ÞÅÍ ÉÓÈÏÄÎÙÊ ÁÒÁÍÅÔÒ. ðÏÜÔÏÍÕ-ÔÏ ÆÕÎË ÉÑ until ÎÅ ×ÓÅÇÄÁ ÓÏÓÏÂÎÁ ÚÁËÏÎÞÉÔØ ×ÙÞÉÓÌÅÎÉÅ É ×ÙÄÁÔØ ÒÅÚÕÌØÔÁÔ. ðÒÉ ×ÙÚÏ×Å ÆÕÎË ÉÉ until (<0) (+1) 1 ÕÓÌÏ×ÉÅ ÎÉËÏÇÄÁ ÎÅ ÂÕÄÅÔ ÕÄÏ×ÌÅÔ×Ï ÒÅÎÏ; ÆÕÎË ÉÑ until ÂÕÄÅÔ ×ÙÏÌÎÑÔØÓÑ ÎÅÏÇÒÁÎÉÞÅÎÎÏÅ ÞÉÓÌÏ ÒÁÚ É ÒÅÚÕÌØÔÁÔ ÎÅ ÂÕÄÅÔ ÏÌÕÞÅÎ. ðÒÉ ÜÔÏÍ ÎÁ ÜËÒÁÎ ËÏÍØÀÔÅÒÁ ÎÅ ×Ù×ÏÄÉÔÓÑ ÎÉËÁËÏÊ ÉÎÆÏÒÍÁ ÉÉ, ÔÁË ËÁË ×ÙÏÌÎÑÅÔÓÑ ÂÅÓËÏÎÅÞ ÎÏÅ ÞÉÓÌÏ ÒÅËÕÒÓÉÊ. äÌÑ ÏÓÔÁÎÏ×ËÉ ×ÙÞÉÓÌÅÎÉÊ (interrupt ÒÅ ÒÙ×ÁÔØ) × ÏÄÏÂÎÏÍ ÓÌÕÞÁÅ ÓÌÅÄÕÅÔ ÎÁÖÁÔØ ËÏÍÂÉÎÁ ÉÀ ËÌÁ×ÉÛ Ctrl É C (ÎÁÖÍÉÔÅ ËÌÁ×ÉÛÕ Ctrl É, ÎÅ ÏÔÕÓËÁÑ ÅÅ, ÎÁÖÍÉÔÅ ËÌÁ ×ÉÛÕ C):
H
ÎÅ ÓÔÁÎÏ×ÉÔÓÑ ÍÅÎØ
ÛÅ
---> until (<0) (+1) 1
ÎÁÖÁÔÉÅ Ctrl + C
{Interrupted!} --->
3. ëÏÍÏÚÉ ÉÑ ÆÕÎË ÉÊ íÙ ÕÖÅ ÏÂÓÕÖÄÁÌÉ ËÏÍÏÚÉ ÉÀ ÆÕÎË ÉÊ Ó ÔÏÞËÉ ÚÒÅÎÉÑ ÍÁÔÅ ÍÁÔÉËÉ, ÏÓÍÏÔÒÉÍ ÔÅÅÒØ ÎÁ ÜÔÕ ÏÅÒÁ ÉÀ Ó ÔÏÞËÉ ÚÒÅÎÉÑ ÆÕÎË ÉÊ ×ÙÓÛÅÇÏ ÏÒÑÄËÁ × ÆÕÎË ÉÏÎÁÌØÎÏÍ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÉ. åÓÌÉ f É g ÆÕÎË ÉÉ, ÔÏ f g ÅÓÔØ ÍÁÔÅÍÁÔÉÞÅÓËÁÑ ÚÁÉÓØ ÔÏÇÏ ÆÁËÔÁ, ÞÔÏ ÆÕÎË ÉÑ g f. ïÒÅÄÅÌÉÍ ÆÕÎË ÉÀ after (ÏÓÌÅ), ÚÁ×ÉÓÑÝÕÀ ÏÔ Ä×ÕÈ ÁÒÇÕÍÅÎÔÏ×-ÆÕÎË ÉÊ f É g, ËÏÔÏ ÒÁÑ ÒÉÍÅÎÑÅÔ f ÅÒ×ÏÊ, Á ÚÁÔÅÍ, ÄÌÑ ÏÌÕÞÅÎÉÑ ÏËÏÎÞÁÔÅÌØÎÏÇÏ
×ÙÏÌÎÑÅÔÓÑ ÏÓÌÅ
H
92
IV. æÕÎË ÉÉ ×ÙÓÛÅÇÏ ÏÒÑÄËÁ
ÒÅÚÕÌØÔÁÔÁ, ÒÉÍÅÎÑÅÔ g. îÁÌÉÞÉÅ ÏÄÏÂÎÏÊ ÆÕÎË ÉÉ ÏÚ×ÏÌÉÌÏ ÂÙ, ÎÁÒÉÍÅÒ, ÄÁ×ÁÔØ ÓÌÅÄÕÀÝÉÅ ÏÒÅÄÅÌÅÎÉÑ (ÍÙ ÉÓÏÌØÚÕÅÍ ÅÅ ÏÅÒÁÔÏÒÎÕÀ ÆÏÒÍÕ):
odd = not `after` even
loseToZero = (<10) `after` abs ïÅÒÁÔÏÒ `after` ÍÏÖÅÔ ÂÙÔØ ÏÒÅÄÅÌÅÎ, ËÁË ÏÅÒÁÔÏÒ ×ÙÓÛÅÇÏ ÏÒÑÄËÁ ÓÌÅÄÕÀÝÉÍ ÏÂÒÁÚÏÍ:
infixr 8 `after` g `after` f = h where h x = g (f x) îÁÏÍÎÉÍ, ÞÔÏ ÎÅ ÄÌÑ ×ÓÅÈ ÆÕÎË ÉÊ ÍÏÖÎÏ ÎÁÊÔÉ ÉÈ ËÏÍÏ ÚÉ ÉÀ. ïÂÌÁÓÔØ ÚÎÁÞÅÎÉÊ ÆÕÎË ÉÉ f ÄÏÌÖÎÁ Ñ×ÌÑÔØÓÑ ÏÂÌÁÓÔØÀ ÏÒÅÄÅÌÅÎÉÑ (ÄÏÍÅÎÏÍ) ÄÌÑ g. äÒÕÇÉÍÉ ÓÌÏ×ÁÍÉ, ÅÓÌÉ ÆÕÎË ÉÑ f ÉÍÅÅÔ ÔÉ a -> b, ÔÏ ÆÕÎË ÉÑ g, ÓÏÏÔ×ÅÔÓÔ×ÅÎÎÏ, ÄÏÌÖÎÁ ÉÍÅÔØ ÔÉ b -> . ëÏÍÏÚÉ ÉÅÊ ÜÔÉÈ Ä×ÕÈ ÆÕÎË ÉÊ ÂÕÄÅÔ ÆÕÎË ÉÑ, ËÏ ÔÏÒÁÑ ÄÅÊÓÔ×ÕÅÔ ÉÚ a -> . ÷ÓÅ ÜÔÏ ÏÔÒÁÖÅÎÏ × ÓÌÅÄÕÀÝÅÍ ÏÂß Ñ×ÌÅÎÉÉ ÔÉÁ ÆÕÎË ÉÉ after:
after :: (b -> ) -> (a -> b) -> (a -> )
after :: (b -> ) -> (a -> b) -> a ->
ÁË ËÁË -> ÁÓÓÏ ÉÁÔÉ×ÎÁ ÓÒÁ×Á, ÔÏ ÔÒÅÔØÉ ÓËÏÂËÉ ÌÉÛÎÉÅ, É ÔÉ after ÍÏÖÅÔ ÂÙÔØ ÏÉÓÁÎ É ÔÁË: æÕÎË ÉÑ after ÍÏÖÅÔ ÂÙÔØ ÒÁÓÓÍÏÔÒÅÎÁ ËÁË ÆÕÎË ÉÑ Ó ÔÒÅÍÑ ÁÒÁÍÅÔÒÁÍÉ; × ÔÏ ÖÅ ×ÒÅÍÑ, ×ÓÏÍÎÉ× Ï ËÁÒÒÉÎÇÅ, ÅÅ ÍÏÖÎÏ ÓÞÉ ÔÁÔØ ÆÕÎË ÉÅÊ Ó Ä×ÕÍÑ ÁÒÁÍÅÔÒÁÍÉ, ËÏÔÏÒÁÑ ×ÏÚ×ÒÁÝÁÅÔ ÆÕÎË ÉÀ (Á ÔÁËÖÅ É ËÁË ÆÕÎË ÉÀ Ó ÏÄÎÉÍ ÁÒÁÍÅÔÒÏÍ, ×ÏÚ×ÒÁÝÁÀÝÕÀ ÞÁÓÔÉÞÎÏ ÁÒÁÍÅÔÒÉÚÏ×ÁÎÎÕÀ ÆÕÎË ÉÀ, ÚÁ×ÉÓÑÝÕÀ ÏÔ ÏÄÎÏÇÏ ÁÒ ÇÕÍÅÎÔÁ-ÆÕÎË ÉÉ, ËÏÔÏÒÁÑ × Ó×ÏÀ ÏÞÅÒÅÄØ ×ÏÚ×ÒÁÝÁÅÔ ÆÕÎË ÉÀ Ó ÏÄÎÉÍ ÁÒÁÍÅÔÒÏÍ). ÷ÓÅ ÜÔÏ ÄÁÅÔ ×ÏÚÍÏÖÎÏÓÔØ ÏÒÅÄÅÌÉÔØ after, ËÁË ÆÕÎË ÉÀ Ó ÔÒÅÍÑ ÁÒÁÍÅÔÒÁÍÉ:
after g f x = g (f x) ðÒÉ ÔÁËÏÍ ÏÒÅÄÅÌÅÎÉÉ ÎÅÔ ÎÅÏÂÈÏÄÉÍÏÓÔÉ × ÌÏËÁÌØÎÏÍ ÏÒÅÄÅÌÅ ÎÉÉ ÆÕÎË ÉÉ h Ó ÏÌÏÝØÀ ËÌÀÞÅ×ÏÇÏ ÓÌÏ×Á where (ÈÏÔÑ ÜÔÏ, ËÏÎÅÞ ÎÏ ÖÅ, ÄÏÕÓÔÉÍÏ). ÷ÏÚ×ÒÁÝÁÑÓØ Ë ÏÒÅÄÅÌÅÎÉÀ ÆÕÎË ÉÉ odd, ×É ÄÉÍ, ÞÔÏ after ÆÁËÔÉÞÅÓËÉ Ñ×ÌÑÅÔÓÑ ÞÁÓÔÉÞÎÏ ÁÒÁÍÅÔÒÉÚÏ×ÁÎÎÏÊ ÁÒÁÍÅÔÒÁÍÉ not É even. ÒÅÔÉÊ ÁÒÁÍÅÔÒ ÒÉ ÔÁËÏÍ ÏÒÅÄÅÌÅÎÉÉ ÎÅ ÕËÁÚÁÎ: ÏÎ ÂÕÄÅÔ ÅÒÅÄÁÎ ÒÉ ×ÙÚÏ×Å ÆÕÎË ÉÉ odd.
3. ëÏÍÏÚÉ ÉÑ ÆÕÎË ÉÊ
93
éÓÏÌØÚÏ×ÁÎÉÅ ÏÅÒÁÔÏÒÁ after ÍÏÖÅÔ ÏËÁÚÁÔØÓÑ ÉÚÌÉÛÎÉÍ, ×ÅÄØ ÆÕÎË ÉÉ, ÏÄÏÂÎÙÅ odd ÍÏÖÎÏ ÂÙÌÏ ÂÙ ÏÒÅÄÅÌÉÔØ ÓÌÅÄÕÀ ÝÉÍ ÏÂÒÁÚÏÍ:
odd x = not (even x) ÅÍ ÎÅ ÍÅÎÅÅ, ËÏÍÏÚÉ ÉÑ Ä×ÕÈ ÆÕÎË ÉÊ ÍÏÖÅÔ ÓÌÕÖÉÔØ ÁÒÁÍÅ ÔÒÏÍ ÄÌÑ ËÁËÏÊ-ÎÉÂÕÄØ ÆÕÎË ÉÉ ×ÙÓÏËÏÇÏ ÏÒÑÄËÁ É × ÜÔÏÍ ÓÌÕ ÞÁÅ ÎÅÔ ÎÅÏÂÈÏÄÉÍÏÓÔÉ ÒÉÓ×ÁÉ×ÁÔØ ÅÊ ÏÔÄÅÌØÎÏÅ ÉÍÑ. óÌÅÄÕÀÝÉÊ ÒÉÍÅÒ ÄÅÍÏÎÓÔÒÉÒÕÅÔ ÏÌÕÞÅÎÉÅ ÓÉÓËÁ ÎÅÞÅÔÎÙÈ ÞÉÓÅÌ:
---> filter (not `after` even) [100,123,367,482,5,67℄ [123,367,5,67℄ ÷ ÒÅÌÀÄÉÉ ËÏÍÏÚÉ ÉÑ ÆÕÎË ÉÊ ÏÒÅÄÅÌÅÎÁ ÉÚÎÁÞÁÌØÎÏ. ëÁË ÕÖÅ ÏÔÍÅÞÁÌÏÓØ, ÏÎÁ ÏÂÏÚÎÁÞÁÅÔÓÑ ËÁË ÓÉÍ×ÏÌÏÍ . (ÔÏÞËÁ), ÔÁË ËÁË ÓÉÍ×ÏÌÁ ÎÅÔ ÎÁ ÂÏÌØÛÉÎÓÔ×Å ËÌÁ×ÉÁÔÕÒ. éÔÁË, ×Ù ÍÏÖÅÔÅ ×ÙÞÉ ÓÌÉÔØ
---> filter (not . even) [100,123,367,482,5,67℄ [123,367,5,67℄ üÔÏÔ ÏÅÒÁÔÏÒ ÏÓÏÂÅÎÎÏ ÏÌÅÚÅÎ × ÔÅÈ ÓÌÕÞÁÑÈ, ËÏÇÄÁ ÎÁÄÏ ÎÁÊ ÔÉ ËÏÍÏÚÉ ÉÀ ÔÒÅÈ É ÂÏÌÅÅ ÆÕÎË ÉÊ. ðÒÏÇÒÁÍÍÉÓÔ ÍÏÖÅÔ ÒÏÓÔÏ ÕËÁÚÁÔØ ËÏÍÏÚÉ ÉÀ ÆÕÎË ÉÊ, ÂÅÚ ÎÅÏÂÈÏÄÉÍÏÓÔÉ ÕÏÍÉÎÁÎÉÑ × ËÁÞÅÓÔ×Å ÁÒÁÍÅÔÒÏ× ÔÁËÉÈ ×ÅÌÉÞÉÎ, ËÁË ÞÉÓÌÁ É ÓÉÓËÉ. çÏÒÁÚÄÏ ÒÉÑÔÎÅÅ ÉÓÁÔØ
f = g . h . i . j . k ×ÍÅÓÔÏ
f x = g (h (i (j (k x))))
÷ÏÒÏÓÙ É ÚÁÄÁÎÉÑ IV.3.1
äÌÑ ËÁÖÄÏÇÏ ÕÎËÔÁ ÒÉ×ÅÄÉÔÅ ÏÄÈÏÄÑÝÕÀ ÆÕÎË ÉÀ:
(Float -> Float) -> Float Float -> (Float -> Float) (Float -> Float) -> (Float
-> Float)
IV.3.2
ñ×ÌÑÅÔÓÑ ÌÉ ÏÅÒÁÔÏÒ `after` (.) ÁÓÓÏ ÉÁÔÉ×ÎÙÍ?
H
H
IV. æÕÎË ÉÉ ×ÙÓÛÅÇÏ ÏÒÑÄËÁ
94 IV.3.3
îÁ ÓÔÒ. 92 ÕÔ×ÅÒÖÄÁÅÔÓÑ, ÞÔÏ after ÍÏÖÅÔ ÒÁÓÓÍÁÔÒÉ×ÁÔØÓÑ ËÁË ÆÕÎË ÉÑ Ó ÏÄÎÉÍ ÁÒÁÍÅÔÒÏÍ. ëÁË ÜÔÏ ÍÏÖÎÏ ÕÚÎÁÔØ ÉÚ ÏÉÓÁÎÉÑ ÔÉÁ ÁÒÁÍÅÔÒÁ? äÁÊÔÅ ÏÉÓÁÎÉÅ after × ÆÏÒÍÅ
after y =
4. ìÑÍÂÄÁ ÆÕÎË ÉÉ
H
H
õÖÅ ÏÔÍÅÞÁÌÏÓØ (ÓÍ. ÓÔÒ. 82), ÞÔÏ ÆÕÎË ÉÑ, ËÏÔÏÒÁÑ ÅÒÅÄÁÅÔ ÓÑ × ËÁÞÅÓÔ×Å ÁÒÁÍÅÔÒÁ ÄÒÕÇÏÊ ÆÕÎË ÉÉ, ÞÁÓÔÏ Ñ×ÌÑÅÔÓÑ ÞÁÓÔÉÞÎÏ ÁÒÁÍÅÔÒÉÚÏ×ÁÎÎÏÊ ÆÕÎË ÉÅÊ, ÒÉ ÜÔÏÍ × ÅÅ ÚÁÉÓÉ ÍÏÖÅÔ ÉÓÏÌØ ÚÏ×ÁÔØÓÑ ÉÌÉ ÎÅ ÉÓÏÌØÚÏ×ÁÔØÓÑ ÎÏÔÁ ÉÑ ÏÅÒÁÔÏÒÎÙÈ ÓÅË ÉÊ:
---> map (plus 5) [1 .. 10℄ [6,7,8,9,10,11,12,13,14,15℄ ---> map (+2) [1 .. 10℄ [3,4,5,6,7,8,9,10,11,12℄ ÷ ÄÒÕÇÉÈ ÓÌÕÞÁÑÈ ÆÕÎË ÉÑ, ÅÒÅÄÁ×ÁÅÍÁÑ × ËÁÞÅÓÔ×Å ÁÒÁÍÅ ÔÒÁ ÄÒÕÇÏÊ ÆÕÎË ÉÉ, ÍÏÖÅÔ ÂÙÔØ ÏÌÕÞÅÎÁ ÕÔÅÍ ËÏÍÏÚÉ ÉÉ ÄÒÕ ÇÉÈ ÆÕÎË ÉÊ:
---> filter (not . even) [1 .. 10℄ [1,3,5,7,9℄ îÏ × ÎÅËÏÔÏÒÙÈ ÓÌÕÞÁÑÈ ÏÞÅÎØ ÎÅÒÏÓÔÏ ÚÁÄÁÔØ ÆÕÎË ÉÀ ÏÄÏÂÎÙÍ ÏÂÒÁÚÏÍ, ÎÁ ÒÉÍÅÒ, ÅÓÌÉ ÔÒÅÂÕÅÔÓÑ ×ÙÞÉ ÓÌÉÔØ x2 + 3x + 1 ÄÌÑ ×ÓÅÈ x ÉÚ ÎÅËÏÔÏÒÏÇÏ ÓÉÓËÁ. ëÏÎÅÞÎÏ, -> [1 .. 4℄ ×ÓÅÇÄÁ ÏÓÔÁÅÔÓÑ ×ÏÚÍÏÖÎÏÓÔØ [1,2,3,4℄ ÏÒÅÄÅÌÉÔØ ÆÕÎË ÉÀ, ÚÁÄÁ× ÅÅ × ×ÉÄÅ ÌÏËÁÌØÎÏÇÏ ÁÒÁÍÅÔÒÁ Ó ÏÍÏÝØÀ ËÏÎÓÔÒÕË ÉÉ where:
úÁÉÓØ [n .. m℄, ÇÄÅ n É m ÅÌÙÅ ÞÉÓÌÁ, Ñ×ÌÑÅÔÓÑ ÓÏËÒÁÝÅÎ ÎÏÊ ÆÏÒÍÏÊ ÚÁÉÓÉ ÓÉÓËÁ ÅÌÙÈ ÞÉÓÅÌ × ÄÉÁÁÚÏÎÅ [n; m℄, ÎÁÒÉ ÍÅÒ,
ys = map f [1 .. 100℄ where f x = x*x + 3*x + 1 ïÄÎÁËÏ, ÅÓÌÉ ÉÓÏÌØÚÕÅÔÓÑ ÂÏÌØÛÏÅ ËÏÌÉÞÅÓÔ×Ï ÏÄÏÂÎÙÈ ÆÕÎË ÉÊ, ÓÔÁÎÏ×ÉÔÓÑ ÓÏ×ÓÅÍ ÎÅÒÏÓÔÏ ÒÉÄÕÍÙ×ÁÔØ ×ÓÅ ÎÏ×ÙÅ É ÎÏ×ÙÅ ÉÍÅÎÁ ÄÌÑ ÎÉÈ. ÷ ÔÁËÉÈ ÓÉÔÕÁ ÉÊ ÉÓÏÌØÚÕÅÔÓÑ ÓÅ ÉÁÌØÎÁÑ ÎÏ ÔÁ ÉÑ, ÏÚ×ÏÌÑÀÝÁÑ ÏÒÅÄÅÌÑÔØ ÆÕÎË ÉÉ . âÏÌØÛÉÎÓÔ×Ï ÆÕÎË ÉÏÎÁÌØÎÙÈ ÑÚÙËÏ× ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÑ ÏÚ×ÏÌÑÅÔ ÉÓÏÌØÚÏ×ÁÔØ, ÔÁË ÎÁÚÙ×ÁÅÍÙÅ, ÌÑÍÂÄÁ-ÆÕÎË ÉÉ
ÉÍÅÎ
ÂÅÚ Ñ×ÎÏÇÏ ÕËÁÚÁÎÉÑ ÉÈ
4. ìÑÍÂÄÁ ÆÕÎË ÉÉ
95
(-ÆÕÎË ÉÉ) ÆÕÎË ÉÉ ÂÅÚ ÎÁÚ×ÁÎÉÑ. ÁË ËÁË ÎÁ ËÌÁ×ÉÁÔÕÒÅ ÎÅÔ ÇÒÅÞÅÓËÏÊ ÂÕË×Ù × ÑÚÙËÅ Haskell ÏÔ ÇÒÅÞÅÓËÏÊ ÂÕË×Ù ÏÓÔÁÌÁÓØ ÔÏÌØËÏ ÏÄÎÁ ÁÌÏÞËÁ \. úÁÉÓØ \ x ÓÌÅÄÕÅÔ ÏÎÉÍÁÔØ ËÁË ÆÕÎË ÉÑ ÏÔ x (ÎÁÌÉÞÉÅ ÒÏÂÅÌÁ ÍÅÖÄÕ ÓÉÍ×ÏÌÏÍ \ É ÁÒÇÕÍÅÎÔÏÍ ÆÕÎË ÉÉ ÎÅ Ñ×ÌÑÅÔÓÑ ÎÅÏÂÈÏÄÉÍÙÍ). ïÂÝÉÊ ×ÉÄ -ÆÕÎË ÉÉ × ÑÚÙËÅ Haskell ÔÁËÏ×
\ ÏÂÒÁÚÅ -> ×ÙÒÁÖÅÎÉÅ æÕÎË ÉÑ ÉÚ ÒÅÄÙÄÕÝÅÇÏ ÒÉÍÅÒÁ Ó ÉÓÏÌØÚÏ×ÁÎÉÅÍ -ÎÏÔÁ ÉÉ ÚÁÉÛÅÔÓÑ ËÁË \x -> x*x + 3*x + 1. ÁËÁÑ ÚÁÉÓØ ÞÉÔÁÅÔÓÑ ÓÌÅ ÄÕÀÝÉÍ ÏÂÒÁÚÏÍ: ¾ x x*x + 3*x + 1¿. ïÂÙÞÎÏ ÌÑÍÂÄÁ-ÆÕÎË ÉÉ ÉÓÏÌØÚÕÀÔ, ÅÓÌÉ ÔÒÅÂÕÅÔÓÑ ÏÄÎÕ ÆÕÎË ÉÀ ÅÒÅÄÁÔØ × ËÁÞÅÓÔ×Å ÁÒÇÕÍÅÎÔÁ ÄÒÕÇÏÊ ÆÕÎË ÉÉ, ÎÁÒÉÍÅÒ,
ÆÕÎË ÉÑ ÏÔ , ×ÏÚ×ÒÁÝÁÀÝÁÑ ÚÎÁÞÅÎÉÅ
---> map ( \ x -> x*x+3*x+1) [1 .. 10℄ [5,11,19,29,41,55,71,89,109,131℄ ÅÌÏ ÌÑÍÂÄÁ-×ÙÒÁÖÅÎÉÑ ÍÏÖÅÔ ÂÙÔØ ÒÏÉÚ×ÏÌØÎÙÍ ×ÙÒÁÖÅÎÉ ÅÍ, ÏÄÎÁËÏ ÓÌÅÄÕÅÔ ÕÞÅÓÔØ, ÞÔÏ ÏÎÏ ÎÅ ÍÏÖÅÔ ÂÙÔØ ÒÅËÕÒÓÉ×ÎÙÍ, ÏÓËÏÌØËÕ ÎÅ ÓÕÝÅÓÔ×ÕÅÔ ÔÁËÏÇÏ Ó×ÑÚÁÎÎÏÇÏ Ó ÆÕÎË ÉÅÊ ÉÍÅÎÉ, ÎÁ ËÏÔÏÒÏÅ ÍÏÖÎÏ ÂÙÌÏ ÂÙ ÓÓÙÌÁÔØÓÑ.
÷ÏÒÏÓÙ É ÚÁÄÁÎÉÑ IV.4.1
ïÅÒÁÔÏÒ ËÏÍÏÚÉ ÉÉ ÆÕÎË ÉÊ ÉÍÅÅÔ ÔÉ
(.) :: (a -> b) -> ( -> a) -> ( -> b) äÒÕÇÉÍ ËÏÒÒÅËÔÎÙÍ ÏÂßÑ×ÌÅÎÉÅÍ ÔÉÁ ÜÔÏÊ ÆÕÎË ÉÉ Ñ×ÌÑÅÔÓÑ Á) Â) ×) Ç)
(.) :: (b -> ) -> (a -> b) -> (a -> ); (.) :: (a -> ) -> (b -> a) -> (b -> ); (.) :: ( -> a) -> (b -> ) -> (b -> a); ×ÓÅ ×ÙÛÅ ÅÒÅÞÉÓÌÅÎÎÙÅ.
IV.4.2
æÕÎË ÉÑ, ÉÍÅÀÝÁÑ ÔÉ (a -> b) -> Ñ×ÌÑÅÔÓÑ ÆÕÎË ÉÅÊ Á) Â) ×) Ç)
ÎÉÚÛÅÇÏ ÏÒÑÄËÁ; ÓÒÅÄÎÅÇÏ ÏÒÑÄËÁ; ×ÙÓÛÅÇÏ ÏÒÑÄËÁ; ÎÅ×ÏÚÍÏÖÎÏ ÏÒÅÄÅÌÉÔØ.
H
çÌÁ×Á V
þÉÓÌÏ×ÙÅ ÆÕÎË ÉÉ 1. òÁÂÏÔÁ Ó ÅÌÙÍÉ ÞÉÓÌÁÍÉ ðÒÉ ÒÁÂÏÔÅ Ó ÅÌÙÍÉ ÞÉÓÌÁÍÉ ÄÏÓÔÁÔÏÞÎÏ ÒÁÓÒÏÓÔÒÁÎÅÎÎÏÊ ÏÅÒÁ ÉÅÊ Ñ×ÌÑÅÔÓÑ ÎÁÈÏÖÄÅÎÉÅ (remainder) ÏÔ ÄÅÌÅÎÉÑ ÎÁ ÅÌÏ ÏÄÎÏÇÏ ÞÉÓÌÁ ÎÁ ÄÒÕÇÏÅ. ÁË ÒÉ ÄÅÌÅÎÉÉ ÎÁ ÅÌÏ ÞÉÓÌÁ 10 ÎÁ ÞÉÓÌÏ 3 ÏÓÔÁÔÏË ÒÁ×ÅÎ 1. ïÄÎÉÍ ÉÚ ÓÏÓÏÂÏ× ÎÁÊÔÉ ÏÓÔÁÔÏË Ñ×ÌÑÅÔÓÑ ÒÉÅÍ ÄÅÌÅÎÉÑ ÓÔÏÌÂÉËÏÍ, ÈÏÒÏÛÏ ÉÚ×ÅÓÔÎÙÊ ÉÚ ËÕÒÓÁ ÓÒÅÄÎÅÊ ÛËÏÌÙ. ë ÒÉÍÅÒÕ ÒÉ ÄÅÌÅÎÉÉ 345 ÎÁ 12 ÞÁÓÔÎÏÅ ÒÁ×ÎÏ 28 É ÏÓÔÁÔÏË 9: 345 12 24 28 105 96 9
ÏÓÔÁÔËÁ
H
÷ ÒÅÁÍÂÕÌÅ ÏÒÅÄÅÌÅÎÁ ÆÕÎË ÉÑ rem, ÒÅÄÎÁÚÎÁÞÅÎÎÁÑ ÄÌÑ ÎÁÈÏÖÄÅÎÉÑ ÏÓÔÁÔËÁ:
---> 345 `rem` 12 9 ïÒÅÄÅÌÅÎÉe ÏÓÔÁÔËÁ ÏÔ ÄÅÌÅÎÉÑ ÍÏÖÅÔ ÏÔÒÅÂÏ×ÁÔØÓÑ × ÔÁËÉÈ ÚÁ ÄÁÞÁÈ, ËÁË
×ÙÞÉÓÌÅÎÉÅ ÒÁÚÌÉÞÎÙÈ ×ÒÅÍÅÎÎÙÈ ÈÁÒÁËÔÅÒÉÓÔÉË: ÎÁÒÉÍÅÒ,
ÅÓÌÉ ÓÅÊÞÁÓ 9 ÞÁÓÏ×, ÔÏ ÞÅÒÅÚ 33 ÞÁÓÁ ÔÅËÕÝÅÅ ×ÒÅÍÑ ÂÕÄÅÔ ÒÁ×ÎÏ (9+35) `rem` 24 = 20 ÞÁÓÏ×; ÏÒÅÄÅÌÅÎÉÅ ÉÍÅÎÉ ÄÎÑ ÎÅÄÅÌÉ: ÚÁËÏÄÉÒÕÅÍ ÄÎÉ (0 ×ÏÓ ËÒÅÓÅÎØÅ, 1 ÏÎÅÄÅÌØÎÉË, . . . , 6 ÓÕÂÂÏÔÁ), ÅÓÌÉ ÓÅÇÏÄÎÑ ÓÒÅÄÁ (ÄÅÎØ Ó ÎÏÍÅÒÏÍ 3), ÔÏ ÞÅÒÅÚ 30 ÄÎÅÊ ÂÕÄÅÔ ÑÔÎÉ Á (33 `rem` 7 = 5); 96
1. òÁÂÏÔÁ Ó ÅÌÙÍÉ ÞÉÓÌÁÍÉ
97
×ÙÑÓÎÅÎÉÅ ×ÏÚÍÏÖÎÏÓÔÉ ÒÁÚÄÅÌÉÔØ ÎÁ ÅÌÏ ÏÄÎÏ ÞÉÓÌÏ ÎÁ ÄÒÕ ÇÏÅ: ÞÉÓÌÏ ÂÕÄÅÔ ÄÅÌÉÔÓÑ ÎÁ ÞÉÓÌÏ n, ÅÓÌÉ ÏÓÔÁÔÏË ÏÔ ÄÅÌÅÎÉÑ ÜÔÏÇÏ ÞÉÓÌÁ ÎÁ n ÒÁ×ÅÎ ÎÕÌÀ; ÏÒÅÄÅÌÅÎÉÅ ËÏÌÉÞÅÓÔ×Á ÉÆÒ × ÄÅÓÑÔÉÞÎÏÊ ÚÁÉÓÉ ÞÉ ÓÌÁ: ÏÓÌÅÄÎÑÑ ÉÆÒÁ ÞÉÓÌÁ x ÎÁÈÏÄÉÔÓÑ Ï ÆÏÒÍÕÌÅ x `rem` 10, ÓÌÅÄÕÀÝÁÑ ÉÆÒÁ ÒÁ×ÎÁ (x/10) `rem` 10, ÔÒÅÔØÑ (x/100) `rem` 10 É ÔÁË ÄÁÌÅÅ.
ïÔÍÅÔÉÍ, ÞÔÏ × ÑÚÙËÅ Haskell ÉÍÅÅÔÓÑ ÅÝÅ ÏÄÎÁ ÆÕÎË ÉÑ ÄÌÑ ÎÁÈÏÖÄÅÎÉÑ ÏÓÔÁÔËÁ ÞÉÓÌÁ ÜÔÏ ÆÕÎË ÉÑ mod. òÅÚÕÌØÔÁÔÙ ÆÕÎË ÉÊ rem É mod ÓÏ×ÁÄÁÀÔ ÒÉ ÎÁÈÏÖÄÅÎÉÉ ÏÓÔÁÔËÏ× ÏÔ ÏÌÏÖÉÔÅÌØ ÎÙÈ ÞÉÓÅÌ, ÎÏ ÒÁÚÌÉÞÁÀÔÓÑ ÄÌÑ ÏÔÒÉ ÁÔÅÌØÎÙÈ ÞÉÓÅÌ: ÆÕÎË ÉÑ mod ÄÌÑ ÌÀÂÏÇÏ ÞÉÓÌÁ (ËÁË ÏÌÏÖÉÔÅÌØÎÏÇÏ, ÔÁË É ÏÔÒÉ ÁÔÅÌØÎÏ ÇÏ) ÎÁÈÏÄÉÔ ÏÓÔÁÔÏË × ÓÏÏÔ×ÅÔÓÔ×ÉÉ ÓÏ ÓÌÅÄÕÀÝÉÍ ÍÁÔÅÍÁÔÉÞÅÓËÉÍ ÏÒÅÄÅÌÅÎÉÅÍ ÏÓÔÁÔËÁ:
äÌÑ ÌÀÂÏÇÏ ÅÌÏÇÏ ÞÉÓÌÁ m É ÏÌÏÖÉÔÅÌØÎÏÇÏ ÅÌÏÇÏ n ÓÕÝÅÓÔ×ÕÀÔ É ÒÉ ÔÏÍ ÅÄÉÎÓÔ×ÅÎÎÙÅ q É r, ÔÁËÉÅ ÞÔÏ m = q n + r, ÇÄÅ ÏÓÔÁÔÏË r ÕÄÏ×ÌÅÔ×ÏÒÑÅÔ ÕÓÌÏ×ÉÀ 0 6 r < n.
äÒÕÇÉÍÉ ÓÌÏ×ÁÍÉ, (m `div` n) * n + m `mod` n ÔÏÖÄÅÓÔ×ÅÎÎÏ ÒÁ×ÎÏ m. ðÒÉ ÔÁËÏÍ ÏÒÅÄÅÌÅÎÉÉ ÏÓÔÁÔÏË ÌÀÂÏÇÏ ÅÌÏÇÏ ÞÉÓÌÁ, ÎÁÊ ÄÅÎÎÙÊ ÒÉ ÏÍÏÝÉ ÆÕÎË ÉÉ mod ÅÓÔØ ÞÉÓÌÏ ÎÅÏÔÒÉ ÁÔÅÌØÎÏÅ, × ÏÔÌÉÞÉÉ ÏÔ ÆÕÎË ÉÉ rem, ËÏÔÏÒÁÑ ÏÅÒÉÒÕÅÔ ÏÌÏÖÉÔÅÌØÎÙÍÉ ÞÉ ÓÌÁÍÉ, Á ÌÉÛØ ÚÁÔÅÍ ÕÞÉÔÙ×ÁÅÔ ÚÎÁË.
---> 4 ---> 4 ---> -4 ---> 6
34 `rem` 10
H
34 `mod` 10 (-34) `rem` 10 (-34) `mod` 10
òÁÓÓÍÏÔÒÉÍ ÅÝÅ Ä×Å ÚÁÄÁÞÉ, Ó×ÑÚÁÎÎÙÅ Ó ÏÂÒÁÂÏÔËÏÊ ÅÌÙÈ ÞÉ ÓÅÌ. ÷ ÏÂÅÉÈ ÚÁÄÁÞÁÈ ÉÓÏÌØÚÕÅÔÓÑ ÆÕÎË ÉÑ rem.
1.1. ðÏÌÕÞÅÎÉÅ ÓÉÓËÁ ÒÏÓÔÙÈ ÞÉÓÅÌ çÏ×ÏÒÑÔ, ÞÔÏ ÅÌÏÅ ÞÉÓÌÏ m ÄÅÌÉÔÓÑ ÎÁ ÅÌÏÅ n, ÅÓÌÉ ÏÓÔÁÔÏË ÏÔ ÄÅÌÅÎÉÑ m ÎÁ n ÒÁ×ÅÎ ÎÕÌÀ. æÕÎË ÉÑ divisible ÒÏ×ÅÒÑÅÔ ÄÅÌÉÔÓÑ ÌÉ ÏÄÎÏ ÞÉÓÌÏ ÎÁ ÄÒÕÇÏÅ:
divisible
:: Int -> Int -> Bool
V. þÉÓÌÏ×ÙÅ ÆÕÎË ÉÉ
98
divisible m n = m `rem` n == 0
äÅÌÉÔÅÌÑÍÉ ÞÉÓÌÁ ÎÁÚÙ×ÁÀÔ ÔÁËÉÅ ÅÌÙÅ ÞÉÓÌÁ, ÎÁ ËÏÔÏÒÙÅ ÉÓÈÏÄ ÎÏÅ ÞÉÓÌÏ ÄÅÌÉÔÓÑ ÂÅÚ ÏÓÔÁÔËÁ. æÕÎË ÉÑ denominators ÏÒÅÄÅÌÑÅÔ ÓÉÓÏË ×ÓÅÈ ÄÅÌÉÔÅÌÅÊ ÚÁÄÁÎÎÏÇÏ ÞÉÓÌÁ:
denominators :: Int -> [Int℄ denominators x = filter (divisible x) [1 .. x℄ úÁÍÅÔÉÍ, ÞÔÏ ÚÄÅÓØ ÆÕÎË ÉÑ divisible ÞÁÓÔÉÞÎÏ ÁÒÁÍÅÔÒÉÚÏ×Á ÎÁ ÅÒÅÍÅÎÎÏÊ x; ÆÕÎË ÉÑ filter ¾ÏÔÆÉÌØÔÒÏ×Ù×ÁÅÔ¿ ÉÚ ÓÉÓËÁ ÅÌÙÈ ÞÉÓÅÌ ÏÔ 1 ÄÏ x ÔÏÌØËÏ ÔÅ, ËÏÔÏÒÙÅ Ñ×ÌÑÀÔÓÑ ÄÅÌÉÔÅÌÑÍÉ ÞÉÓÌÁ x. ãÅÌÏÅ ÞÉÓÌÏ ÎÁÚÙ×ÁÅÔÓÑ , ÅÓÌÉ ÏÎÏ ÉÍÅÅÔ ÄÅ ÌÉÔÅÌÑ: ÅÄÉÎÉ Õ É ÓÁÍÏ ÓÅÂÑ. æÕÎË ÉÑ prime ÒÏ×ÅÒÑÅÔ, ÄÅÊÓÔ×É ÔÅÌØÎÏ ÌÉ × ÓÉÓËÅ ÄÅÌÉÔÅÌÅÊ ÎÁÈÏÄÑÔÓÑ ÔÏÌØËÏ ÜÔÉ Ä×Á ÞÉÓÌÁ:
ÒÏÓÔÙÍ
ÒÏ×ÎÏ Ä×Á
prime :: Int -> Bool prime x = denominators x == [1, x℄ é ÎÁËÏÎÅ , ÆÕÎË ÉÑ primes ÎÁÈÏÄÉÔ ×ÓÅ ÒÏÓÔÙÅ ÞÉÓÌÁ, ÎÅ ÒÅ×Ù ÛÁÀÝÉÅ ÄÁÎÎÏÅ:
primes :: Int -> [Int℄ primes x = filter prime [1 ..x℄ é ÈÏÔÑ ÜÔÏÔ ÓÏÓÏ ×ÙÞÉÓÌÅÎÉÑ ÓÉÓËÁ ÒÏÓÔÙÈ ÞÉÓÅÌ, ÎÅ ÒÅ×ÙÛÁ ÀÝÉÈ ÄÁÎÎÏÅ, ÎÅ Ñ×ÌÑÅÔÓÑ ÎÁÉÂÏÌÅÅ ÜÆÆÅËÔÉ×ÎÙÍ, ÏÎ ÉÍÅÅÔ ÎÅÏ ÓÏÒÉÍÏÅ ÒÅÉÍÕÝÅÓÔ×Ï ×ÓÅ ÆÕÎË ÉÉ × ÎÅÍ Ñ×ÌÑÀÔÓÑ ÒÏÓÔÙÍ ÅÒÅÌÏÖÅÎÉÅÍ ÍÁÔÅÍÁÔÉÞÅÓËÉÈ ÏÒÅÄÅÌÅÎÉÊ ÎÁ ÑÚÙË Haskell.
1.2. ïÒÅÄÅÌÅÎÉÅ ÄÎÑ ÎÅÄÅÌÉ
H
ëÁËÉÍ ÄÎÅÍ ÎÅÄÅÌÉ ÂÕÄÅÔ ÏÓÌÅÄÎÉÊ ÄÅÎØ ÔÅËÕÝÅÇÏ ÇÏÄÁ? á × ËÁËÏÊ ÄÅÎØ ÎÅÄÅÌÉ ×Ù ÒÏÄÉÌÉÓØ? äÌÑ ÏÔ×ÅÔÁ ÎÁ ÏÄÏÂÎÙÅ ×ÏÒÏÓÙ ÄÁ×ÁÊÔÅ ÏÒÅÄÅÌÉÍ ÆÕÎË ÉÀ day, ËÏÔÏÒÁÑ Ï ÚÁÄÁÎÎÏÍÕ ÄÎÀ ÍÅ ÓÑ Á, ÍÅÓÑ Õ É ÇÏÄÕ ÂÕÄÅÔ ×ÙÄÁ×ÁÔØ ÄÅÎØ ÎÅÄÅÌÉ, ÎÁ ËÏÔÏÒÙÊ ÏÎ ÒÉÈÏÄÉÔÓÑ.
---> day 31 12 2002 "Tuesday" åÓÌÉ ÕÖÅ ÉÚ×ÅÓÔÅÎ ÎÏÍÅÒ ÄÎÑ ÎÅÄÅÌÉ, ÔÏ, ÏÓÎÏ×Ù×ÁÑÓØ ÎÁ ÒÅÄ ÌÏÖÅÎÎÏÊ ×ÙÛÅ ÓÈÅÍÅ ËÏÄÉÒÏ×ÁÎÉÑ, ÆÕÎË ÉÀ day ÌÅÇËÏ ÎÁÉÓÁÔØ:
day d m y = weekday (daynumber d m y)
1. òÁÂÏÔÁ Ó ÅÌÙÍÉ ÞÉÓÌÁÍÉ weekday weekday weekday weekday weekday weekday weekday
0 1 2 3 4 5 6
= = = = = = =
"Sunday" "Monday" "Tuesday" "Wednesday" "Thursday" "Friday" "Saturday"
--------
99
÷ÏÓËÒÅÓÅÎØÅ ðÏÎÅÄÅÌØÎÉË ÷ÔÏÒÎÉË óÒÅÄÁ þÅÔ×ÅÒÇ ðÑÔÎÉ Á óÕÂÂÏÔÁ
æÕÎË ÉÑ weekday ÉÓÏÌØÚÕÅÔ ÓÅÍØ ÛÁÂÌÏÎÏ× ÄÌÑ ÏÒÅÄÅÌÅÎÉÑ ÎÁ ÉÍÅÎÏ×ÁÎÉÑ ÄÎÑ ÎÅÄÅÌÉ (ÒÅÚÕÌØÔÁÔÏÍ Ñ×ÌÑÅÔÓÑ ÓÔÒÏËÁ, ÚÁËÌÀÞÅÎ ÎÁÑ × ËÁ×ÙÞËÉ). æÕÎË ÉÑ daynumber ÏÒÅÄÅÌÑÅÔ ÞÉÓÌÏ ÄÎÅÊ, ÒÏÛÅÄÛÉÈ Ó Ï ÓÌÅÄÎÅÇÏ ×ÏÓËÒÅÓÅÎØÑ, É ÄÏÂÁ×ÌÑÅÔ Ë ÎÅÍÕ:
ÞÉÓÌÏ ÅÌÙÈ ÌÅÔ, ÕÍÎÏÖÅÎÎÏÅ ÎÁ 365; ÏÒÁ×ËÕ ÎÁ ÞÉÓÌÏ ÒÏÛÅÄÛÉÈ ×ÉÓÏËÏÓÎÙÈ ÇÏÄÏ×; ÞÉÓÌÏ ÄÎÅÊ ×Ï ×ÓÅÈ ÕÖÅ ÏÌÎÏÓÔØÀ ÒÏÛÅÄÛÉÈ × ÔÅËÕÝÅÍ
ÇÏÄÕ ÍÅÓÑ Å×; ÞÉÓÌÏ ÄÎÅÊ, ÒÏÛÅÄÛÉÈ Ó ÎÁÞÁÌÁ ÍÅÓÑ Á.
úÁÔÅÍ ÎÁÈÏÄÉÔÓÑ ÏÓÔÁÔÏË ÏÔ ÄÅÌÅÎÉÑ ÎÁ 7 ÏÌÕÞÅÎÎÏÇÏ (ÏÇÒÏÍÎÏÇÏ) ÞÉÓÌÁ ÜÔÏ É ÂÕÄÅÔ ÎÏÍÅÒ ÄÎÑ ÎÅÄÅÌÉ. ÷ ÎÁÛÅÍ (ÇÒÉÇÏÒÉÁÎÓËÏÍ) ËÁÌÅÎÄÁÒÅ, ××ÅÄÅÎÎÏÍ ÁÏÊ çÒÉÇÏ ÒÉÅÍ × 1752 ÇÏÄÕ, ÄÅÊÓÔ×ÕÀÔ ÓÌÅÄÕÀÝÉÅ ÒÁ×ÉÌÁ ÏÒÅÄÅÌÅÎÉÑ ×É ÓÏËÏÓÎÙÈ ÇÏÄÏ× (ÄÌÉÎÁ ËÏÔÏÒÙÈ 366 ÄÎÅÊ):
ÅÓÌÉ ÎÏÍÅÒ ÇÏÄÁ ÄÅÌÉÔÓÑ ÎÁ 4, ÔÏ ÇÏÄ Ñ×ÌÑÅÔÓÑ ×ÉÓÏËÏÓÎÙÍ
(ÎÁÒÉÍÅÒ, 1972); ÎÏ: ÅÓÌÉ ÎÏÍÅÒ ÇÏÄÁ ÄÅÌÉÔÓÑ ÎÁ 100, ÔÏ ÇÏÄ ÎÅ ×ÉÓÏËÏÓÎÙÊ (ÎÁÒÉÍÅÒ, 1900); ÎÏ: ÅÓÌÉ ÎÏÍÅÒ ÇÏÄÁ ÄÅÌÉÔÓÑ ÎÁ 400, ÔÏ ÇÏÄ ×ÉÓÏ ËÏÓÎÙÍ (ÎÁÒÉÍÅÒ, 2000).
Ñ×ÌÑÅÔÓÑ
ÅÅÒØ, ÚÎÁÑ, ÞÔÏ 1 ÑÎ×ÁÒÑ 0 ÇÏÄÁ ÂÙÌÏ ×ÏÓËÒÅÓÅÎØÅÍ, ÌÅÇËÏ ÏÌÎÏÓÔØÀ ÏÒÅÄÅÌÉÔØ ÆÕÎË ÉÀ daynumber:
daynumber + (y-1) - (y-1) + (y-1)
d m y `div` `div` `div`
= ( 4 100 400 + + )
(y-1)*365
sum (take (m-1) (months y)) d `rem` 7
V. þÉÓÌÏ×ÙÅ ÆÕÎË ÉÉ
100
H
÷ÙÚÏ× take n xs ×ÏÚ×ÒÁÝÁÅÔ ÅÒ×ÙÅ n ÜÌÅÍÅÎÔÏ× ÓÉÓËÁ xs. üÔÁ ÆÕÎË ÉÑ ÍÏÖÅÔ ÂÙÔØ ÏÒÅÄÅÌÅÎÁ, ÎÁÒÉÍÅÒ, ÔÁË (ÄÁÎÎÏÅ ÏÒÅÄÅ ÌÅÎÉÅ ÎÅÍÎÏÇÏ ÏÔÌÉÞÁÅÔÓÑ ÏÔ ÒÉ×ÅÄÅÎÎÏÇÏ × ÒÅÁÍÂÕÌÅ):
take 0 xs = [℄ take (n+1) (x:xs) = x : take n xs æÕÎË ÉÑ months ×ÏÚ×ÒÁÝÁÅÔ ÞÉÓÌÏ ÄÎÅÊ × ËÁÖÄÏÍ ÉÚ ÍÅÓÑ Å× ÚÁ ÄÁÎÎÏÇÏ ÇÏÄÁ:
months y = [31,feb,31,30,31,30,31,31,30,31,30,31℄ where feb | leap y = 29 | otherwise = 28 æÕÎË ÉÑ leap ÉÓÏÌØÚÕÅÔÓÑ × ÏÈÒÁÎÎÏÍ ×ÙÒÁÖÅÎÉÉ ÒÅÄÙÄÕÝÅÊ ÆÕÎË ÉÉ:
leap y = divisible y 4 && (not (divisible y 100)) || divisible y 400 åÅ ÖÅ ÍÏÖÎÏ ÏÒÅÄÅÌÉÔØ É Ï-ÄÒÕÇÏÍÕ:
leap y | divisible y 100 | otherwise
= divisible y 400 = divisible y 4
äÌÑ ÔÏÇÏ ÞÔÏÂÙ ÓÄÅÌÁÔØ ÏÌÎÏÓÔØÀ ËÏÒÒÅËÔÎÙÍ ÏÒÅÄÅÌÅÎÉÅ ÆÕÎË ÉÉ day, ÄÏÂÁ×ÉÍ ÏÈÒÁÎÎÏÅ ×ÙÒÁÖÅÎÉÅ, ÎÅ ÏÚ×ÏÌÑÀÝÅÅ ÒÉÍÅÎÉÔØ ÜÔÕ ÆÕÎË ÉÀ Ë ÅÒÉÏÄÕ ÄÏ ××ÅÄÅÎÉÑ ÇÒÉÇÏÒÉÁÎÓËÏÇÏ ËÁÌÅÎÄÁÒÑ:
day d m y | y >1752 = weekday (daynumber d m y) ÅÅÒØ ×ÙÚÏ× ÜÔÏÊ ÆÕÎË ÉÉ Ó ÏÓÌÅÄÎÉÍ ÁÒÁÍÅÔÒÏÍ, ÍÅÎØÛÉÍ ÞÅÍ 1752, ÒÉ×ÅÄÅÔ Ë ÓÏÏÂÝÅÎÉÀ Ï ÏÛÉÂËÅ.
---> day 16 9 2002 "Monday" ---> day 16 9 120 " Program error: îÏÍÅÒ ÇÏÄÁ ÍÅÎØÛÅ 1752 1.3. óÔÒÁÔÅÇÉÉ ÒÁÚÒÁÂÏÔËÉ ÒÏÇÒÁÍÍ ðÒÉ ÒÏÅËÔÉÒÏ×ÁÎÉÉ ÒÏÇÒÁÍÍ ÄÌÑ ÜÔÉÈ Ä×ÕÈ ÒÉÍÅÒÏ× ÉÓÏÌØ ÚÏ×ÁÌÉÓØ Ä×Å ÒÁÚÌÉÞÎÙÅ ÓÔÒÁÔÅÇÉÉ ÒÁÚÒÁÂÏÔËÉ. ÷Ï ×ÔÏÒÏÍ ÒÉÍÅÒÅ ÍÙ ÅÒ×ÙÍ ÄÅÌÏÍ ÏÒÅÄÅÌÉÌÉ ÆÕÎË ÉÀ day × ÔÅÒÍÉÎÁÈ ÆÕÎË ÉÊ weekday É daynumber. ðÒÉ ÒÁÚÒÁÂÏÔËÅ ÆÕÎË ÉÉ daynumber ÍÙ ÉÓ ÏÌØÚÏ×ÁÌÉ ÆÕÎË ÉÀ months, ËÏÔÏÒÁÑ × Ó×ÏÀ ÏÞÅÒÅÄØ ÉÓÏÌØÚÏ×Á ÌÁ ÆÕÎË ÉÀ leap. ÁËÁÑ ÓÔÒÁÔÅÇÉÑ ÎÏÓÉÔ ÎÁÚ×ÁÎÉÅ ¾ ¿:
Ó×ÅÒÈÕ ×ÎÉÚ
2. þÉÓÌÅÎÎÙÅ ×ÙÞÉÓÌÅÎÉÑ
101
ÎÁÞÉÎÁÅÔÓÑ ÒÁÚÒÁÂÏÔËÁ Ó ÎÁÉÂÏÌÅÅ ×ÁÖÎÙÈ ×ÅÝÅÊ É, ÚÁÔÅÍ, Ï ÍÅÒÅ ÎÁÄÏÂÎÏÓÔÉ, ÏÒÅÄÅÌÑÀÔÓÑ ÄÏÏÌÎÉÔÅÌØÎÙÅ ÆÕÎË ÉÉ. ÷ ÅÒ×ÏÍ ÖÅ ÒÉÍÅÒÅ ÒÉÍÅÎÑÌÁÓØ ÓÔÒÁÔÅÇÉÑ ¾ ¿: ÓÎÁÞÁÌÁ ÂÙÌÁ ÎÁÉÓÁÎÁ ÆÕÎË ÉÑ divisible, Ó ÅÅ ÏÍÏÝØÀ ÏÒÅ ÄÅÌÉÌÉ ÆÕÎË ÉÀ denominators, ÚÁÔÅÍ ÆÕÎË ÉÀ prime É, ÎÁËÏÎÅ , primes. ðÒÉÍÅÎÅÎÉÅ ÔÏÊ ÉÌÉ ÉÎÏÊ ÓÔÒÁÔÅÇÉÉ ÎÉËÁË ÎÅ ÓËÁÚÙ×ÁÅÔÓÑ ÎÁ ÏËÏÎÞÁÔÅÌØÎÏÍ ÒÅÚÕÌØÔÁÔÅ: ×ÅÄØ ÉÎÔÅÒÒÅÔÁÔÏÒ ÎÉÞÅÇÏ ÎÅ ÚÎÁÅÔ Ï ÔÏÍ, × ËÁËÏÍ ÏÒÑÄËÅ ÒÁÚÒÁÂÁÔÙ×ÁÌÉÓØ ÆÕÎË ÉÉ. ÅÍ ÎÅ ÍÅÎÅÅ, ÒÉ ÒÁÚÒÁÂÏÔËÅ ÒÏÇÒÁÍÍ ÓÌÅÄÕÅÔ ÏÂÒÁÝÁÔØ ×ÎÉÍÁÎÉÅ ÎÁ ÔÏ, ËÁËÏÊ ÉÚ ÓÔÉÌÅÊ ÉÓÏÌØÚÕÅÔÓÑ.
ÓÎÉÚÕ ××ÅÒÈ
2. þÉÓÌÅÎÎÙÅ ×ÙÞÉÓÌÅÎÉÑ 2.1. þÉÓÌÅÎÎÏÅ ÄÉÆÆÅÒÅÎ ÉÒÏ×ÁÎÉÅ ðÒÉ ×ÙÞÉÓÌÅÎÉÑÈ, × ËÏÔÏÒÙÈ ÕÞÁÓÔ×ÕÀÔ ÞÉÓÌÁ ÔÉÁ Float, ÔÏÞ ÎÏÅ ÎÁÈÏÖÄÅÎÉÅ ÒÅÚÕÌØÔÁÔÁ × ÂÏÌØÛÉÎÓÔ×Å ÓÌÕÞÁÅ× ÎÅ×ÏÚÍÏÖÎÏ. òÅÚÕÌØÔÁÔ ×ÙÞÉÓÌÅÎÉÑ ÏËÒÕÇÌÑÅÔÓÑ Ó ÔÏÞÎÏÓÔØÀ ÄÏ ÎÅÓËÏÌØËÉÈ ÄÅ ÓÑÔÉÞÎÙÈ ÉÆÒ ÏÓÌÅ ÚÁÑÔÏÊ.
---> 10.0/6.0 1.66667
H
ðÒÉ ×ÙÞÉÓÌÅÎÉÉ ÎÅËÏÔÏÒÙÈ ÍÁÔÅÍÁÔÉÞÅÓËÉÈ ÆÕÎË ÉÊ, ÔÁËÉÈ ËÁË sqrt, ÒÅÚÕÌØÔÁÔ ÔÁËÖÅ ÏËÒÕÇÌÑÅÔÓÑ. ðÏÜÔÏÍÕ É ÒÉ ÒÁÚÒÁÂÏÔ ËÅ Ó×ÏÉÈ ÓÏÂÓÔ×ÅÎÎÙÈ ÆÕÎË ÉÊ, ÏÅÒÉÒÕÀÝÉÈ ÞÉÓÌÁÍÉ ÔÉÁ Float, ÏÌÕÞÅÎÎÙÊ ÒÅÚÕÌØÔÁÔ ÔÁËÖÅ ÂÕÄÅÔ Ñ×ÌÑÔØÓÑ ÁÒÏËÓÉÍÁ ÉÅÊ ¾ÒÅ ÁÌØÎÏÇÏ¿ ÚÎÁÞÅÎÉÑ. ðÒÉÍÅÒÏÍ ÜÔÏÇÏ ÍÏÖÅÔ ÓÌÕÖÉÔØ ×ÙÞÉÓÌÅÎÉÅ ÒÏÉÚ×ÏÄÎÏÊ ÔÏÊ ÉÌÉ ÉÎÏÊ ÍÁÔÅÍÁÔÉÞÅÓËÏÊ ÆÕÎË ÉÉ. íÁÔÅÍÁÔÉÞÅÓËÏÅ ÏÒÅÄÅÌÅÎÉÅ ÒÏÉÚ×ÏÄÎÏÊ f 0 ÏÔ ÆÕÎË ÉÉ f ÔÁËÏ×Ï: f (x + h) f (x) f 0 (x) = lim h!0
h
ÏÞÎÏÅ ÚÎÁÞÅÎÉÅ ÒÅÄÅÌÁ ÎÅ ÍÏÖÅÔ ÂÙÔØ ×ÙÞÉÓÌÅÎÏ ÎÁ ËÏÍØÀ ÔÅÒÅ. ïÄÎÁËÏ, ÒÉÂÌÉÖÅÎÎÏÅ ÚÎÁÞÅÎÉÅ ÍÏÖÅÔ ÏÌÕÞÅÎÏ Ó ÉÓÏÌØÚÏ ×ÁÎÉÅÍ ÄÏÓÔÁÔÏÞÎÏ ÍÁÌÙÈ ÚÎÁÞÅÎÉÊ h. ïÅÒÁ ÉÑ ÄÉÆÆÅÒÅÎ ÉÒÏ×ÁÎÉÑ ÅÓÔØ ÆÕÎË ÉÑ ×ÙÓÛÅÇÏ ÏÒÑÄ ËÁ: ÆÕÎË ÉÑ ÂÅÒÅÔÓÑ × ËÁÞÅÓÔ×Å ÁÒÇÕÍÅÎÔÁ É ÆÕÎË ÉÑ Ñ×ÌÑÅÔÓÑ ÒÅÚÕÌØÔÁÔÏÍ ×ÙÞÉÓÌÅÎÉÑ. ïÒÅÄÅÌÅÎÉÅ ÍÏÖÅÔ ÂÙÔØ ÔÁËÉÍ:
diff
:: (Float -> Float) -> (Float -> Float)
V. þÉÓÌÏ×ÙÅ ÆÕÎË ÉÉ
102
diff f = f' where f' x = (f (x + h) - f x) / h h = 0.001
ó ÅÌØÀ ÏÌÕÞÅÎÉÑ ËÁÒÒÉÎÇÏ×ÏÊ ÆÏÒÍÙ ÆÕÎË ÉÉ ÍÏÖÎÏ ÕÂÒÁÔØ ×ÔÏÒÕÀ ÁÒÕ ÓËÏÂÏË × ÏÂßÑ×ÌÅÎÉÉ ÔÉÁ, ÔÁË ËÁË -> ÁÓÓÏ ÉÁÔÉ×ÎÁ ÓÒÁ×Á.
diff
:: (Float -> Float) -> Float -> Float
ÅÅÒØ ÆÕÎË ÉÀ diff ÍÏÖÎÏ ÓÞÉÔÁÔØ ÆÕÎË ÉÅÊ ÏÔ Ä×ÕÈ ÁÒÁÍÅ ÔÒÏ×: (1) ÆÕÎË ÉÉ, ÒÏÉÚ×ÏÄÎÕÀ ËÏÔÏÒÏÊ ÓÌÅÄÕÅÔ ×ÙÞÉÓÌÉÔØ, É (2) ÔÏÞËÉ, × ËÏÔÏÒÏÊ ÚÎÁÞÅÎÉÅ ÒÏÉÚ×ÏÄÎÏÊ ÄÏÌÖÎÏ ÂÙÔØ ÏÄÓÞÉÔÁÎÏ. ó ÜÔÏÊ ÔÏÞËÉ ÚÒÅÎÉÑ ÏÒÅÄÅÌÅÎÉÅ ÔÅÅÒØ ×ÙÇÌÑÄÉÔ ÔÁË:
diff f = (f (x + h) - f x) / h where h = 0.001 üÔÉ Ä×Á ÏÒÅÄÅÌÅÎÉÑ ÁÂÓÏÌÀÔÎÏ ÜË×É×ÁÌÅÎÔÎÙ. ÷ÔÏÒÁÑ ×ÅÒÓÉÑ ÒÏ ÇÒÁÍÍÙ ÒÅÄÏÞÔÉÔÅÌØÎÅÅ, ÔÁË ËÁË ÏÎÁ ÒÏÝÅ É ÑÓÎÅÅ (× ÎÅÊ ÏÔÓÕÔ ÓÔ×ÕÅÔ ÎÅÏÂÈÏÄÉÍÏÓÔØ ××ÏÄÁ ÄÏÏÌÎÉÔÅÌØÎÏÊ ÆÕÎË ÉÉ f'. ó ÄÒÕ ÇÏÊ ÓÔÏÒÏÎÙ, ÅÒ×ÏÅ ÏÒÅÄÅÌÅÎÉÅ ÏÄÞÅÒËÉ×ÁÅÔ, ÞÔÏ diff ÍÏÖÅÔ ÂÙÔØ ÒÁÓÓÍÏÔÒÅÎÁ, ËÁË ÒÅÏÂÒÁÚÏ×ÁÎÉÅ ÆÕÎË ÉÉ. æÕÎË ÉÀ diff ÏÞÅÎØ ÕÄÏÂÎÏ ÉÓÏÌØÚÏ×ÁÔØ ÏÓÌÅ ÞÁÓÔÉÞÎÏÊ Á ÒÁÍÅÔÒÉÚÁ ÉÉ, ËÁË × ÓÌÅÄÕÀÝÅÍ ÏÒÅÄÅÌÅÎÉÉ:
derivative_of_sine_square = diff (square . sin) ÷ÅÌÉÞÉÎÁ h × ÏÂÏÉÈ ÏÒÅÄÅÌÅÎÉÑÈ diff ÚÁÄÁÅÔÓÑ × ÒÅÄÌÏÖÅÎÉÉ where. ÅÍ ÎÅ ÍÅÎÅÅ, ÌÅÇËÏ ÅÒÅÄÅÌÁÔØ ÒÏÇÒÁÍÍÕ ÔÁËÉÍ ÏÂÒÁÚÏÍ, ÞÔÏÂÙ ÅÅ ÍÏÖÎÏ ÂÙÌÏ ÂÙ × ÂÕÄÕÝÅÍ ÌÅÇËÏ ÉÚÍÅÎÑÔØ. îÁÉÂÏÌÅÅ ÇÉÂËÉÍ ÕÔØ ÜÔÏ ÚÁÄÁÔØ h × ËÁÞÅÓÔ×Å ÁÒÁÍÅÔÒÁ diff:
flexDiff h f x = (f (x + h) - f x) / h úÁÄÁ× h × ËÁÞÅÓÔ×Å ÅÒ×ÏÇÏ ÁÒÇÕÍÅÎÔÁ ÆÕÎË ÉÉ flexDiff, ÍÏÖÎÏ ÉÓÏÌØÚÏ×ÁÔØ É ÅÅ × ÞÁÓÔÉÞÎÏ ÁÒÁÍÅÔÒÉÚÏ×ÁÎÎÏÊ ÆÏÒÍÅ, ÞÔÏÂÙ ÏÌÕÞÉÔØ ÒÁÚÌÉÞÎÙÅ ×ÅÒÓÉÉ diff:
roughDiff = flexDiff 0.01 fineDiff = flexDiff 0.0001 superDiff = flexDiff 0.000001 2.2. ÷ÙÞÉÓÌÅÎÉÅ Ë×ÁÄÒÁÔÎÏÇÏ ËÏÒÎÑ ÷ ÒÅÌÀÄÉÉ ÏÒÅÄÅÌÅÎÁ ÆÕÎË ÉÑ sqrt ÄÌÑ ×ÙÞÉÓÌÅÎÉÑ Ë×Á ÄÒÁÔÎÏÇÏ ËÏÒÎÑ ÉÚ ÞÉÓÌÁ. ÷ ÜÔÏÍ ÒÁÚÄÅÌÅ ÂÕÄÅÔ ÒÁÓÓÍÏÔÒÅÎ ÒÏ ÅÓÓ ÒÁÚÒÁÂÏÔËÉ ÏÒÅÄÅÌÅÎÉÑ ÆÕÎË ÉÉ sqrt, × ËÏÔÏÒÏÍ ÎÅ ÂÕÄÅÔ
2. þÉÓÌÅÎÎÙÅ ×ÙÞÉÓÌÅÎÉÑ
103
ÉÓÏÌØÚÏ×ÁÔØÓÑ ÓÔÁÎÄÁÒÔÎÁÑ ÆÕÎË ÉÑ, ÒÅÄÎÁÚÎÁÞÅÎÎÁÑ ÄÌÑ ÜÔÉÈ ÅÌÅÊ. üÔÏÔ ÒÉÍÅÒ ÏÚ×ÏÌÉÔ ÒÏÄÅÍÏÎÓÔÒÉÒÏ×ÁÔØ ÔÅÈÎÉËÕ ÒÁÂÏ ÔÙ Ó ÞÉÓÌÁÍÉ ÔÉÁ Float. ÷ ÓÌÅÄÕÀÝÉÈ ÒÁÚÄÅÌÁÈ ÂÕÄÅÔ ÒÁÓÓÍÏÔÒÅÎ ÒÏ ÅÓÓ ×ÙÞÉÓÌÅÎÉÑ ÏÂÒÁÔÎÏÊ ÆÕÎË ÉÉ, ÞÔÏ ÏÚ×ÏÌÉÔ ÄÁÔØ ÄÒÕÇÕÀ ÒÅÁÌÉÚÁ ÉÀ ÆÕÎË ÉÉ ×ÙÞÉÓÌÅÎÉÑ Ë×ÁÄÒÁÔÎÏÇÏ ËÏÒÎÑ. äÌÑ Ë×ÁÄÒÁÔÎÏÇÏ ËÏÒÎÑ ÉÚ ÞÉÓÌÁ x ÉÍÅÅÔ ÍÅÓÔÏ ÓÌÅÄÕÀÝÅÅ ÕÔ×ÅÒÖÄÅÎÉÅ:
p
ÅÓÌÉ y ÅÓÔØ ÈÏÒÏÛÅÅ ÒÉÂÌÉÖÅÎÉÅ ÄÌÑ x, ÔÏ 21 (y + xy ) Ñ×ÌÑÅÔÓÑ ÅÝÅ ÌÕÞÛÉÍ ÒÉÂÌÉÖÅÎÉÅÍ. üÔÏ Ó×ÏÊÓÔ×Ï ÍÏÖÅÔ ÂÙÔØ ÉÓÏÌØÚÏ×ÁÎÏ ÄÌÑ ×ÙÞÉÓÌÅÎÉÑ ËÏÒ ÎÑ ÉÚ ÞÉÓÌÁ x: ×ÏÚØÍÅÍ 1 × ËÁÞÅÓÔ×Å ÅÒ×ÏÇÏ ÒÉÂÌÉÖÅÎÉÑ É ÂÕÄÅÍ ÏÄÒÁ×ÌÑÔØ ÒÉÂÌÉÖÅÎÉÅ ÄÏ ÔÅÈ ÏÒ, ÏËÁ ÒÅÚÕÌØÔÁÔ ÎÁÓ ÎÅ ÕÓÔÒÏ p ÉÔ. ÷ÅÌÉÞÉÎÁ y Ñ×ÌÑÅÔÓÑ ÈÏÒÏÛÉÍ ÒÉÂÌÉÖÅÎÉÅÍ x, ÅÓÌÉ y2 ÎÅ p ÏÞÅÎØ ÏÔÌÉÞÁÅÔÓÑ ÏÔ x. äÌÑ ×ÅÌÉÞÉÎÙ 3 ÒÉÂÌÉÖÅÎÉÑ y0 , y1 É Ô.Ä. ÔÁËÏ×Ù:
y0 = =1 y1 = 0:5 (y0 + 3=y0 ) = 2 y2 = 0:5 (y1 + 3=y1 ) = 1:75 y3 = 0:5 (y2 + 3=y2 ) = 1:732142857 y4 = 0:5 (y3 + 3=y3 ) = 1:732050810 y5 = 0:5 (y4 + 3=y4 ) = 1:732050807
ë×ÁÄÒÁÔ ÏÓÌÅÄÎÅÊ ÁÒÏËÓÉÍÁ ÉÉ ÔÏÌØËÏ ÎÁ 10 18 ÏÔÌÉÞÁÅÔÓÑ ÏÔ ÔÒÅÈ. äÌÑ ÒÏ ÅÓÓÁ ¾ÏÄÒÁ×ËÉ¿ ÎÁÞÁÌØÎÏÇÏ ÚÎÁÞÅÎÉÑ ÕÄÏÂÎÏ ÉÓ ÏÌØÚÏ×ÁÔØ ÆÕÎË ÉÀ until, ÒÁÓÓÍÏÔÒÅÎÎÕÀ ÎÁ ÓÔÒ. 90:
root x = until goodEnough improve 1.0 where improve y = 0.5 * (y + x/y) goodEnough y = y*y ~= x ïÅÒÁÔÏÒ ~= (ÒÉÂÌÉÚÉÔÅÌØÎÏ ÒÁ×ÎÏ), ÍÏÖÅÔ ÂÙÔØ ÏÒÅÄÅÌÅÎ ÓÌÅ ÄÕÀÝÉÍ ÏÂÒÁÚÏÍ:
infix 5 ~= a ~= b = a - b < h && b - a < h where h = 0.000001 ÷ ÜÔÏÍ ÏÒÅÄÅÌÅÎÉÉ ÆÕÎË ÉÑ ×ÙÓÛÅÇÏ ÏÒÑÄËÁ until ÏÅÒÉÒÕÅÔ improve (ÕÌÕÞÛÁÔØ) É goodEnough (ÄÏÓÔÁÔÏÞÎÏ ÈÏÒÏ ÛÏ), ÉÓÏÌØÚÕÑ ÎÁÞÁÌØÎÏÅ ÚÎÁÞÅÎÉÅ 1.0.
ÆÕÎË ÉÑÍÉ
V. þÉÓÌÏ×ÙÅ ÆÕÎË ÉÉ
104
f b x0 b-d
b
ðÒÉÂÌÉÖÅÎÉÅ ÍÅÔÏÄÏÍ îØÀÔÏÎÁ èÏÔÑ × ÚÁÉÓÉ ÆÕÎË ÉÉ root ÓÒÁÚÕ ÚÁ improve ÒÁÓÏÌÁÇÁÅÔÓÑ 1.0, ÆÕÎË ÉÑ improve ÎÅ ÒÉÍÅÎÑÅÔÓÑ ÎÅÏÓÒÅÄÓÔ×ÅÎÎÏ Ë ÞÉÓÌÕ 1.0; ×ÍÅÓÔÏ ÜÔÏÇÏ ÏÂÁ ÜÔÉ ÏÂßÅËÔÁ ÅÒÅÄÁÀÔÓÑ ÆÕÎË ÉÉ until. ó ÔÏÞËÉ ÚÒÅÎÉÑ ÒÏ ÅÓÓÁ ËÁÒÒÉÎÇÁ, ÜÔÏ ÜË×É×ÁÌÅÎÔÎÏ ÓÌÅÄÕÀÝÅÊ ÒÁÓÓÔÁÎÏ× ËÅ ÓËÏÂÏË (((until goodEnough) improve) 1.0). ÏÌØËÏ ÚÁÇÌÑÎÕ× × ÏÒÅÄÅÌÅÎÉÉ ÆÕÎË ÉÉ until ÍÏÖÎÏ Õ×ÉÄÅÔØ, ËÁË improve ÒÉÍÅ ÎÑÅÔÓÑ Ë 1.0.
2.3. îÕÌÉ ÆÕÎË ÉÉ äÒÕÇÏÊ ×ÙÞÉÓÌÉÔÅÌØÎÏÊ ÒÏÂÌÅÍÏÊ, ËÏÔÏÒÁÑ ÍÏÖÅÔ ÂÙÔØ ÒÅÛÅ ÎÁ Ó ÏÍÏÝØÀ ÉÔÅÒÁ ÉÉ, Ñ×ÌÑÅÔÓÑ ÎÁÈÏÖÄÅÎÉÅ ÎÕÌÅÊ ÆÕÎË ÉÉ.
òÁÓÓÍÏÔÒÉÍ ÆÕÎË ÉÀ f , ËÏÒÅÎØ x0 ËÏÔÏÒÏÊ ÔÒÅÂÕÅÔÓÑ ÎÁÊÔÉ. ÷ÏÚØÍÅÍ b × ËÁÞÅÓÔ×Å ÅÒ×ÏÇÏ ÒÉÂÌÉÖÅÎÉÑ ÄÌÑ ÎÕÌÑ ÆÕÎË ÉÉ. ÏÇÄÁ ËÁÓÁÔÅÌØÎÁÑ, ÒÏ×ÅÄÅÎÎÁÑ Ë ÆÕÎË ÉÉ f × ÔÏÞËÅ b ÅÒÅÓÅËÁÅÔ ÏÓØ x × ÔÏÞËÅ, Ñ×ÌÑÀÝÅÊÓÑ ÌÕÞÛÉÍ ÒÉÂÌÉÖÅÎÉÅÍ ÎÕÌÑ, ÞÅÍ b (ÓÍ. ÒÉÓÕÎÏË).
ÏÞËÁ ÅÒÅÓÅÞÅÎÉÑ ËÁÓÁÔÅÌØÎÏÊ Ó ÏÓØÀ x ÎÁÈÏÄÉÔÓÑ ÎÁ ÒÁÓÓÔÏ ÑÎÉÉ d ÏÔ ÅÒ×ÏÇÏ ÒÉÂÌÉÖÅÎÉÑ b. ÷ÅÌÉÞÉÎÁ d ÍÏÖÅÔ ÂÙÔØ ×ÙÞÉ ÓÌÅÎÁ ÓÌÅÄÕÀÝÉÍ ÏÂÒÁÚÏÍ. ÁÎÇÅÎÓ ÕÇÌÁ ÎÁËÌÏÎÁ ËÁÓÁÔÅÌØÎÏÊ Ë ÆÕÎË ÉÉ f × ÔÏÞËÅ b ÒÁ×ÅÎ f 0 (b). ó ÄÒÕÇÏÊ ÓÔÏÒÏÎÙ, ÜÔÏ ÚÎÁÞÅÎÉÅ ÒÁ×ÎÏ f(b)/d, ÏÜÔÏÍÕ d = f (b)=f 0(b). äÁÎÎÏÅ ÚÁÍÅÞÁÎÉÅ ÏÚ×ÏÌÑÅÔ ÎÁÍ ÓÄÅÌÁÔØ ÓÌÅÄÕÀÝÉÊ ×Ù×ÏÄ: ÅÓ ÌÉ b ÅÓÔØ ÅÒ×ÏÅ ÒÉÂÌÉÖÅÎÉÅ ÎÕÌÑ ÆÕÎË ÉÉ f, ÔÏ b f (b)=f 0(b)
2. þÉÓÌÅÎÎÙÅ ×ÙÞÉÓÌÅÎÉÑ
105
ÅÓÔØ ÌÕÞÛÅÅ ÒÉÂÌÉÖÅÎÉÅ. üÔÏÔ ÍÅÔÏÄ ÉÚ×ÅÓÔÅÎ, ËÁË ¾ÍÅÔÏÄ îØÀ ÔÏÎÁ¿ (ÜÔÏÔ ÍÅÔÏÄ ÎÅ ×ÓÅÇÄÁ ÒÁÂÏÔÁÅÔ ÄÌÑ ÆÕÎË ÉÊ Ó ÌÏËÁÌØÎÙÍÉ ÜËÓÔÒÅÍÕÍÁÍÉ: ×Ù ÍÏÖÅÔÅ ¾ÈÏÄÉÔØ ×ÏËÒÕÇ¿ ÎÕÖÎÏÇÏ ËÏÒÎÑ É ÎÉ ËÏÇÄÁ × ÎÅÇÏ ÎÅ ÏÁÓÔØ). äÌÑ ÏÌÕÞÅÎÉÑ ÆÕÎË ÉÉ, ×ÙÞÉÓÌÑÀÝÅÊ ÎÕÌÉ ÜÔÏÍ ÍÅÔÏÄÏÍ, ÔÁËÖÅ ÍÏÖÎÏ ÉÓÏÌØÚÏ×ÁÔØ ÆÕÎË ÉÀ until. ÷ ËÁÞÅÓÔ×Å ÁÒÁÍÅÔÒÁ ÂÕÄÅÍ ÉÓÏÌØÚÏ×ÁÔØ ÒÉÂÌÉÖÅÎÉÅ (improve), ÚÁÄÁ×ÁÅÍÏÅ ÒÉ×ÅÄÅÎ ÎÏÊ ×ÙÛÅ ÆÏÒÍÕÌÏÊ (ÄÌÑ ÞÅÇÏ ×ÏÓÏÌØÚÕÅÍÓÑ ÒÁÎÅÅ ÏÒÅÄÅÌÅÎÎÏÊ ÆÕÎË ÉÅÊ diff). õÓÌÏ×ÉÅÍ ÏËÏÎÞÁÎÉÑ ÉÔÅÒÁ ÉÊ ÂÕÄÅÔ ÓÌÕÖÉÔØ ÄÏ ÓÔÁÔÏÞÎÏ ÍÁÌÏÅ ÏÔËÌÏÎÅÎÉÅ ÆÕÎË ÉÉ ÏÔ ÎÕÌÅ×ÏÇÏ ÚÎÁÞÅÎÉÑ.
zero f = until goodEnough improve 1.0 where improve b = b - f b / diff f b goodEnough b = f b ~= 0.0
íÙ ×ÙÂÒÁÌÉ 1.0 × ËÁÞÅÓÔ×Å ÅÒ×ÏÇÏ ÒÉÂÌÉÖÅÎÉÑ, ÎÏ Ó ÔÁËÉÍ ÖÅ ÕÓÅÈÏÍ, ÜÔÏ ÍÏÇÌÏ ÂÙÔØ É ÞÉÓÌÏ 17.93. ÷ÏÏÂÝÅ, ÜÔÏ ÍÏÖÅÔ ÂÙÔØ ÌÀÂÁÑ ÔÏÞËÁ ÉÚ ÏÂÌÁÓÔÉ ÏÒÅÄÅÌÅÎÉÑ ÆÕÎË ÉÉ f.
2.4. ïÂÒÁÔÎÁÑ ÆÕÎË ÉÑ
p
2 a, ÒÁ×ÅÎ a. ó ÕÞÅÔÏÍ ÜÔÏÇÏ ÚÁ îÏÌØ ÆÕÎË ÉÉ f , ÇÄÅ fx = xp ÍÅÞÁÎÉÑ ÍÙ ÍÏÖÅÍ ×ÙÞÉÓÌÉÔØ a ËÁË ÎÏÌØ ÆÕÎË ÉÉ f . ðÒÉÍÅÎÉ× ÆÕÎË ÉÀ zero, root ÍÏÖÎÏ ÏÒÅÄÅÌÉÔØ ÔÁË: root a = zero f where f x = x*x - a ëÕÂÉÞÅÓËÉÊ ËÏÒÅÎØ ÍÏÖÎÏ ×ÙÞÉÓÌÉÔØ ÔÁË:
ubi a = zero f where f x = x*x*x - a áÎÁÌÏÇÉÞÎÏ, ÌÀÂÁÑ ÆÕÎË ÉÑ, ÏÂÒÁÔÎÁÑ Ë ÚÁÄÁÎÎÏÊ, ÍÏÖÅÔ ÂÙÔØ ×ÙÞÉÓÌÅÎÁ Ó ÉÓÏÌØÚÏ×ÁÎÉÅÍ ÜÔÏÊ ÆÕÎË ÉÉ × ÏÒÅÄÅÌÅÎÉÉ ÆÕÎË ÉÉ f, ÎÁÒÉÍÅÒ,
ar sin a = zero f where f x = sin x - a ar
os a = zero f where f x = os x - a
V. þÉÓÌÏ×ÙÅ ÆÕÎË ÉÉ
106
îÁÌÉÞÉÅ ÏÂÝÎÏÓÔÉ × ÏÒÅÄÅÌÅÎÉÑÈ ÜÔÉÈ ÆÕÎË ÉÊ Ñ×ÌÑÅÔÓÑ ÓÉÇ ÎÁÌÏÍ ÄÌÑ ÏÒÅÄÅÌÅÎÉÑ ÆÕÎË ÉÉ ×ÙÓÛÅÇÏ ÏÒÑÄËÁ, ËÏÔÏÒÁÑ ÏÂÏ ÝÁÅÔ ÜÔÉ ÓÌÕÞÁÉ (Ï ÁÎÁÌÏÇÉÉ Ó ÏÒÅÄÅÌÅÎÉÅÍ ÆÕÎË ÉÉ foldr, ËÏ ÔÏÒÁÑ ÏÑ×ÉÌÁÓØ ËÁË ÏÂÏÂÝÅÎÉÅ sum, produ t É and). ÷ ÄÁÎÎÏÍ ÓÌÕ ÞÁÅ ÆÕÎË ÉÑ inverse Ñ×ÌÑÅÔÓÑ ÆÕÎË ÉÅÊ ×ÙÓÛÅÇÏ ÏÒÑÄËÁ, ÉÍÅÀ ÝÅÊ ÄÏÏÌÎÉÔÅÌØÎÙÊ ÁÒÁÍÅÔÒ ÆÕÎË ÉÀ , ÉÎ×ÅÒÓÉÀ ËÏÔÏÒÏÊ ÔÒÅÂÕÅÔÓÑ ×ÙÞÉÓÌÉÔØ:
g
inverse g a = zero f where f x = g x - a åÓÌÉ ×Ù ÓÌÕÞÁÊÎÏ ÚÁÍÅÔÉÌÉ ÎÅËÕÀ ÚÁËÏÎÏÍÅÒÎÏÓÔØ, ÔÏ ÓÌÅÄÕÅÔ Ï ÙÔÁÔØÓÑ ÏÒÅÄÅÌÉÔØ ÆÕÎË ÉÀ ×ÙÓÛÅÇÏ ÏÒÑÄËÁ ÔÁË, ÞÔÏÂÙ ÄÒÕ ÇÉÅ ÆÕÎË ÉÉ ÓÔÁÌÉ ÒÏÓÔÏ ÞÁÓÔÎÙÍÉ ÓÌÕÞÁÑÍÉ ÅÅ ÒÉÍÅÎÅÎÉÑ. ðÒÉ ÜÔÏÍ ×ÓÅ ÞÁÓÔÎÙÅ ÓÌÕÞÁÉ ÓÌÅÄÕÅÔ ÏÒÅÄÅÌÉÔØ ÞÅÒÅÚ ÏÌÕÞÅÎÎÕÀ ÆÕÎË ÉÀ, ËÏÔÏÒÁÑ ÂÕÄÅÔ ÞÁÓÔÉÞÎÏ ÁÒÁÍÅÔÒÉÚÏ×Á ÒÁÚÌÉÞÎÙÍÉ Á ÒÁÍÅÔÒÁÍÉ:
ar sin = inverse sin ar
os = inverse os ln = inverse exp æÕÎË ÉÀ inverse ÍÏÖÎÏ ÒÁÓÓÍÁÔÒÉ×ÁÔØ ËÁË ÆÕÎË ÉÀ Ó Ä×ÕÍÑ ÁÒÁÍÅÔÒÁÍÉ (ÆÕÎË ÉÑ É Float) É Float × ËÁÞÅÓÔ×Å ÒÅÚÕÌØÔÁÔÁ, ÉÌÉ ËÁË ÆÕÎË ÉÀ Ó ÁÒÁÍÅÔÒÏÍ (ÆÕÎË ÉÑ) É ÆÕÎË ÉÅÊ ËÁË ÒÅÚÕÌØÔÁÔÏÍ. üÔÏ ÓÌÅÄÕÅÔ ÉÚ ÜË×É×ÁÌÅÎÔÎÏÓÔÉ ÓÌÅÄÕÀÝÉÈ ÏÂßÑ×ÌÅ ÎÉÊ ÔÉÁ ÆÕÎË ÉÉ inverse:
ÏÄÎÉÍ
inverse
::
(Float -> Float) -> Float -> Float
::
(Float -> Float) -> Float -> Float
É
inverse
(×ÓÏÍÎÉÍ Ï ÒÁ×ÏÊ ÁÓÓÏ ÉÁÔÉ×ÎÏÓÔÉ ->). æÕÎË ÉÑ ÎÁÈÏÖÄÅÎÉÑ ËÏÒÎÑ, ÉÓÏÌØÚÕÀÝÁÑ ÍÅÔÏÄ îØÀÔÏÎÁ, ÍÏÖÅÔ ÂÙÔØ ÏÌÕÞÅÎÁ ÏÄÏÂÎÙÍ ÕÔÅÍ. òÁÓÓÍÏÔÒÉÍ ÏÒÅÄÅÌÅÎÉÅ ÆÕÎË ÉÉ root:
root a = zero f where f x = x*x - a úÁÍÅÎÉ× ×ÙÚÏ× ÆÕÎË ÉÉ zero f ÅÇÏ ÏÒÅÄÅÌÅÎÉÅÍ, ÏÌÕÞÉÍ:
root a = until goodEnough improve 1.0 where improve b = b - f b / diff f b goodEnough b = f b ~= 0.0 f x = x*x - a
2. þÉÓÌÅÎÎÙÅ ×ÙÞÉÓÌÅÎÉÑ
107
÷ ÄÁÎÎÏÍ ÓÌÕÞÁÅ ÎÅÔ ÎÅÏÂÈÏÄÉÍÏÓÔÉ ÏÒÅÄÅÌÑÔØ diff ÞÉÓÌÅÎÎÏ: ÒÏÉÚ×ÏÄÎÁÑ f ÅÓÔØ ÆÕÎË ÉÑ (2*), ÏÜÔÏÍÕ ÆÏÒÍÕÌÁ × ÆÕÎË ÉÉ improve b ÍÏÖÅÔ ÂÙÔØ ÕÒÏÝÅÎÁ:
b
fb fb 0
= b b 2b a 2 = b 2b b + 2ab = 2b + a=b 2 = 0:5 (b + a=b) 2
üÔÏ É ÅÓÔØ ÆÏÒÍÕÌÁ, ÉÓÏÌØÚÏ×ÁÎÎÁÑ ÎÁÍÉ ÅÝÅ ÎÁ ÓÔÒ. 103.
÷ÏÒÏÓÙ É ÚÁÄÁÎÉÑ V.2.1
äÁÊÔÅ ÏÒÅÄÅÌÅÎÉÅ ÆÕÎË ÉÉ ubi Root, ËÏÔÏÒÁÑ ÎÅ ÉÓÏÌØÚÕÅÔ ÞÉ ÓÌÅÎÎÏÅ ÄÉÆÆÅÒÅÎ ÉÒÏ×ÁÎÉÅ (ÄÁÖÅ ËÏÓ×ÅÎÎÏÅ, Ó ÏÍÏÝØÀ zero). V.2.2
ïÒÅÄÅÌÉÔÅ ÆÕÎË ÉÀ inverse, ÉÓÏÌØÚÕÑ ÌÑÍÂÄÁ ÎÏÔÁ ÉÀ. V.2.3
ïÂßÑÓÎÉÔÅ ÒÁÓÏÌÏÖÅÎÉÅ ÓËÏÂÏË × ×ÙÒÁÖÅÎÉÉ: (f (x+h) - f x) / h.
çÌÁ×Á VI
óÔÒÕËÔÕÒÙ ÄÁÎÎÙÈ 1. óÉÓËÉ óÉÓËÉ Ñ×ÌÑÀÔÓÑ ÏÄÎÏÊ ÉÚ ÓÁÍÙÈ ÒÁÓÒÏÓÔÒÁÎÅÎÎÙÈ ÓÔÒÕË ÔÕÒ ÄÁÎÎÙÈ, ÉÓÏÌØÚÕÅÍÙÈ × ÆÕÎË ÉÏÎÁÌØÎÏÍ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÉ. óÉÓÏË ËÏÌÌÅË ÉÑ ÜÌÅÍÅÎÔÏ× ÔÉÁ. É ÓÉÓËÁ ÚÁÄÁÅÔÓÑ ÔÉÏÍ ÜÌÅÍÅÎÔÏ×, ÓÏÄÅÒÖÁÝÉÈÓÑ × ÎÅÍ.
ÏÄÎÏÇÏ
1.1. ïÒÅÄÅÌÅÎÉÅ ÓÉÓËÁ
óÕÝÅÓÔ×ÕÀÔ ÎÅÓËÏÌØËÏ ÓÏÓÏÂÏ× ÏÒÅÄÅÌÉÔØ ÓÉÓÏË: Ñ×ÎÏÅ Å ÒÅÞÉÓÌÅÎÉÅ ÅÇÏ ÜÌÅÍÅÎÔÏ×, ËÏÎÓÔÒÕÉÒÏ×ÁÎÉÅ ÓÉÓËÁ ÒÉ ÏÍÏÝÉ ÏÅÒÁÔÏÒÁ :, ÕËÁÚÁÎÉÅ ÞÉÓÌÏ×ÙÈ ÉÎÔÅÒ×ÁÌÏ×. ðÅÒÅÞÉÓÌÅÎÉÅ ÜÌÅÍÅÎÔÏ× ÓÉÓËÁ ÓÁÍÙÊ ÒÏÓÔÏÊ ÓÏÓÏ ÅÇÏ ÓÏÚÄÁÎÉÑ. üÌÅÍÅÎÔÙ ÚÁËÌÀÞÁÀÔ × Ë×ÁÄÒÁÔÎÙÅ ÓËÏÂËÉ É ÒÁÚÄÅÌÑ ÀÔ ÚÁÑÔÙÍÉ. üÌÅÍÅÎÔÁÍÉ ÓÉÓËÁ ÍÏÇÕÔ ÂÙÔØ ËÁË ËÏÎÓÔÁÎÔÙ, ÔÁË É ×ÙÒÁÖÅÎÉÑ, ËÏÔÏÒÙÅ ÂÕÄÕÔ ÏÒÅÄÅÌÅÎÙ × ÒÏ ÅÓÓÅ ×ÙÞÉÓÌÅÎÉÑ, ÎÁÒÉÍÅÒ,
[1 + 2, 3*x, length [1, 2℄℄ :: [Int℄ [3 < 4, a == 5, p && q℄ :: [Bool℄ [diff sin, inverse os℄ :: [Float -> Float℄ ïÇÒÁÎÉÞÅÎÉÊ ÎÁ ÄÌÉÎÕ ÓÉÓËÁ ÎÅÔ, ÏÎ ÍÏÖÅÔ ÓÏÄÅÒÖÁÔØ, ÎÁÒÉ ÍÅÒ, ÌÉÛØ ÏÄÉÎ ÜÌÅÍÅÎÔ (ÔÁËÉÅ ÓÉÓËÉ ÎÏÓÑÔ ÎÁÚ×ÁÎÉÅ ). ÁË, ÓÉÓÏË [[1, 2, 3℄℄ Ñ×ÌÑÅÔÓÑ ÓÉÎÇÌÅÔÏÎÏÍ ÏÎ ÓÏÄÅÒÖÉÔ ÏÄÉÎ ÜÌÅÍÅÎÔ, Ñ×ÌÑÀÝÉÊÓÑ ÓÉÓËÏÍ. óÉÓÏË, ÎÅ ÓÏÄÅÒÖÁÝÉÊ ÜÌÅÍÅÎÔÏ×, ÉÇÒÁÅÔ ÏÓÏÂÕÀ ÒÏÌØ × ÏÒÅ ÄÅÌÅÎÉÑÈ ÆÕÎË ÉÊ ÄÌÑ ÒÁÂÏÔÙ ÓÏ ÓÉÓËÁÍÉ. ÁËÏÊ ÓÉÓÏË ÎÁÚÙ×Á ÅÔÓÑ ÕÓÔÙÍ. åÇÏ ÏÂßÑ×ÌÅÎÉÅ ÏÌÉÍÏÒÆÎÏ ÕÓÔÏÊ ÓÉÓÏË ÍÏÖÅÔ ÂÙÔØ ÒÅÄÓÔÁ×ÉÔÅÌÅÍ ÓÉÓËÁ ÌÀÂÏÇÏ ÔÉÁ. îÁÏÍÎÉÍ, ÞÔÏ × ÏÄÏ ÎÙÈ ÓÌÕÞÁÑÈ × ÏÂßÑ×ÌÅÎÉÑÈ ÔÉÁ ÉÓÏÌØÚÕÀÔÓÑ, ÔÁË ÎÁÚÙ×ÁÅÍÙÅ, ÅÒÅÍÅÎÎÙÅ ÔÉÁ (Ô ÉÏ×ÙÅ ÅÒÅÍÅÎÎÙÅ), ÎÁÒÉÍÅÒ, [a℄. ðÕÓÔÏÊ
singleton
108
1. óÉÓËÉ
109
ÓÉÓÏË ÍÏÖÅÔ ×ÓÔÒÅÞÁÔØÓÑ × ÌÀÂÏÍ ÍÅÓÔÅ, ÇÄÅ ÍÏÖÎÏ ÒÁÚÍÅÓÔÉÔØ ÏÂÙÞÎÙÊ ÓÉÓÏË. åÇÏ ÔÉ ÏÒÅÄÅÌÑÅÔÓÑ ÉÓÈÏÄÑ ÉÚ ËÏÎÔÅËÓÔÁ: × ÚÁ ÉÓÉ sum [℄ ÉÓÏÌØÚÕÅÔÓÑ ÕÓÔÏÊ ÓÉÓÏË ÞÉÓÅÌ; × and [℄ ÕÓÔÏÊ ÓÉÓÏË ÔÉÁ [Bool℄. ëÏÎÓÔÒÕÉÒÏ×ÁÎÉÅ Ó ÏÍÏÝØÀ ÏÅÒÁÔÏÒÁ : ÄÒÕÇÏÊ ÒÁÓ ÒÏÓÔÒÁÎÅÎÎÙÊ ÓÏÓÏ ÏÒÅÄÅÌÅÎÉÑ ÓÉÓËÏ×. üÔÏÔ ÏÅÒÁÔÏÒ ÏÍÅ ÝÁÅÔ ÜÌÅÍÅÎÔ × ÎÁÞÁÌÏ ÓÉÓËÁ, ÒÅÚÕÌØÔÁÔ ÅÇÏ ÒÉÍÅÎÅÎÉÑ ÅÓÔØ ÓÉ ÓÏË ÂÏÌØÛÅÊ ÄÌÉÎÙ.
(:)
:: a -> [a℄ -> [a℄
ÁË, ÅÓÌÉ xs ÅÓÔØ ÓÉÓÏË [2, 3, 4℄, ÔÏ 1 : xs ÅÓÔØ ÓÉÓÏË [1, 2, 3, 4℄. éÓÏÌØÚÕÑ ÕÓÔÏÊ ÓÉÓÏË É ÏÅÒÁÔÏÒ :, ÍÏÖÎÏ ÏÌÕ ÞÉÔØ ÌÀÂÏÊ ÓÉÓÏË. îÁÒÉÍÅÒ, 1 : (2 : (3 : [ ℄)) ÅÓÔØ ÓÉÓÏË [1, 2, 3℄. õÞÔÑ ÒÁ×ÕÀ ÁÓÓÏ ÉÁÔÉ×ÎÏÓÔØ ÜÔÏÇÏ ÏÅÒÁÔÏÒÁ, ÏÕ ÓÔÉÍ ÓËÏÂËÉ 1 : 2 : 3 : [ ℄. õËÁÚÁÎÉÅ ÞÉÓÌÏ×ÙÈ ÉÎÔÅÒ×ÁÌÏ× ÔÒÅÔÉÊ ÓÏÓÏÂ, ÏÚ×ÏÌÑ ÀÝÉÊ ÏÒÅÄÅÌÉÔØ ÓÉÓÏË ÞÉÓÅÌ. ÷ ÜÔÏÍ ÓÌÕÞÁÅ × Ë×ÁÄÒÁÔÎÙÈ ÓËÏ ËÁÈ ÒÁÚÍÅÝÁÀÔÓÑ Ä×Á ÞÉÓÌÁ, ÒÁÚÄÅÌÅÎÎÙÅ Ä×ÏÅÔÏÞÉÅÍ:
---> [1 .. 9℄ [1, 2, 3, 4, 5, 6, 7, 8, 9℄ ---> [2.6 .. 6.0℄ [2.6, 3.6, 4.6, 5.6℄
H
èÏÔÑ ÓÉÍ×ÏÌ ÔÏÞËÁ É ÍÏÖÅÔ ÉÓÏÌØÚÏ×ÁÔØÓÑ × ÉÍÅÎÉ ÏÅÒÁÔÏÒÁ, ËÏÍÂÉÎÁ ÉÑ ÓÉÍ×ÏÌÏ× .. ÎÅ Ñ×ÌÑÅÔÓÑ ÏÅÒÁÔÏÒÏÍ ÜÔÏ ÚÁÒÅÚÅÒ×É ÒÏ×ÁÎÎÁÑ ÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔØ ÓÉÍ×ÏÌÏ× ÑÚÙËÁ Haskell (ÓÍ. ÓÔÒ. 71). ÷ÙÒÁÖÅÎÉÅ [x .. y℄ ×ÙÞÉÓÌÑÅÔÓÑ ÕÔÅÍ ×ÙÚÏ×Á enumFromTo x y. æÕÎË ÉÑ enumFromTo ÉÓÏÌØÚÕÅÔ ÒÅËÕÒÓÉ×ÎÙÊ ×ÙÚÏ× ÓÁÍÏÊ ÓÅÂÑ: ÄÏÂÁ×É× ÌÅ×ÕÀ ÇÒÁÎÉ Õ Ë ÓÉÓËÕ, ÏÎÁ ×ÙÚÙ×ÁÅÔÓÑ Ó ÁÒÇÕÍÅÎ ÔÏÍ ÂÏÌØÛÉÍ ÎÁ ÅÄÉÎÉ Õ. åÓÌÉ ÒÁ×ÁÑ ÇÒÁÎÉ Á ÍÅÎØÛÅ ÌÅ×ÏÊ, ÔÏ ÓÒÁÂÁÔÙ×ÁÅÔ ÔÅÒÍÉÎÁÌØÎÙÊ ÓÌÕÞÁÊ: ×ÙÄÁÅÔÓÑ ÕÓÔÏÊ ÓÉÓÏË.
I õÒÁÖÎÅÎÉÅ VI.1.1
óÏÚÄÁÊÔÅ ÆÁÊÌ, × ËÏÔÏÒÙÊ ÏÍÅÓÔÉÔÅ ÎÉÖÅÒÉ×ÅÄÅÎÎÙÊ ÓËÒÉÔ.
import Prelude hiding (enumFromTo) enumFromTo x y | y <x = [℄ | otherwise = x : enumFromTo (x+1) y úÁÇÒÕÚÉ× ÏÒÅÄÅÌÅÎÉÅ ÆÕÎË ÉÉ enumFromTo, ÒÉÍÅÎÉÔÅ ÅÅ Ë ÒÁÚ ÌÉÞÎÙÍ ÓÉÓËÁÍ.
J
VI. óÔÒÕËÔÕÒÙ ÄÁÎÎÙÈ
110
1.2. æÕÎË ÉÉ ÎÁ ÓÉÓËÁÈ ðÒÉ ÏÒÅÄÅÌÅÎÉÉ ÆÕÎË ÉÊ ÎÁ ÓÉÓËÁÈ ÞÁÓÔÏ ÒÉÍÅÎÑÅÔÓÑ ÓÏÏ ÓÔÁ×ÌÅÎÉÅ ×ÈÏÄÎÙÈ ÁÒÁÍÅÔÒÏ× Ó ÏÂÒÁÚ ÁÍÉ (ÁÔÔÅÒÎÁÍÉ): ÆÕÎË ÉÑ ÚÁÄÁÅÔÓÑ ÒÉ ÏÍÏÝÉ ÏÔÄÅÌØÎÙÈ ÒÁ×ÉÌ ÄÌÑ ÕÓÔÏÇÏ ÓÉÓËÁ É ÄÌÑ ÓÉÓËÁ ×ÉÄÁ x:xs. ìÀÂÏÊ ÓÉÓÏË, ÏÔÌÉÞÎÙÊ ÏÔ ÕÓÔÏÇÏ, ÒÅÄ ÓÔÁ×ÉÍ × ×ÉÄÅ ÅÒ×ÏÇÏ ÜÌÅÍÅÎÔÁ (ÇÏÌÏ×Ù ÓÉÓËÁ) x É, ×ÏÚÍÏÖÎÏ ÕÓÔÏÇÏ, ÓÉÓËÁ xs (È×ÏÓÔ ÓÉÓËÁ). îÅËÏÔÏÒÙÅ ÆÕÎË ÉÉ, ÏÒÅÄÅÌÅÎÎÙÅ ÎÁ ÓÉÓËÁÈ, ÕÖÅ ÏÂÓÕÖÄÁ ÌÉÓØ ÒÁÎÅÅ (head, tail, sum, length, map, filter, foldr É foldl). äÁÖÅ ÄÌÑ ÔÅÈ ÆÕÎË ÉÊ, ËÏÔÏÒÙÅ ÏÒÅÄÅÌÅÎÙ × ÒÅÌÀÄÉÉ É ÄÏÓÔÕ ÎÙ ÄÌÑ ×ÙÚÏ×Á ÂÅÚ ÏÒÅÄÅÌÅÎÉÑ ÉÈ × ÏÌØÚÏ×ÁÔÅÌØÓËÏÍ ÓËÒÉÔÅ, ÔÒÅÂÕÅÔÓÑ ÏÎÉÍÁÎÉÅ ÔÏÇÏ, ËÁË ÏÎÉ ÒÁÂÏÔÁÀÔ É ËÁËÏ×Ï ÉÈ ÏÒÅÄÅ ÌÅÎÉÅ. ðÒÅÖÄÅ ×ÓÅ ÏÔÏÍÕ, ÞÔÏ ÉÈ ÏÒÅÄÅÌÅÎÉÑ Ñ×ÌÑÀÔÓÑ ÚÁÍÅÞÁ ÔÅÌØÎÙÍÉ ÒÉÍÅÒÁÍÉ ÆÕÎË ÉÊ, ÏÒÅÄÅÌÅÎÎÙÈ ÎÁ ÓÉÓËÁÈ, É ÉÈ ÔÅËÓÔ ÏÍÏÇÁÅÔ ÏÎÑÔØ, ËÁË ×ÓÅ ÖÅ ÏÎÉ ÒÁÂÏÔÁÀÔ. ÷ ÜÔÏÍ ÁÒÁÇÒÁÆÅ ÍÙ ÏÚÎÁËÏÍÉÍÓÑ Ó ÎÅËÏÔÏÒÙÍÉ ÉÚ ÏÒÅÄÅÌÅ ÎÉÊ ÆÕÎË ÉÊ ÄÌÑ ÒÁÂÏÔÙ ÓÏ ÓÉÓËÁÍÉ. âÏÌØÛÉÎÓÔ×Ï ÉÚ ÎÉÈ Ñ×ÌÑ ÀÔÓÑ ÒÅËÕÒÓÉ×ÎÙÍÉ, Ô. Å. × ÒÁ×ÉÌÅ, ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÅÍ ÏÂÒÁÚ Õ ×É ÄÁ x:xs, ÏÂÑÚÁÔÅÌØÎÏ ÂÕÄÅÔ ÒÉÓÕÔÓÔ×Ï×ÁÔØ ×ÙÚÏ× Ó ÁÒÁÍÅÔÒÏÍ xs. óÒÁ×ÎÅÎÉÅ É ÕÏÒÑÄÏÞÉ×ÁÎÉÅ ÓÉÓËÏ×
ä×Á ÓÉÓËÁ ÒÁ×ÎÙ, ÅÓÌÉ ÏÎÉ ÓÏÄÅÒÖÁÔ ÏÄÎÉ É ÔÅ ÖÅ ÜÌÅÍÅÎÔÙ × ÔÏÍ ÖÅ ÏÒÑÄËÅ. ÷ÏÔ ÏÒÅÄÅÌÅÎÉÅ ÆÕÎË ÉÉ eq, ÒÏ×ÅÒÑÀÝÅÊ Ä×Á ÓÉÓËÁ ÎÁ ÒÁ×ÅÎÓÔ×Ï:
[ ℄ [ ℄ (x:xs) (x:xs)
`eq` `eq` `eq` `eq`
[ ℄ (y:ys) [ ℄ (y:ys)
= = = =
True False False (x == y) && xs `eq` ys
úÄÅÓØ ËÁË ÅÒ×ÙÊ ÔÁË É ×ÔÏÒÏÊ ÁÒÁÍÅÔÒÙ ÍÏÇÕÔ ÂÙÔØ ËÁË ÕÓÔÙ ÍÉ ÓÉÓËÁÍÉ, ÔÁË É ÎÅ ÕÓÔÙÍÉ, ÏÜÔÏÍÕ ÄÌÑ ÏÒÅÄÅÌÅÎÉÑ ÆÕÎË ÉÉ ÏÔÒÅÂÏ×ÁÌÏÓØ ÚÁÄÁÔØ ÞÅÔÙÒÅ ÒÁ×ÉÌÁ: Ï ÏÄÎÏÍÕ ÎÁ ËÁÖÄÕÀ ÉÚ ×ÏÚÍÏÖÎÙÈ ËÏÍÂÉÎÁ ÉÊ. òÅËÕÒÓÉ×ÎÙÊ ×ÙÚÏ× ÒÉÓÕÔÓÔ×ÕÅÔ × Ï ÓÌÅÄÎÅÍ ÒÁ×ÉÌÅ: ÅÓÌÉ ÏÂÁ ÓÉÓËÁ ÎÅ ÕÓÔÙ, ÔÏ ÉÈ ÅÒ×ÙÅ ÜÌÅÍÅÎÔÙ ÓÒÁ×ÎÉ×ÁÀÔÓÑ ÎÁ ÒÁ×ÅÎÓÔ×Ï, ÏÓÌÅ ÞÅÇÏ ÆÕÎË ÉÑ ×ÙÚÙ×ÁÅÔÓÑ ÓÎÏ ×Á, ÎÏ ÁÒÇÕÍÅÎÔÁÍÉ ÕÖÅ Ñ×ÌÑÀÔÓÑ È×ÏÓÔÙ ÉÓÈÏÄÎÙÈ ÓÉÓËÏ×. ÁË ËÁË × ÏÒÅÄÅÌÅÎÉÉ ÉÓÏÌØÚÕÅÔÓÑ ÏÅÒÁÔÏÒ ÓÒÁ×ÎÅÎÉÑ ==, ÔÏ ÎÅÌØÚÑ ÒÉÍÅÎÑÔØ ÜÔÕ ÆÕÎË ÉÀ Ë ÓÉÓËÁÍ ÒÏÉÚ×ÏÌØÎÏÇÏ ÔÉÁ.
1. óÉÓËÉ
111
éÓÏÌØÚÕÑ × ÏÂßÑ×ÌÅÎÉÉ ËÌÁÓÓ Eq, ÍÙ ÏÇÒÁÎÉÞÉÍ ÏÂÌÁÓÔØ ÏÒÅÄÅ ÌÅÎÉÑ ÜÔÏÊ ÆÕÎË ÉÉ ÔÁËÉÍÉ ÔÉÁÍÉ ÄÁÎÎÙÈ, ËÏÔÏÒÙÅ ÄÏÕÓËÁÀÔ ÒÏ×ÅÒËÕ ÎÁ ÒÁ×ÅÎÓÔ×Ï:
eq
:: Eq a => [a℄ -> [a℄ -> Bool
æÕÎË ÉÑ eq ÎÅ ÏÒÅÄÅÌÅÎÁ × ÒÅÌÀÄÉÉ. äÌÑ ÒÏ×ÅÒËÉ ÓÉÓËÏ× ÎÁ ÒÁ×ÅÎÓÔ×Ï ÍÏÖÎÏ ÉÓÏÌØÚÏ×ÁÔØ ÏÅÒÁÔÏÒ ==. úÁÍÅÔÉÍ, ÞÔÏ ÄÁÌÅËÏ ÎÅ ×ÓÅ ÓÉÓËÉ ÓÏÄÅÒÖÁÔ ÜÌÅÍÅÎÔÙ, ÄÏÕÓËÁÀÝÉÅ ÒÏ×ÅÒËÕ ÎÁ ÒÁ ×ÅÎÓÔ×Ï, ÎÁÒÉÍÅÒ, ÎÅÌØÚÑ ÓÒÁ×ÎÉÔØ ÎÁ ÒÁ×ÅÎÓÔ×Ï Ä×Á ÓÉÓËÁ ÆÕÎË ÉÊ.
I õÒÁÖÎÅÎÉÅ VI.1.2
óÏÚÄÁÊÔÅ ÓËÒÉÔ, × ËÏÔÏÒÙÊ ×ËÌÀÞÉÔÅ ÏÒÅÄÅÌÅÎÉÅ ÆÕÎË ÉÉ eq. ðÒÏ×ÅÒØÔÅ, ËÁË ×ÅÄÅÔ ÓÅÂÑ ÜÔÁ ÆÕÎË ÉÑ ÎÁ ÓÉÓËÁÈ ÒÁÚÌÉÞÎÙÈ ÔÉ Ï×:
---> [1, 2℄ `eq` [1, 2℄ True ---> [1, 2℄ `eq` [2, 1℄ False ---> [sin pi, 2.0℄ `eq` [sin pi, sqrt 4℄ True ---> [ 2 > 1, False℄ `eq` [True, 1 > 2℄ True
H
ðÏÒÏÂÕÊÔÅ ÒÉÍÅÎÉÔØ ÜÔÕ ÆÕÎË ÉÀ Ë ÓÉÓËÁÍ, ÓÏÄÅÒÖÁÝÉÍ ÆÕÎË ÉÉ.
J
åÓÌÉ ÜÌÅÍÅÎÔÙ ÓÉÓËÁ ÄÏÕÓËÁÀÔ ÕÏÒÑÄÏÞÅÎÉÅ Ó ÏÍÏÝØÀ ÏÅ ÒÁ ÉÊ ÓÒÁ×ÎÅÎÉÑ <, 6 É Ô. ., ÔÏ ÔÁËÉÅ ÓÉÓËÉ ÔÁËÖÅ ÍÏÖÎÏ ÓÒÁ× ÎÉÔØ, ÏÒÅÄÅÌÑÑ ËÁËÏÊ ÉÚ Ä×ÕÈ ÓÉÓËÏ× ¾ÎÅ ÂÏÌØÛÅ ÄÒÕÇÏÇÏ¿. ðÒÉ ÜÔÏÍ ÓÒÁ×ÎÅÎÉÅ ÒÏÉÚ×ÏÄÉÔÓÑ (ËÁË × ÓÌÏ×ÁÒÑÈ): ÓÒÁ×ÎÉ×ÁÀÔÓÑ ÅÒ×ÙÅ ÜÌÅÍÅÎÔÙ ÓÉÓËÁ, ÅÓÌÉ ÏÎÉ ÒÁ×ÎÙ, ÔÏÇÄÁ ×ÔÏÒÙÅ É ÔÁË ÄÁÌÅÅ, ÏËÁ ÔÅËÕÝÉÊ ÜÌÅÍÅÎÔ ÏÄÎÏÇÏ ÓÉÓËÁ ÎÅ ÂÕÄÅÔ ÏÔÌÉÞÁÔØÓÑ ÏÔ ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÅÇÏ ÜÌÅÍÅÎÔÁ ÄÒÕÇÏÇÏ ÓÉÓËÁ. îÁÒÉÍÅÒ, [2, 3℄ < [3, 1℄ É [2, 1℄ < [2, 2℄. åÓÌÉ ÏÄÉÎ ÉÚ ÓÉÓ ËÏ× × ÒÏ ÅÓÓÅ ÓÒÁ×ÎÅÎÉÑ ÜÌÅÍÅÎÔÏ× ÚÁËÏÎÞÉÌÓÑ, Á ÄÒÕÇÏÊ ÅÝÅ ÎÅÔ, ÔÏ ÂÏÌÅÅ ËÏÒÏÔËÉÊ ÓÉÓÏË ¾ ¿ ÂÏÌÅÅ ÄÌÉÎÎÏÇÏ. ÏÔ ÆÁËÔ, ÞÔÏ × ÔÁËÏÍ ÏÒÅÄÅÌÅÎÉÉ ÒÉÓÕÔÓÔ×ÕÀÔ ÓÌÏ×Á ¾É ÔÁË ÄÁÌÅÅ¿ ÏÚÎÁÞÁÅÔ ÎÁÌÉÞÉÅ ÒÅËÕÒÓÉÉ × ÔÅÌÅ ÏÒÅÄÅÌÅÎÉÑ ÆÕÎË ÉÉ:
× ÌÅËÓÉËÏÇÒÁÆÉÞÅÓËÏÍ ÏÒÑÄËÅ
ÍÅÎØÛÅ
se [ ℄
`se` [ ℄
:: Ord a => [a℄ -> [a℄ -> Bool = True
VI. óÔÒÕËÔÕÒÙ ÄÁÎÎÙÈ
112
[ ℄ `se` (y:ys) = False (x:xs) `se` [ ℄ = False (x:xs) `se` (y:ys) = x < y || (x == y && xs `se` ys)
ÅÅÒØ, ËÏÇÄÁ ÆÕÎË ÉÑ se ÚÁÄÁÎÁ, ÎÅ ÓÏÓÔÁ×ÉÔ ÔÒÕÄÁ ÏÒÅÄÅ ÌÉÔØ ÄÒÕÇÉÅ ÆÕÎË ÉÉ ÓÒÁ×ÎÅÎÉÑ: ne (ÎÅ ÒÁ×ÎÙ), ge (ÂÏÌØÛÅ ÉÌÉ ÒÁ×ÎÙ), st (ÓÔÒÏÇÏ ÍÅÎØÛÅ) É gt (ÓÔÒÏÇÏ ÂÏÌØÛÅ).
xs xs xs xs
`ne` `ge` `st` `gt`
ys ys ys ys
= = = =
not (xs ys `se` xs `se` ys `st`
`eq` ys) xs ys && xs `ne` ys xs
ëÏÎÅÞÎÏ, É ÜÔÉ ÆÕÎË ÉÉ ÍÏÖÎÏ ÏÒÅÄÅÌÉÔØ ÒÅËÕÒÓÉ×ÎÏ, Ï ÁÎÁ ÌÏÇÉÉ Ó ÆÕÎË ÉÅÊ se. ÷ ÒÅÌÀÄÉÀ ÏÒÅÄÅÌÅÎÉÑ ÜÔÉÈ ÆÕÎË ÉÊ ÎÅ ×ËÌÀÞÅÎÙ. äÌÑ ÓÒÁ×ÎÅÎÉÑ ÓÉÓËÏ× ÍÏÖÎÏ ÉÓÏÌØÚÏ×ÁÔØ ÓÔÁÎÄÁÒÔ ÎÙÅ ÏÅÒÁÔÏÒÙ ÓÒÁ×ÎÅÎÉÑ (>=, <= É Ô. Ä.)
I õÒÁÖÎÅÎÉÅ VI.1.3
äÏÂÁ×ØÔÅ ÏÒÅÄÅÌÅÎÉÑ ÆÕÎË ÉÊ se, ne, ge, st É gt × ÓËÒÉÔ. ðÒÉ ×ÅÄÉÔÅ ÒÉÍÅÒÙ ÉÓÏÌØÚÏ×ÁÎÉÑ ÜÔÉÈ ÆÕÎË ÉÊ.
J
ïÂßÅÄÉÎÅÎÉÅ ÓÉÓËÏ×
ä×Á ÓÉÓËÁ ÏÄÎÏÇÏ É ÔÏÇÏ ÖÅ ÔÉÁ ÍÏÇÕÔ ÂÙÔØ ÏÂßÅÄÉÎÅÎÙ × ÏÄÉÎ Ó ÏÍÏÝØÀ ÏÅÒÁÔÏÒÁ ++. üÔÏÔ ÒÏ ÅÓÓ ÎÏÓÉÔ ÎÁÚ×ÁÎÉÅ ( on atenation, Ó ÅÌÅÎÉÅ ×ÍÅÓÔÅ). îÁÒÉÍÅÒ, [1, 2, 3℄ ++ [4, 5℄ ÄÁÓÔ ÓÉÓÏË [1, 2, 3, 4, 5℄. ëÏÎËÁÔÅÎÁ ÉÑ Ó ÕÓÔÙÍ ÓÉÓËÏÍ ÎÅ ÉÚÍÅÎÑÅÔ ÉÓÈÏÄÎÙÊ ÓÉÓÏË: [1, 2℄ ++ [ ℄ ÄÁÅÔ [1, 2℄. ïÅÒÁÔÏÒ ++ Ñ×ÌÑÅÔÓÑ ÓÔÁÎÄÁÒÔÎÏÊ ÆÕÎË ÉÅÊ, ÏÒÅÄÅÌÅÎÉÅ ËÏ ÔÏÒÏÊ ÒÁÚÍÅÝÅÎÏ × ÆÁÊÌÅ Prelude.hs. åÅ ÏÒÅÄÅÌÅÎÉÅ ÔÁËÏ×Ï:
ËÏÎ
ËÁÔÅÎÁ ÉÑ
(++) :: [a℄ ->[a℄ -> [a℄ [ ℄ ++ ys = ys (x:xs) ++ ys = x : (xs ++ ys) ÷ ÜÔÏÍ ÏÒÅÄÅÌÅÎÉÉ ÉÍÅÀÔÓÑ Ä×Á ÒÁ×ÉÌÁ ÓÏÏÓÔÁ×ÌÅÎÉÑ Ó ÏÂÒÁÚ ÏÍ ÄÌÑ ÌÅ×ÏÇÏ ÁÒÇÕÍÅÎÔÁ. ÷ ÓÌÕÞÁÅ ÎÅÕÓÔÏÇÏ ÓÉÓËÁ ÆÕÎË ÉÑ ÒÉÍÅÎÑÀÔÓÑ ÒÅËÕÒÓÉ×ÎÏ Ë ÍÅÎØÛÅÍÕ ÁÒÇÕÍÅÎÔÕ È×ÏÓÔÕ ÌÅ×ÏÇÏ ÓÉÓËÁ. éÍÅÅÔÓÑ ÅÝÅ ÏÄÎÁ ÆÕÎË ÉÑ, ÏÂßÅÄÉÎÑÀÝÁÑ ÓÉÓËÉ. üÔÏ ÆÕÎË ÉÑ on at, Ó ÅÄÉÎÓÔ×ÅÎÎÙÍ ÁÒÇÕÍÅÎÔÏÍ ÓÉÓËÏ×. ïÎÁ ÓÏÅÄÉÎÑÅÔ ×ÓÅ ÜÌÅÍÅÎÔÙ ×ÓÅÈ ÓÉÓËÏ× × ÏÄÉÎ ÓÉÓÏË, ÎÁÒÉÍÅÒ,
ÓÉÓËÏÍ
1. óÉÓËÉ
113
H
---> on at [ [1, 2, 3℄, [4, 5℄, [℄, [6℄ ℄ [1, 2, 3, 4, 5, 6℄ ïÒÅÄÅÌÅÎÉÅ ÆÕÎË ÉÉ on at ÔÁËÏ×Ï:
on at :: [[a℄℄ -> [a℄
on at [℄ = [℄
on at (xs:xss) = xs ++ on at xss ðÅÒ×ÙÊ ÏÂÒÁÚÅ , [ ℄, ÅÓÔØ ÕÓÔÏÊ ÓÉÓÏË, × ÄÁÎÎÏÍ ÓÌÕÞÁÅ ÜÔÏ Õ ÓÔÏÊ ÓÉÓÏË ÓÉÓËÏ×. òÅÚÕÌØÔÁÔÏÍ ÔÁËÖÅ Ñ×ÌÑÅÔÓÑ ÕÓÔÏÊ ÓÉÓÏË. ÷Ï ×ÔÏÒÏÍ ÓÌÕÞÁÅ ÓÉÓÏË ÎÅ ÕÓÔ, ÏÎ ÓÏÄÅÒÖÉÔ ÅÒ×ÙÊ ÜÌÅÍÅÎÔ ÓÉÓÏË xs É (×ÏÚÍÏÖÎÏ ÕÓÔÏÊ) È×ÏÓÔ xss, Ñ×ÌÑÀÝÉÊÓÑ ÓÉÓËÏÍ ÓÉÓËÏ×. éÍÅÎÎÏ Ë ÜÔÏÍÕ ÓÉÓËÕ ÍÅÎØÛÅÊ ÄÌÉÎÙ É ÒÉÍÅÎÑÅÔÓÑ ÓÎÏ×Á ÆÕÎË ÉÑ on at, ÒÅÚÕÌØÔÁÔ ÒÉÍÅÎÅÎÉÑ ËÏÔÏÒÏÊ ÂÕÄÅÔ ÄÏÂÁ ×ÌÅÎ ÒÉ ÏÍÏÝÉ ÏÅÒÁÔÏÒÁ ++ Ë ÓÉÓËÕ xs. ïÂÒÁÔÉÔÅ ×ÎÉÍÁÎÉÅ ÎÁ ÒÁÚÌÉÞÉÅ ÍÅÖÄÕ ++ É on at: ÏÅÒÁÔÏÒ ++ ÒÁÂÏÔÁÅÔ Ó Ä×ÕÍÑ ÓÉÓËÁÍÉ, × ÔÏ ×ÒÅÍÑ ËÁË Õ ÆÕÎË ÉÉ on at ÉÍÅÅÔÓÑ ÌÉÛØ ÏÄÉÎ ÁÒÇÕÍÅÎÔ ÓÉÓÏË ÓÉÓËÏ×. îÏ ÏÂÅ ÜÔÉ ÆÕÎË ÉÉ × ÒÁÚÇÏ×ÏÒÎÏÊ ÒÅÞÉ ÎÁÚÙ×ÁÀÔ ËÏÎËÁÔÅÎÁ ÉÅÊ.
I õÒÁÖÎÅÎÉÅ VI.1.4
ïÂßÅÄÉÎÉÍ ÓÉÓËÉ [1, 2, 3, 4℄ É [5, 6, 7℄ Ä×ÕÍÑ ÓÏÓÏÂÁÍÉ (Ó ÏÍÏÝØÀ ÆÕÎË ÉÊ ++ É on at):
---> [1, 2, 3, 4℄ ++ [5, 6, 7℄ [1, 2, 3, 4, 5, 6, 7℄ ---> on at [ [1, 2, 3, 4℄, [5, 6, 7℄℄ [1, 2, 3, 4, 5, 6, 7℄
H
J
òÁÚÂÉÅÎÉÅ ÓÉÓËÁ ÎÁ ÞÁÓÔÉ
÷ ÒÅÌÀÄÉÉ ÏÒÅÄÅÌÅÎ ÅÌÙÊ ÒÑÄ ÆÕÎË ÉÊ, ÏÚ×ÏÌÑÀÝÉÈ ×Ù ÄÅÌÑÔØ ÔÕ ÉÌÉ ÉÎÕÀ ÞÁÓÔØ ÓÉÓËÁ. òÅÚÕÌØÔÁÔÏÍ ÒÁÂÏÔÙ ÎÅËÏÔÏÒÙÈ Ñ×ÌÑÅÔÓÑ ÌÉÛØ ÏÄÉÎ ÜÌÅÍÅÎÔ, ÄÒÕÇÉÅ ÆÕÎË ÉÉ ×ÏÚ×ÒÁÝÁÀÔ ÓÉÓÏË. ðÒÉ×ÅÄÅÍ ÅÝÅ ÒÁÚ ÏÒÅÄÅÌÅÎÉÑ ÆÕÎË ÉÊ, ×ÙÄÅÌÑÀÝÉÈ ÇÏÌÏ×Õ É È×ÏÓÔ ÓÉÓËÁ:
head :: [a℄ -> a head (x:xs) = x tail :: [a℄ -> [a℄ tail (x:xs) = xs
VI. óÔÒÕËÔÕÒÙ ÄÁÎÎÙÈ
114
÷ ÜÔÉÈ ÏÒÅÄÅÌÅÎÉÑÈ ÒÉÓÕÔÓÔ×ÕÅÔ ÓÏÏÓÔÁ×ÌÅÎÉÅ Ó ÏÂÒÁÚ ÏÍ. ïÄ ÎÁËÏ ÍÙ ÎÅ ×ÉÄÉÍ ÒÁ×ÉÌÁ ÄÌÑ ÏÂÒÁÚ Á [℄. üÔÏ ÏÂßÑÓÎÑÅÔÓÑ ÔÅÍ, ÞÔÏ ÏÎÑÔÉÑ ÇÏÌÏ×Ù É È×ÏÓÔÁ ××ÅÄÅÎÙ ÌÉÛØ ÄÌÑ ÎÅÕÓÔÙÈ ÓÉÓËÏ×. ðÏÜÔÏÍÕ ÒÉ ×ÙÚÏ×Å ÌÀÂÏÊ ÉÚ ÜÔÉÈ ÆÕÎË ÉÊ Ó ÁÒÇÕÍÅÎÔÏÍ, Ñ×ÌÑ ÀÝÉÍÓÑ ÕÓÔÙÍ ÓÉÓËÏÍ, ÂÕÄÅÔ ÏÌÕÞÅÎÏ ÓÏÏÂÝÅÎÉÅ Ï ÏÛÉÂËÅ. îÅÓËÏÌØËÏ ÓÌÏÖÎÅÅ ÚÁÉÓÙ×ÁÅÔÓÑ ÆÕÎË ÉÑ, ËÏÔÏÒÁÑ ×ÙÄÅÌÑÅÔ ÜÌÅÍÅÎÔ ÓÉÓËÁ. ÷ ÅÅ ÏÒÅÄÅÌÅÎÉÉ ÕÖÅ ÒÉÓÕÔÓÔ×ÕÅÔ ÒÅ ËÕÒÓÉÑ:
ÏÓÌÅÄÎÉÊ
last :: [a℄ -> a last (x:[℄) = x last (x:xs) = last xs é ÓÎÏ×Á ÜÔÁ ÆÕÎË ÉÑ ÎÅ ÏÒÅÄÅÌÅÎÁ ÎÁ ÕÓÔÏÍ ÓÉÓËÅ, ÔÁË ËÁË ÜÔÏÔ ÓÌÕÞÁÊ ÎÅ ×ÈÏÄÉÔ ÎÉ × ÏÄÉÎ ÉÚ Ä×ÕÈ ÁÔÔÅÒÎÏ×, ÒÉÓÕÔÓÔ×ÕÀÝÉÈ ÚÄÅÓØ. ðÏ ÁÎÁÌÏÇÉÉ Ó ÁÒÏÊ ÆÕÎË ÉÊ head É tail, ÁÒÏÊ ÄÌÑ last Ñ×ÌÑÅÔÓÑ init. îÁ ÒÉÓÕÎËÅ ÓÈÅÍÁÔÉÞÎÏ ÒÅÄÓÔÁ×ÌÅÎÙ ×ÓÅ ÞÅÔÙÒÅ ÆÕÎË ÉÉ:
head z}|{ |
tail
z
}|
{z
init
{ }
|{z}
last
æÕÎË ÉÑ init ×ÙÄÅÌÑÅÔ ×ÓÅ ËÒÏÍÅ ÏÓÌÅÄÎÅÇÏ ÜÌÅÍÅÎÔÁ. ÷ ÅÅ ÏÒÅÄÅÌÅÎÉÉ ÔÁËÖÅ ÒÉÓÕÔÓÔ×ÕÅÔ ÒÅËÕÒÓÉÑ:
init :: [a℄ -> [a℄ init (x:[℄) = [℄ init (x:xs) = x : init xs ïÂÒÁÚÅ x:[℄ ÍÏÖÅÔ ÂÙÔØ ÚÁÉÓÁÎ (É ÏÂÙÞÎÏ ÚÁÉÓÙ×ÁÅÔÓÑ) × ×ÉÄÅ [x℄. îÁ ÓÔÒÁÎÉ Å 100 ÂÙÌÏ ÒÁÓÓÍÏÔÒÅÎÏ ÏÒÅÄÅÌÅÎÉÅ ÆÕÎË ÉÉ take. ëÒÏÍÅ ÓÁÍÏÇÏ ÓÉÓËÁ ÜÔÁ ÆÕÎË ÉÑ ÔÒÅÂÕÅÔ ÕËÁÚÁÎÉÑ ÁÒÁÍÅÔÒÁ, ÏÒÅÄÅÌÑÀÝÅÇÏ ËÏÌÉÞÅÓÔ×Ï ÜÌÅÍÅÎÔÏ× × ÉÔÏÇÏ×ÏÍ ÓÉÓËÅ. ÷ ÒÏÔÉ ×ÏÏÌÏÖÎÏÓÔØ take, ÆÕÎË ÉÑ drop ÕÄÁÌÑÅÔ ÕËÁÚÁÎÎÏÅ ÞÉÓÌÏ ÜÌÅ ÍÅÎÔÏ× ÉÚ ÎÁÞÁÌÁ ÓÉÓËÁ. éÍÅÅÔÓÑ É ÏÅÒÁÔÏÒ !!, ËÏÔÏÒÙÊ ×ÙÄÅÌÑ ÅÔ ÏÄÉÎ ÅÄÉÎÓÔ×ÅÎÎÙÊ ÜÌÅÍÅÎÔ ÓÉÓËÁ Ó ÕËÁÚÁÎÎÙÍ ÎÏÍÅÒÏÍ (ÎÕÍÅ ÒÁ ÉÑ ÜÌÅÍÅÎÔÏ× ÓÉÓËÁ ÎÁÞÉÎÁÅÔÓÑ Ó ÎÕÌÑ). óÈÅÍÁÔÉÞÎÏ ÜÔÉ ÔÒÉ ÆÕÎË ÉÉ ÒÅÄÓÔÁ×ÌÅÎÙ ÎÁ ÓÌÅÄÕÀÝÅÊ ÓÈÅÍÅ:
1. óÉÓËÉ
115
z
take 3 }|
{
z
drop 3 }|
{
|{z}
(!!3)
ïÒÅÄÅÌÅÎÙ ÏÎÉ ÓÌÅÄÕÀÝÉÍ ÏÂÒÁÚÏÍ:
take, drop take 0 take n take (n+1) drop 0 drop n drop (n+1)
:: Int -> [a℄ -> [a℄ xs = [ ℄ [ ℄ = [ ℄ (x:xs) = x : take n xs xs = xs [ ℄ = [ ℄ (x:xs) = drop n xs
÷ ÓÌÕÞÁÅ, ÅÓÌÉ ËÏÌÉÞÅÓÔ×Ï ÜÌÅÍÅÎÔÏ× × ÓÉÓËÅ ÍÅÎØÛÅ ÅÌÏÞÉ ÓÌÅÎÎÏÇÏ ÁÒÇÕÍÅÎÔÁ ÜÔÉÈ ÆÕÎË ÉÊ, ÆÕÎË ÉÑ take ×ÅÒÎÅÔ ×ÅÓØ ÓÉ ÓÏË ÅÌÉËÏÍ, Á ÆÕÎË ÉÑ drop ×ÏÚ×ÒÁÔÉÔ ÕÓÔÏÊ ÓÉÓÏË. üÔÏ ÓÌÅÄÕ ÅÔ ÉÚ ×ÔÏÒÏÇÏ ÒÁ×ÉÌÁ ËÁÖÄÏÊ ÉÚ ÆÕÎË ÉÊ. ïÅÒÁÔÏÒ !! ×ÙÄÅÌÑÅÔ ÏÄÉÎ ÜÌÅÍÅÎÔ ÉÚ ÓÉÓËÁ. çÏÌÏ×Á ÓÉÓËÁ ÉÍÅÅÔ ÎÏÍÅÒ 0, Á ×ÙÚÏ× xs !! 3 ×ÅÒÎÅÔ ÜÌÅÍÅÎÔ ÓÉÓËÁ xs. üÔÏÔ ÏÅÒÁÔÏÒ ÎÅ ÄÏÌÖÅÎ ÒÉÍÅÎÑÔØÓÑ Ë ËÏÒÏÔËÉÍ ÓÉÓËÁÍ, ÔÁË ËÁË ÎÅ ÕËÁÚÁÎÏ, ÞÔÏ ÄÅÌÁÔØ × ÔÁËÏÍ ÓÌÕÞÁÅ. ðÏÚÎÁËÏÍØÔÅÓØ Ó ÏÒÅÄÅÌÅÎÉÅÍ ÜÔÏÇÏ ÏÅÒÁÔÏÒÁ:
ÞÅÔ×ÅÒÔÙÊ
infixl 9 !! (!!) :: [a℄ -> Int -> a
(x:xs) !! 0 = x (x:xs) !! (n+1) = xs !! n
I õÒÁÖÎÅÎÉÅ VI.1.5
óÏÚÄÁÊÔÅ ÓËÒÉÔ Ó ÏÒÅÄÅÌÅÎÉÑÍÉ ÜÔÉÈ ÔÒÅÈ ÆÕÎË ÉÊ. äÌÑ ÔÏÇÏ ÞÔÏÂÙ ÓËÒÙÔØ ÏÒÅÄÅÌÅÎÉÑ, ÚÁÇÒÕÖÅÎÎÙÅ ÉÚ ÒÅÌÀÄÉÉ, ÄÏÂÁ×ØÔÅ × ÎÁÞÁÌÏ ÓËÒÉÔÁ ÓÔÒÏËÕ
import Prelude hiding (take, drop, (!!)) ðÒÉÍÅÎÉÔÅ ÜÔÉ ÆÕÎË ÉÉ Ë ÒÁÚÌÉÞÎÙÍ ÓÉÓËÁÍ.
J
H
116
VI. óÔÒÕËÔÕÒÙ ÄÁÎÎÙÈ
ó ÉÓÏÌØÚÏ×ÁÎÉÅÍ ÏÅÒÁÔÏÒÁ !! ÍÏÖÎÏ ÏÒÅÄÅÌÉÔØ ÂÏÌÅÅ ËÏÍ ÁËÔÎÕÀ ÆÕÎË ÉÀ dayofweek, ×ÚÁÍÅÎ ÆÕÎË ÉÉ weekday, ÒÁÓÓÍÁ ÔÒÉ×ÁÅÍÏÊ ÎÁ ÓÔÒ. 99:
dayofweek d = [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"℄ !! d
I õÒÁÖÎÅÎÉÅ VI.1.6
ïÒÅÄÅÌÉÔÅ ÆÕÎË ÉÀ day', ÏÔÌÉÞÁÀÝÕÀÓÑ ÏÔ ÆÕÎË ÉÉ day (ÓÍ. ÓÔÒ. 180) ×ÙÚÏ×ÏÍ ÆÕÎË ÉÉ dayofweek ×ÍÅÓÔÏ weekday.
J
ïÂÒÁÝÅÎÉÅ ÓÉÓËÁ
æÕÎË ÉÑ reverse, ×ËÌÀÞÅÎÎÁÑ × ÒÅÌÀÄÉÀ, ÉÎ×ÅÒÔÉÒÕÅÔ ÏÒÑ ÄÏË ÜÌÅÍÅÎÔÏ× × ÓÉÓËÅ. üÔÁ ÆÕÎË ÉÑ ÌÅÇËÏ ÏÒÅÄÅÌÑÅÔÓÑ Ó ÏÍÏ ÝØÀ ÒÅËÕÒÓÉÉ. äÌÑ ÕÓÔÏÇÏ ÓÉÓËÁ ÒÅÚÕÌØÔÁÔ ÓÏ×ÁÄÁÅÔ Ó ÉÓÈÏÄ ÎÙÍ ÏÎ ÔÁËÖÅ Ñ×ÌÑÅÔÓÑ ÕÓÔÙÍ ÓÉÓËÏÍ. ÷ ÓÌÕÞÁÅ ÎÅÕÓÔÏÇÏ ÓÉÓËÁ ÓÌÅÄÕÅÔ ÉÎ×ÅÒÔÉÒÏ×ÁÔØ ÅÇÏ È×ÏÓÔ, Á ÇÏÌÏ×Õ ÅÒÅÍÅÓÔÉÔØ × ËÏÎÅ :
reverse :: [a℄ -> [a℄ reverse [℄ = [℄ reverse (x:xs) = reverse xs ++ [x℄ ðÏÌÕÞÅÎÉÅ ÈÁÒÁËÔÅÒÉÓÔÉË ÓÉÓËÁ
ïÄÎÏÊ ÉÚ ÎÁÉÂÏÌÅÅ ÞÁÓÔÏ ÉÓÏÌØÚÕÅÍÙÈ ÈÁÒÁËÔÅÒÉÓÔÉË ÓÉÓ ËÁ Ñ×ÌÑÅÔÓÑ ÅÇÏ ÄÌÉÎÁ, ×ÙÞÉÓÌÑÅÍÁÑ ÕÔÅÍ ÒÉÍÅÎÅÎÉÑ ÆÕÎË ÉÉ length. ÷ ÒÅÌÀÄÉÉ ÏÎÁ ÏÒÅÄÅÌÅÎÁ ÓÌÅÄÕÀÝÉÍ ÏÂÒÁÚÏÍ:
length :: [a℄ -> Int length [℄ = 0 length (x:xs) = 1 + length xs ÁÍ ÖÅ ÏÒÅÄÅÌÅÎÁ ÆÕÎË ÉÑ elem, ÒÏ×ÅÒÑÀÝÁÑ, ÓÏÄÅÒÖÉÔÓÑ ÌÉ × ÓÉÓËÅ ÔÏÔ ÉÌÉ ÉÎÏÊ ÜÌÅÍÅÎÔ:
elem :: Eq a => a -> [a℄ -> Bool elem e xs = or (map (== e) xs) üÔÁ ÆÕÎË ÉÑ ÓÒÁ×ÎÉ×ÁÅÔ ×ÓÅ ÜÌÅÍÅÎÔÙ ÓÉÓËÁ xs × e (ÉÓÏÌØ ÚÕÑ ÞÁÓÔÉÞÎÏ ÁÒÁÍÅÔÒÉÚÏ×ÁÎÎÙÊ ÏÅÒÁÔÏÒ ==). ðÒÏÍÅÖÕÔÏÞÎÙÊ
1. óÉÓËÉ
117
ÒÅÚÕÌØÔÁÔ ÓÉÓÏË ×ÅÌÉÞÉÎ ÔÉÁ Bool, Ë ËÏÔÏÒÏÍÕ ÚÁÔÅÍ ÒÉÍÅ ÎÑÅÔÓÑ ÆÕÎË ÉÑ or, ÙÔÁÀÝÁÑÓÑ ÎÁÊÔÉ ÈÏÔÑ ÂÙ ÏÄÉÎ ÜÌÅÍÅÎÔ, ÒÁ× ÎÙÊ True. ó ÉÓÏÌØÚÏ×ÁÎÉÅÍ ÏÅÒÁÔÏÒÁ ËÏÍÏÚÉ ÉÉ ÆÕÎË ÉÊ ÏÒÅ ÄÅÌÅÎÉÅ ÍÏÖÎÏ ÅÒÅÉÓÁÔØ × ×ÉÄÅ:
elem e = or . (map (== e)) ÷ ÒÏÔÉ×ÏÏÌÏÖÎÏÓÔØ ÜÔÏÊ ÆÕÎË ÉÉ notElem ÉÓÔÉÎÎÁ, ÅÓÌÉ ÅÅ ÅÒ ×ÙÊ ÁÒÁÍÅÔÒ ÎÅ ÓÏÄÅÒÖÉÔÓÑ × ÓÉÓËÅ: notElem e xs = not (elem e xs)
I õÒÁÖÎÅÎÉÅ VI.1.7
òÁÓÓÍÏÔÒÉÍ ÆÕÎË ÉÀ and, ×ËÌÀÞÅÎÎÕÀ × ÆÁÊÌ Prelude.hs É ÒÏ ×ÅÒÑÀÝÕÀ, ×ÓÅ ÌÉ ÜÌÅÍÅÎÔÙ ÓÉÓËÁ ÉÓÔÉÎÎÙ. ïÒÅÄÅÌÅÎÉÅ ÆÕÎË ÉÉ ÓÏÄÅÒÖÉÔ Ä×Á ÏÂÒÁÚ Á, Ó ËÏÔÏÒÙÍÉ ÓÏÏÓÔÁ×ÌÑÅÔÓÑ ÓÉÓÏË-ÁÒ ÇÕÍÅÎÔ. ëÁË ÏÂÙÞÎÏ, ÏÄÉÎ ÉÚ ÎÉÈ ÕÓÔÏÊ ÓÉÓÏË, Á ×ÔÏÒÏÊ ÓÉÓÏË, ÓÏÄÅÒÖÁÝÉÊ ÇÏÌÏ×Õ:
import Prelude hiding(and) and :: [Bool℄ -> Bool and [ ℄ = True and (x : xs) = x && and xs õÂÅÄÉÔÅÓØ × ËÏÒÒÅËÔÎÏÊ ÒÁÂÏÔÅ ÏÒÅÄÅÌÅÎÎÏÊ ×ÁÍÉ ÆÕÎË ÉÉ: ---> and [ 1>2, 3<2℄ False ---> and [ 1<=2, 3<2℄ False ---> and [ 1<=2, 3>2℄ True ---> and [ 1<=2, 3>2, True℄ True
H
J
ó ÉÓÏÌØÚÏ×ÁÎÉÅÍ ÆÕÎË ÉÉ and ÆÕÎË ÉÀ notElem ÍÏÖÎÏ ÒÅÄ ÓÔÁ×ÉÔØ É × ÔÁËÏÍ ×ÉÄÅ:
notElem e = and . (map (/= e)) 1.3. óÏÒÔÉÒÏ×ËÁ ÓÉÓËÏ× óÏÒÔÉÒÏ×ËÁ ÓÉÓËÁ, Ô. Å. ÒÁÚÍÅÝÅÎÉÅ ÅÇÏ ÜÌÅÍÅÎÔÏ× × ÎÅÕÂÙ×ÁÀ ÝÅÍ ÏÒÑÄËÅ, ÍÏÖÅÔ ÏÓÕÝÅÓÔ×ÌÑÔØÓÑ Ó ÏÍÏÝØÀ ÆÕÎË ÉÊ, ÒÅÁÌÉ ÚÕÀÝÉÈ ÒÁÚÌÉÞÎÙÅ ÓÏÒÔÉÒÏ×ËÉ. ÷ ÜÔÏÍ ÒÁÚÄÅÌÅ ÂÕÄÕÔ
ÁÌÇÏÒÉÔÍÙ
VI. óÔÒÕËÔÕÒÙ ÄÁÎÎÙÈ
118
ÒÏÁÎÁÌÉÚÉÒÏ×ÁÎÙ Ä×Á ÁÌÇÏÒÉÔÍÁ. ïÂÁ ÁÌÇÏÒÉÔÍÁ ÒÅÄÏÌÁÇÁÀÔ, ÞÔÏ ÜÌÅÍÅÎÔÙ ÓÉÓËÁ ÍÏÇÕÔ ÂÙÔØ ÕÏÒÑÄÏÞÅÎÅÎÙ. ÁË, ÜÔÏ ÍÏÇÕÔ ÂÙÔØ ÓÉÓËÉ ÅÌÙÈ ÞÉÓÅÌ ÉÌÉ ÓÉÓËÉ ÓÉÓËÏ× ÞÉÓÅÌ ÔÉÁ Float, ÎÏ ÎÅ ÍÏÇÕÔ ÂÙÔØ, ÎÁÒÉÍÅÒ, ÓÉÓËÉ ÆÕÎË ÉÊ. äÁÎÎÙÊ ÆÁËÔ ÓÌÅÄÕÀ ÝÉÍ ÏÂÒÁÚÏÍ ÏÔÒÁÖÅÎ × ÏÂßÑ×ÌÅÎÉÉ ÔÉÁ ÆÕÎË ÉÉ, ÏÓÕÝÅÓÔ×ÌÑÀ ÝÅÊ ÓÏÒÔÉÒÏ×ËÕ:
sort
:: Ord a => [a℄ -> [a℄
üÔÏ ÏÚÎÁÞÁÅÔ, ÞÔÏ ÆÕÎË ÉÑ sort ÍÏÖÅÔ ÒÉÍÅÎÑÔØÓÑ Ë ÓÉÓËÁÍ, ÜÌÅÍÅÎÔÙ ËÏÔÏÒÏÇÏ ÏÔÎÏÓÑÔÓÑ Ë ËÌÁÓÓÕ Ord, Ô. Å. ÄÏÕÓËÁÀÔ ÓÒÁ×ÎÅ ÎÉÅ. óÏÒÔÉÒÏ×ËÁ ×ÓÔÁ×ËÏÊ
H
ðÒÅÄÏÌÏÖÉÍ, ÞÔÏ Õ ÎÁÓ ÕÖÅ ÉÍÅÅÔÓÑ ÏÔÓÏÒÔÉÒÏ×ÁÎÎÙÊ ÓÉÓÏË. ÏÇÄÁ ÎÏ×ÙÊ ÜÌÅÍÅÎÔ ÍÏÖÅÔ ÂÙÔØ ×ÓÔÁ×ÌÅÎ ÎÁ ÏÄÈÏÄÑÝÅÅ ÍÅÓÔÏ ÒÉ ÏÍÏÝÉ ÔÁËÏÊ ÆÕÎË ÉÉ:
insert :: insert e [ ℄ = insert e (x:xs) | e <= x = | otherwise =
Ord a => a -> [a℄ -> [a℄ [e℄ e : x : xs x : insert e xs
åÓÌÉ ÓÉÓÏË ÂÙÌ ÕÓÔ, ÔÏ ÎÏ×ÙÊ ÓÉÓÏË ÓÏÄÅÒÖÉÔ ÅÄÉÎÓÔ×ÅÎÎÙÊ ÜÌÅÍÅÎÔ e. åÓÌÉ ÓÉÓÏË ÎÅ ÕÓÔ, É x ÅÇÏ ÅÒ×ÙÊ ÜÌÅÍÅÎÔ, ÔÏ x ÓÒÁ×ÎÉ×ÁÅÔÓÑ Ó e. ÷ ÓÌÕÞÁÅ, ËÏÇÄÁ ÜÌÅÍÅÎÔ e ÍÅÎØÛÅ ÉÌÉ ÒÁ×ÅÎ x, ÏÎ ×ÓÔÁ×ÌÑÅÔÓÑ × ÎÁÞÁÌÏ ÓÉÓËÁ; × ÒÏÔÉ×ÎÏÍ ÓÌÕÞÁÅ, ÇÏÌÏ×ÏÊ ÓÉÓËÁ ÏÓÔÁÅÔÓÑ x É ÏÓÕÝÅÓÔ×ÌÑÅÔÓÑ ÒÅËÕÒÓÉ×ÎÁÑ ×ÓÔÁ×ËÁ e × ÓÉÓÏË xs:
---> insert 3 [1, 2, 4℄ [1,2,3,4℄ îÁÏÍÎÉÍ, ÞÔÏ ÄÌÑ ÒÉÍÅÎÅÎÉÑ ÆÕÎË ÉÉ insert ÎÕÖÅÎ ÏÔÓÏÒÔÉ ÒÏ×ÁÎÎÙÊ ÓÉÓÏË, ÔÏÌØËÏ × ÜÔÏÍ ÓÌÕÞÁÅ ÓÉÓÏË Ó ÄÏÂÁ×ÌÅÎÎÙÍ ÜÌÅ ÍÅÎÔÏÍ, ÔÁËÖÅ ÂÕÄÅÔ ÏÔÓÏÒÔÉÒÏ×ÁÎ. ÅÍ ÎÅ ÍÅÎÅÅ, ÆÕÎË ÉÑ insert ÍÏÖÅÔ ÉÓÏÌØÚÏ×ÁÔØÓÑ ÄÌÑ ÓÏÒÔÉÒÏ×ËÉ ÓÉÓËÏ×. ðÒÅÄÏÌÏÖÉÍ, ÞÔÏ ÔÒÅÂÕÅÔÓÑ ÏÔÓÏÒÔÉÒÏ×ÁÔØ ÓÉÓÏË [a, b, , d℄. ÷ÏÚØÍÅÍ ÕÓÔÏÊ ÓÉÓÏË É ÏÍÅÓÔÉÍ × ÎÅÇÏ ÜÌÅÍÅÎÔ d. òÅÚÕÌØ ÔÁÔÏÍ ÂÕÄÅÔ ÏÔÓÏÒÔÉÒÏ×ÁÎÎÙÊ ÓÉÓÏË ÉÚ ÏÄÎÏÇÏ ÜÌÅÍÅÎÔÁ. ÅÅÒØ ÄÏÂÁ×ÉÍ × ÎÅÇÏ ÜÌÅÍÅÎÔ , ÚÁÔÅÍ b É, ÎÁËÏÎÅ , Á. îÁ ËÁÖÄÏÍ ÛÁÇÕ ÍÙ ÏÌÕÞÁÌÉ ÏÔÓÏÒÔÉÒÏ×ÁÎÎÙÊ ÓÉÓÏË É ÒÅÚÕÌØÔÁÔ ÔÏÖÅ ÏÔÓÏÒ ÔÉÒÏ×ÁÎ. ÷ÙÒÁÖÅÎÉÅ, ×ÙÞÉÓÌÅÎÉÅ ËÏÔÏÒÏÇÏ ÒÉ×ÅÌÏ Ë ÓÏÒÔÉÒÏ×ËÅ ÓÉÓËÁ, ÔÁËÏ×Ï
a `insert` (b `insert` ( `insert` (d `insert` [ ℄)))
1. óÉÓËÉ
119
óÔÒÕËÔÕÒÁ ÜÔÏÇÏ ×ÙÒÁÖÅÎÉÑ ÏÌÎÏÓÔØÀ ÓÏÏÔ×ÅÔÓÔ×ÕÅÔ ÒÉÍÅÎÅ ÎÉÀ Ó×ÅÒÔËÉ Ó ÆÕÎË ÉÅÊ insert, ÒÁÓÓÍÏÔÒÅÎÎÏÊ ×ÙÛÅ, × ËÁÞÅÓÔ×Å ÏÅÒÁÔÏÒÁ É ÕÓÔÏÇÏ ÓÉÓËÁ × ËÁÞÅÓÔ×Å ÓÔÁÒÔÏ×ÏÇÏ ÚÎÁÞÅÎÉÑ. ïÔÓÀ ÄÁ ÏÌÕÞÁÅÍ ÏÄÉÎ ÉÚ ×ÏÚÍÏÖÎÙÈ ÁÌÇÏÒÉÔÍÏ× ÓÏÒÔÉÒÏ×ËÉ:
isort = foldr insert [ ℄ üÔÏÔ ÁÌÇÏÒÉÔÍ ÎÁÚÙ×ÁÅÔÓÑ
ÓÏÒÔÉÒÏ×ËÁ ×ÓÔÁ×ËÏÊ.
óÏÒÔÉÒÏ×ËÁ ÓÌÉÑÎÉÅÍ
äÒÕÇÏÊ ÁÌÇÏÒÉÔÍ ÓÏÒÔÉÒÏ×ËÉ ÉÓÏÌØÚÕÅÔ ×ÏÚÍÏÖÎÏÓÔØ ÓÌÉÑÎÉÑ Ä×ÕÈ ÏÔÓÏÒÔÉÒÏ×ÁÎÎÙÈ ÓÉÓËÏ× × ÏÄÉÎ. üÔÏ ÏÓÕÝÅÓÔ×ÌÑÅÔÓÑ Ó Ï ÍÏÝØÀ ÆÕÎË ÉÉ merge:
merge :: merge [℄ ys = merge xs [℄ = merge (x:xs) (y:ys) | x <= y = | otherwise =
Ord a => [a℄ -> [a℄ -> [a℄ ys xs
x : merge xs (y:ys) y : merge (x:xs) ys
÷ ÓÌÕÞÁÅ, ËÏÇÄÁ ÏÄÉÎ ÉÚ ÓÉÓËÏ× ÕÓÔ, ÒÅÚÕÌØÔÁÔÏÍ Ñ×ÌÑÅÔÓÑ ÄÒÕ ÇÏÊ ÓÉÓÏË. åÓÌÉ ÏÂÁ ÓÉÓËÁ ÎÅ ÕÓÔÙ, ÔÏ ÍÅÎØÛÉÊ ÉÚ Ä×ÕÈ ÇÏÌÏ× ÎÙÈ ÜÌÅÍÅÎÔÏ× ÓÔÁÎÏ×ÉÔÓÑ ÇÏÌÏ×ÏÊ ÎÏ×ÏÇÏ ÓÉÓËÁ, Á ÏÓÔÁ×ÛÉÅÓÑ ÜÌÅÍÅÎÔÙ ÒÏÄÏÌÖÁÀÔ ÕÞÁÓÔ×Ï×ÁÔØ × ÒÅËÕÒÓÉ×ÎÏÍ ×ÙÚÏ×Å ÆÕÎË ÉÉ merge. áÎÁÌÏÇÉÞÎÏ insert, ÆÕÎË ÉÑ merge ÒÅÄÏÌÁÇÁÅÔ, ÞÔÏ ÅÅ Á ÒÁÍÅÔÒÙ ÕÖÅ ÏÔÓÏÒÔÉÒÏ×ÁÎÙ. ÏÌØËÏ × ÜÔÏÍ ÓÌÕÞÁÅ ÍÏÖÎÏ ÂÙÔØ Õ×ÅÒÅÎÎÙÍ × ÔÏÍ, ÞÔÏ × ÒÅÚÕÌØÔÁÔÅ ÓÌÉÑÎÉÑ ÂÕÄÅÔ ÏÌÕÞÅÎ ÏÔÓÏÒ ÔÉÒÏ×ÁÎÎÙÊ ÓÉÓÏË. ÷ÏÓÏÌØÚÏ×Á×ÛÉÓØ ÆÕÎË ÉÅÊ merge, ÍÏÖÎÏ ÏÓÔÒÏÉÔØ ÁÌÇÏ ÒÉÔÍ ÓÏÒÔÉÒÏ×ËÉ ÓÉÓËÁ. üÔÏÔ ÁÌÇÏÒÉÔÍ ÏÓÎÏ×Ù×ÁÅÔÓÑ ÎÁ ÔÏÍ ÆÁË ÔÅ, ÞÔÏ ÕÓÔÏÊ ÓÉÓÏË É ÓÉÎÇÌÅÔÏÎ (ÓÉÓÏË, ÓÏÄÅÒÖÁÝÉÊ ÏÄÉÎ ÜÌÅ ÍÅÎÔ) ÕÖÅ ÏÔÓÏÒÔÉÒÏ×ÁÎÙ. ìÀÂÏÊ ÓÉÓÏË ÂÏÌØÛÅÊ ÄÌÉÎÙ ÍÏÖÅÔ ÂÙÔØ ÒÁÚÄÅÌÅÎ ÎÁ Ä×Å ÞÁÓÔÉ, ËÁÖÄÁÑ ÉÚ ËÏÔÏÒÙÈ ÓÏÄÅÒÖÉÔ ÍÅÎØ ÛÅÅ ÞÉÓÌÏ ÜÌÅÍÅÎÔÏ×. ðÏÌÕÞÅÎÎÙÅ Ä×Å ÏÌÏ×ÉÎËÉ ÍÏÖÎÏ ÏÔÓÏÒÔÉ ÒÏ×ÁÔØ ÒÉ ÏÍÏÝÉ ÒÅËÕÒÓÉ×ÎÏÇÏ ×ÙÚÏ×Á ÁÌÇÏÒÉÔÍÁ ÓÏÒÔÉÒÏ×ËÉ, ÏÓÌÅ ÞÅÇÏ ÏÔÓÏÒÔÉÒÏ×ÁÎÎÙÅ ÞÁÓÔÉ ÓÌÉ×ÁÀÔÓÑ × ÏÄÉÎ ÓÉÓÏË ÆÕÎË ÉÅÊ merge:
msort :: Ord a => [a℄ -> [a℄ msort xs | len <= 1 = xs
VI. óÔÒÕËÔÕÒÙ ÄÁÎÎÙÈ
120
| otherwise where ys zs half len
= = = = =
merge (msort ys) (msort zs) take half xs drop half xs len `div` 2 length xs
üÔÏÔ ÁÌÇÏÒÉÔÍ ÎÏÓÉÔ ÎÁÚ×ÁÎÉÅ
ÓÏÒÔÉÒÏ×ËÁ ÓÌÉÑÎÉÅÍ.
1.4. æÕÎË ÉÉ ×ÙÓÛÅÇÏ ÏÒÑÄËÁ ÎÁ ÓÉÓËÁÈ ïÄÎÏÊ ÉÚ ÏÓÏÂÅÎÎÏÓÔÅÊ ÆÕÎË ÉÏÎÁÌØÎÏÇÏ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÑ Ñ×ÌÑÅÔÓÑ ÔÏ, ÞÔÏ ÆÕÎË ÉÉ ÍÏÇÕÔ ×ÙÓÔÕÁÔØ × ÒÏÌÉ ÄÁÎÎÙÈ ÄÌÑ ÄÒÕ ÇÉÈ ÆÕÎË ÉÊ. íÎÏÇÉÅ ÆÕÎË ÉÉ ÄÌÑ ÒÁÂÏÔÙ ÓÏ ÓÉÓËÁÍÉ Ñ×ÌÑÀÔÓÑ ÆÕÎË ÉÑÍÉ ×ÙÓÛÅÇÏ ÏÒÑÄËÁ: ÉÈ ÁÒÇÕÍÅÎÔÁÍÉ ×ÙÓÔÕÁÀÔ ÄÒÕÇÉÅ ÆÕÎË ÉÉ.
map É filter òÁÎÅÅ ÕÖÅ ÏÂÓÕÖÄÁÌÉÓØ ÆÕÎË ÉÉ map É filter. æÕÎË ÉÑ map ÒÉÍÅÎÑÅÔ ÆÕÎË ÉÀ-ÁÒÁÍÅÔÒ Ë ËÁÖÄÏÍÕ ÜÌÅÍÅÎÔÕ ÓÉÓËÁ: xs = [ 1 , 2 , 3 , 4 , 5 ℄
æÕÎË ÉÉ
#
#
#
#
#
map square xs = [ 1 , 4 , 9 , 16 , 25 ℄ æÕÎË ÉÑ filter ÕÄÁÌÑÅÔ ÉÚ ÓÉÓËÁ ×ÓÅ ÜÌÅÍÅÎÔÙ, ÎÅ ÕÄÏ×ÌÅÔ×ÏÒÑ ÀÝÉÅ ÕÓÌÏ×ÉÀ: xs = [ 1 , 2 , 3 , 4 , 5 ℄
#
#
filter even xs = [ 2 , 4 ℄ òÅËÕÒÓÉ×ÎÙÅ ÏÒÅÄÅÌÅÎÉÑ ÜÔÉÈ ÆÕÎË ÉÊ, ×ËÌÀÞÅÎÎÙÅ × ÆÁÊÌ Prelude.hs, ÏÂÓÕÖÄÁÌÉÓØ ÎÁ ÓÔÒ. 85. map :: (a -> b) -> [a℄ -> [b℄ map f [ ℄ = [℄ map f (x:xs) = f x : map f xs filter :: (a -> Bool) -> [a℄ -> [a℄ filter p [ ℄ = [ ℄ filter p (x:xs) | p x = x : filter p xs | otherwise = filter p xs ó×ÅÒÔËÉ
ó×ÅÒÔËÁ ÓÒÁ×Á foldr ×ÓÔÁ×ÌÑÅÔ ÏÅÒÁÔÏÒ ÍÅÖÄÕ ×ÓÅÍÉ ÜÌÅÍÅÎ ÔÁÍÉ ÓÉÓËÁ, ÎÁÞÉÎÁÑ Ó ÒÁ×ÏÊ ÓÔÏÒÏÎÙ:
1. óÉÓËÉ
121
xs = [
1
#
,
2
#
,
3
#
,
4
#
,
5
#
℄
foldr (+) 0 xs = (1 + (2 + (3 + (4 + (5 + 0))))) æÕÎË ÉÑ foldl ×ÓÔÁ×ÌÑÅÔ ÏÅÒÁÔÏÒ ÍÅÖÄÕ ×ÓÅÍÉ ÜÌÅÍÅÎÔÁÍÉ ÓÉÓËÁ, ÎÁÞÉÎÁÑ Ó ÌÅ×ÏÊ ÓÔÏÒÏÎÙ: xs = [ 1 , 2 , 3 , 4 , 5℄
#
#
#
#
#
foldl (+) 0 xs = (((((0 + 1) + 2) + 3) + 4) + 5) ÷ÓÏÍÎÉÍ ÒÉ×ÏÄÉÍÙÅ ÒÁÎÅÅ ÏÒÅÄÅÌÅÎÉÑ ÜÔÉÈ ÆÕÎË ÉÊ (ÓÔÒ. 85): foldr :: ( a -> b -> b) -> b -> [a℄ -> b foldr f e [ ℄ = e foldr f e (x:xs) = x `f` foldr f e xs
foldl :: ( b -> a -> b) -> b -> [a℄ -> b foldl f e [ ℄ = e foldl f e (x:xs) = foldl f ( e `f` x) xs ó ÏÍÏÝØÀ ÜÔÉÈ ÓÔÁÎÄÁÒÔÎÙÈ ÆÕÎË ÉÊ ÍÏÖÎÏ ÉÚÂÁ×ÉÔØÓÑ ÏÔ Ñ×ÎÏÊ ÒÅËÕÒÓÉÉ × ÏÒÅÄÅÌÅÎÉÑÈ ÂÏÌØÛÉÎÓÔ×Á ÄÒÕÇÉÈ ÆÕÎË ÉÊ. îÁ ÒÉÍÅÒ, ÆÕÎË ÉÑ or, ×ÙÑÓÎÑÀÝÁÑ, ÉÍÅÅÔÓÑ ÌÉ × ÓÉÓËÅ ÈÏÔÑ ÂÙ ÏÄÉÎ ÜÌÅÍÅÎÔ, ÒÁ×ÎÙÊ True, ÍÏÖÅÔ ÂÙÔØ ÏÒÅÄÅÌÅÎÁ ÔÁË:
or = foldr (||) False ÷ÏÔ ÒÅËÕÒÓÉ×ÎÏÅ ÏÒÅÄÅÌÅÎÉÅ, × ËÏÔÏÒÏÍ ÎÅ ÕÞÁÓÔ×ÕÅÔ Ó×ÅÒÔËÁ:
or [ ℄ = False or (x:xs) = x || or xs íÎÏÇÉÅ ÆÕÎË ÉÉ ÍÏÇÕÔ ÂÙÔØ ÅÒÅÉÓÁÎÙ × ÔÅÒÍÉÎÁÈ foldr É map. èÏÒÏÛÉÍ ÒÉÍÅÒÏÍ ÄÌÑ ÉÌÌÀÓÔÒÁ ÉÉ ÔÁËÏÊ ×ÏÚÍÏÖÎÏÓÔÉ Ñ×ÌÑÅÔÓÑ ÆÕÎË ÉÑ elem:
elem e = foldr (||) False . map (== e) ëÏÎÅÞÎÏ, É ÜÔÁ ÆÕÎË ÉÑ ÍÏÖÅÔ ÂÙÔØ ÏÒÅÄÅÌÅÎÁ Ñ×ÎÏ, ÂÅÚ ÉÓÏÌØ ÚÏ×ÁÎÉÑ ÓÔÁÎÄÁÒÔÎÙÈ ÆÕÎË ÉÊ. ÷ ÜÔÏÍ ÓÌÕÞÁÅ ÏÒÅÄÅÌÅÎÉÅ ÂÕÄÅÔ ÒÅËÕÒÓÉ×ÎÏ:
elem e [ ℄ = False elem e (x:xs) = x == e || elem e xs æÕÎË ÉÑ foldr ÉÓÏÌØÚÕÅÔÓÑ ÄÌÑ ÏÒÅÄÅÌÅÎÉÑ ÓÁÍÙÈ ÒÁÚÎÙÈ ÆÕÎË ÉÊ ÎÁ ÓÉÓËÁÈ. ÷ÏÔ ÅÝÅ ÎÅÓËÏÌØËÏ ÒÉÍÅÒÏ×:
VI. óÔÒÕËÔÕÒÙ ÄÁÎÎÙÈ
122
reverse :: [a℄ -> [a℄ reverse = foldr sno [ ℄ where sno x xs = xs ++ [x℄ length ::[a℄ -> Int length = foldr oneplus 0 where oneplus x n = 1 + n sum, produ t :: Num a => [a℄ -> a sum = foldr (+) 0 produ t = foldr (*) 1 and and
:: [Bool℄ -> Bool = foldr (&&) True
map :: (a -> b) -> [a℄ -> [b℄ map f = foldr ( ons . f) [ ℄ where ons x xs = x : xs îÅ ËÁÖÄÁÑ ÆÕÎË ÉÑ ÎÁ ÓÉÓËÁÈ ÍÏÖÅÔ ÂÙÔØ ÏÒÅÄÅÌÅÎÁ ÞÅ ÒÅÚ foldr. îÁÒÉÍÅÒ, ÒÁÓÓÍÁÔÒÉ×ÁÅÍÁÑ ÄÁÌÅÅ ÆÕÎË ÉÑ zip ÍÏÖÅÔ ÂÙÔØ ×ÙÒÁÖÅÎÁ ÔÏÌØËÏ ÞÅÒÅÚ Ó×ÅÒÔËÕ ÓÌÅ×Á. ó×ÅÒÔËÉ ÂÅÚ ÎÁÞÁÌØÎÙÈ ÚÎÁÞÅÎÉÊ
ðÒÅÄÏÌÏÖÉÍ, ÞÔÏ ÎÁÍ ÔÒÅÂÕÅÔÓÑ ÎÁÊÔÉ ÍÁËÓÉÍÁÌØÎÙÊ ÜÌÅÍÅÎÔ ÓÉÓËÁ ÞÉÓÅÌ. ÷ÓÏÍÎÉ× ÒÏ Ó×ÅÒÔËÕ, ÍÙ ÍÏÇÌÉ ÂÙ ÏÒÏÂÏ×ÁÔØ ÎÅÞÔÏ ×ÒÏÄÅ ÓÌÅÄÕÀÝÅÇÏ ÏÒÅÄÅÌÅÎÉÑ:
maxlist :: Num a => [a℄ -> a maxlist = foldr max e îÏ ÞÔÏ ×ÙÂÒÁÔØ × ËÁÞÅÓÔ×Å ÎÁÞÁÌØÎÏÇÏ ÜÌÅÍÅÎÔÁ e? åÓÌÉ ÂÙ ÂÙ ÌÏ ÉÚ×ÅÓÔÎÏ, ÞÔÏ ÓÉÓÏË ÓÏÄÅÒÖÉÔ ÎÅÏÔÒÉ ÁÔÅÌØÎÙÅ ÚÎÁÞÅÎÉÑ, ÔÏ ÍÏÖÎÏ ÂÙÌÏ ÂÙ ÓÞÉÔÁÔØ e ÒÁ×ÎÙÍ ÎÕÌÀ. îÏ ÎÁÓ ÎÅ ÕÓÔÒÁÉ×ÁÅÔ ÔÁ ËÏÅ ÏÇÒÁÎÉÞÅÎÉÅ. éÔÁË, ÞÅÍÕ ÄÏÌÖÎÏ ÒÁ×ÎÑÔØÓÑ maxlist [ ℄? ÷ÅÄØ ÎÁÍ ÈÏÔÅÌÏÓØ ÂÙ ÉÍÅÔØ maxlist [x℄ = x ÄÌÑ ÌÀÂÏÇÏ x. îÏ ËÁËÏ×Ï ÓÁÍÏÅ ÍÅÎØÛÅÅ ÉÚ ×ÓÅÈ ×ÏÚÍÏÖÎÙÈ ÞÉÓÅÌ? ÷ ÑÚÙËÅ Haskell ÒÅÄÕ ÓÍÏÔÒÅÎ ÓÅ ÉÁÌØÎÙÊ ËÌÁÓÓ Bounded, ÓÏÄÅÒÖÁÝÉÊ ÔÏÌØËÏ Ä×Å ×Å ÌÉÞÉÎÙ: minBound ÍÉÎÉÍÁÌØÎÏÅ É maxBound ÍÁËÓÉÍÁÌØÎÏÅ ÉÚ ×ÏÚÍÏÖÎÙÈ ÞÉÓÅÌ. ó ÕÞÅÔÏÍ ×ÙÛÅÓËÁÚÁÎÎÏÇÏ, ÔÅÅÒØ ×ÏÚÍÏÖÎÏ ÏÒÅÄÅÌÉÔØ ÆÕÎË ÉÀ maxlist ÔÁË:
1. óÉÓËÉ
123
maxlist :: [Int℄ -> Int maxlist = foldr max minBound áÌØÔÅÒÎÁÔÉ×ÎÙÍ ÒÅÛÅÎÉÅÍ, ÂÅÚ ÉÓÏÌØÚÏ×ÁÎÉÑ ×ÅÌÉÞÉÎÙ minBound, Ñ×ÉÌÏÓØ ÂÙ ××ÅÄÅÎÉÅ ÎÏ×ÏÊ ÆÕÎË ÉÉ Ó×ÅÒÔËÉ, ÔÁËÏÊ ÞÔÏ ÂÙ ÅÊ ÎÅ ÔÒÅÂÏ×ÁÌÏÓØ ÉÎÉ ÉÁÌÉÚÉÒÕÀÝÅÅ ÚÎÁÞÅÎÉÅ. ÷ ÄÅÊÓÔ×ÉÔÅÌØ ÎÏÓÔÉ ÍÏÖÎÏ ÏÒÅÄÅÌÉÔØ Ä×Å ÔÁËÉÈ ÆÕÎË ÉÉ, foldr1 É foldl1.
foldr1 () [x1 ; x2 ; : : : ; xn 1 ; xn ℄ = x1 (x2 (: : : (xn 1 xn ) : : :)), foldl1 () [x1 ; x2 ; x3 ; : : : ; xn ℄ = (: : : ((x1 x2 ) x3 ) : : :) xn , ÇÄÅ
ÂÉÎÁÒÎÙÊ ÏÅÒÁÔÏÒ.
úÁÉÓÁ× ÏÒÅÄÅÌÅÎÉÅ ÎÁ ÑÚÙËÅ Haskell, ÏÌÕÞÉÍ
foldr1 :: (a -> a -> a) -> [a℄ -> a foldr1 f [x℄ = x foldr1 f (x:xs) = f x (foldr1 f xs) óÏÏÔ×ÅÔÓÔ×ÕÀÝÅÅ ÏÒÅÄÅÌÅÎÉÅ ÞÅÒÅÚ ÆÕÎË ÉÀ foldl ÔÁËÏ×Ï:
foldl1 :: (a -> a -> a) -> [a℄ -> a foldl1 f (x:xs) = foldl f x xs ÅÅÒØ ÆÕÎË ÉÀ maxlist ÍÏÖÎÏ ÏÒÅÄÅÌÉÔØ ÔÁË:
maxlist = foldr1 (max) ÁË ËÁË ÆÕÎË ÉÑ max ÁÓÓÏ ÉÁÔÉ×ÎÁ, ÔÏ × ÜÔÏÍ ÏÒÅÄÅÌÅÎÉÉ ÍÏÖÎÏ ÉÓÏÌØÚÏ×ÁÔØ ËÁË foldr1, ÔÁË É foldl1.
I õÒÁÖÎÅÎÉÅ VI.1.8
ðÏÄÇÏÔÏ×ØÔÅ ÓËÒÉÔ, ÓÏÄÅÒÖÁÝÉÊ ÒÁÚÎÏÏÂÒÁÚÎÙÅ ÏÒÅÄÅÌÅÎÉÑ ÆÕÎË ÉÉ maxlist, ÏÓÌÅ ÞÅÇÏ ÕÂÅÄÉÔÅÓØ × ÉÈ ÜË×É×ÁÌÅÎÔÎÏÓÔÉ.
J
takeWhile É dropWhile òÁÓÓÍÏÔÒÉÍ ÅÝÅ Ä×Å ÏÌÅÚÎÙÅ ÆÕÎË ÉÉ ×ÙÓÛÅÇÏ ÏÒÑÄËÁ ÎÁ ÓÉÓËÁÈ: takeWhile É dropWhile. æÕÎË ÉÑ takeWhile ÏÞÅÎØ ÎÁÏÍÉÎÁÅÔ ÆÕÎË ÉÀ filter: ÅÅ ÁÒ ÇÕÍÅÎÔÁÍÉ ÔÁËÖÅ Ñ×ÌÑÀÔÓÑ ÒÅÄÉËÁÔ É ÓÉÓÏË. îÏ × ÏÔÌÉÞÉÉ ÏÔ filter, ËÏÔÏÒÁÑ ÒÏÓÍÁÔÒÉ×ÁÅÔ ×ÅÓØ ÓÉÓÏË × ÏÉÓËÁÈ ÏÄÈÏÄÑÝÉÈ ÜÌÅÍÅÎÔÏ×, takeWhile, ÒÏÓÍÁÔÒÉ×ÁÑ ÓÉÓÏË Ó ÎÁÞÁÌÁ, ÏÓÔÁÎÁ×ÌÉ ×ÁÅÔÓÑ ÓÒÁÚÕ, ËÁË ÔÏÌØËÏ ÎÁÊÄÅÔÓÑ ÜÌÅÍÅÎÔ, ÎÅ ÕÄÏ×ÌÅÔ×ÏÒÑÀÝÉÊ ÚÁÄÁÎÎÏÍÕ ÒÅÄÉËÁÔÕ. îÁÒÉÍÅÒ, æÕÎË ÉÉ
VI. óÔÒÕËÔÕÒÙ ÄÁÎÎÙÈ
124
H
H
---> takeWhile even [2, 4, 6, 7, 8℄ [2,4,6℄ ---> filter even [2, 4, 6, 7, 8℄ [2,4,6,8℄ ÷ ÏÔÌÉÞÉÉ ÏÔ filter ÆÕÎË ÉÑ takeWhile ÎÅ ÏÍÅÓÔÉÌÁ ÞÉÓÌÏ 8 × ÒÅÚÕÌØÔÉÒÕÀÝÉÊ ÓÉÓÏË, ÔÁË ËÁË ÏÎÁ ÚÁ×ÅÒÛÉÌÁ Ó×ÏÀ ÒÁÂÏÔÕ ÏÓÌÅ ÒÏ×ÅÒËÉ ÞÉÓÌÁ 7. ïÚÎÁËÏÍÉÍÓÑ Ó ÅÅ ÏÒÅÄÅÌÅÎÉÅÍ:
takeWhile :: (a -> Bool) -> [a℄ -> [a℄ takeWhile p [ ℄ = [℄ takeWhile p (x:xs) | p x = x : takeWhile p xs | otherwise = [ ℄ ÁË ÖÅ ËÁË take ÓÏÓÅÄÓÔ×ÕÅÔ Ó drop, ÆÕÎË ÉÑ takeWhile Ó×ÑÚÁ ÎÁ Ó ÆÕÎË ÉÅÊ dropWhile. ïÎÁ ÕÄÁÌÑÅÔ ÉÚ ÓÉÓËÁ ×ÓÅ ÎÁÞÁÌØÎÙÅ ÜÌÅÍÅÎÔÙ, ÕÄÏ×ÌÅÔ×ÏÒÑÀÝÉÅ ÕÓÌÏ×ÉÀ. îÁÞÉÎÁÑ Ó ÅÒ×ÏÇÏ ÜÌÅÍÅÎ ÔÁ, ËÏÔÏÒÙÊ ÎÅ ÕÄÏ×ÌÅÔ×ÏÒÉÌ ÕÓÌÏ×ÉÀ, ×ÓÅ ÏÓÔÁ×ÛÉÅÓÑ ÜÌÅÍÅÎÔÙ ÏÍÅÝÁÀÔÓÑ × ÒÅÚÕÌØÔÉÒÕÀÝÉÊ ÓÉÓÏË:
---> dropWhile even [2, 4, 6, 7, 8, 9℄ [7,8,9℄ ïÒÅÄÅÌÅÎÉÅ ÜÔÏÊ ÆÕÎË ÉÉ ÔÁËÏ×Ï:
dropWhile :: (a -> Bool) -> [a℄ -> [a℄ dropWhile p [ ℄ = [ ℄ dropWhile p (x:xs) | p x = dropWhile p xs | otherwise = x:xs zip æÕÎË ÉÑ zip ÂÅÒÅÔ Ä×Á ÓÉÓËÁ É ×ÏÚ×ÒÁÝÁÅÔ ÓÉÓÏË ÁÒ ÓÏÏÔ×ÅÔ ÓÔ×ÕÀÝÉÈ ÜÌÅÍÅÎÔÏ×; ÅÓÌÉ ÓÉÓËÉ ÉÍÅÀÔ ÒÁÚÎÕÀ ÄÌÉÎÕ, ÔÏ ÄÌÉÎÁ ÒÅÚÕÌØÔÉÒÕÀÝÅÇÏ ÓÉÓËÁ ÓÏ×ÁÄÅÔ Ó ÄÌÉÎÏÊ ÂÏÌÅÅ ËÏÒÏÔËÏÇÏ. æÕÎË ÉÑ
H
---> zip [0 .. 4℄ "hello" [(0,'h'),(1,'e'),(2,'l'),(3,'l'),(4,'o')℄ ---> zip [0 .. 1℄ "hello" [(0,'h'),(1,'e')℄ ðÏÌÎÏÅ ÏÒÅÄÅÌÅÎÉÅ zip ÔÁËÏ×Ï:
zip zip [ ℄
ys
:: [a℄ -> [b℄ -> [(a,b)℄ = [ ℄
1. óÉÓËÉ
125
zip (x:xs) [ ℄ = [ ℄ zip (x:xs) (y:ys) = (x, y) : zip xs ys ïÂÒÁÚ Ù ÓÏÏÔ×ÅÔÓÔ×ÉÑ, ÒÉÍÅÎÑÅÍÙÅ × ÜÔÏÍ ÏÒÅÄÅÌÅÎÉÉ, ÁÎÁ ÌÏÇÉÞÎÙ ÏÂÒÁÚ ÁÍ ÆÕÎË ÉÊ take É drop. æÕÎË ÉÑ zip ÉÍÅÅÔ ÍÎÏÖÅÓÔ×Ï ÒÉÍÅÎÅÎÉÊ. óÌÅÄÕÀÝÉÅ Ä×Á ÕÒÁÖÎÅÎÉÑ ÄÅÍÏÎÓÔÒÉÒÕÀÔ ÏÌÅÚÎÏÓÔØ ÜÔÏÊ ÆÕÎË ÉÉ.
I õÒÁÖÎÅÎÉÅ VI.1.9
ëÁË ÉÚ×ÅÓÔÎÏ, ÓËÁÌÑÒÎÏÅ ÒÏÉÚ×ÅÄÅÎÉÅ Ä×ÕÈ ×ÅËÔÏÒÏ× x É y ÒÁ×ÎÏ ÓÕÍÍÅ ÏÁÒÎÙÈ ÒÏÉÚ×ÅÄÅÎÉÊ ËÏÏÒÄÉÎÁÔ ×ÅËÔÏÒÏ×:
x y =
n X i=1
xi yi :
æÕÎË ÉÑ sp, ×ÙÞÉÓÌÑÀÝÉÊ ÓËÁÌÑÒÎÏÅ ÒÏÉÚ×ÅÄÅÎÉÅ, ÍÏÖÅÔ ÂÙÔØ ÏÒÅÄÅÌÅÎÁ ÔÁË
sp :: Num a => [a℄ -> [a℄ -> a sp xs ys = sum (map times (zip xs ys)) where times (x, y) = x * y
óÏÈÒÁÎÉÔÅ ÏÒÅÄÅÌÅÎÉÅ ÆÕÎË ÉÉ sp × ÆÁÊÌÅ É ÒÉÍÅÎÉÔÅ ÅÅ Ë ×ÅË ÔÏÒÁÍ ÒÁÚÌÉÞÎÏÊ ÒÁÚÍÅÒÎÏÓÔÉ. ïÂÒÁÔÉÔÅ ×ÎÉÍÁÎÉÅ, ÞÔÏ ÉÓÏÌØÚÕÅÍÁÑ ÚÄÅÓØ ÆÕÎË ÉÑ times Ñ×ÌÑÅÔÓÑ ×ÓÅÇÏ ÌÉÛØ ÎÅËÁÒÒÉÎÇÏ×ÏÊ ×ÅÒÓÉÅÊ ÏÅÒÁÔÏÒÁ ÕÍÎÏÖÅÎÉÑ *, ÄÒÕÇÉÍÉ ÓÌÏ×ÁÍÉ times = un urry (*) (ÓÍ. ÓÔÒ. 79). ÷ÎÅÓÉÔÅ ÉÚÍÅÎÅÎÉÅ × ÓËÒÉÔ, ÏÓÌÅ ÞÅÇÏ ÒÏ×ÅÒØÔÅ ÅÇÏ ÒÁÂÏÔÏÓÏÓÏÂÎÏÓÔØ.
J
I õÒÁÖÎÅÎÉÅ VI.1.10
òÁÓÓÍÏÔÒÉÍ ÆÕÎË ÉÀ nonde , ÏÒÅÄÅÌÑÀÝÕÀ, Ñ×ÌÑÅÔÓÑ ÌÉ ÏÓÌÅ ÄÏ×ÁÔÅÌØÎÏÓÔØ [x0 ; : : : ; xn 1 ℄ ÎÅÕÂÙ×ÁÀÝÅÊ. äÒÕÇÉÍÉ ÓÌÏ×ÁÍÉ, ÔÒÅ ÂÕÅÔÓÑ ÒÏ×ÅÒÉÔØ, ×ÅÒÎÏ ÌÉ, ÞÔÏ xk 6 xk+1 ÄÌÑ ×ÓÅÈ k ÉÚ ÄÉÁÁÚÏÎÁ 0 6 k 6 n 2. É ÆÕÎË ÉÉ nonde ÔÁËÏ×
nonde :: Ord a => [a℄ -> Bool ëÏÎÅÞÎÏ, ÜÔÁ ÆÕÎË ÉÑ ÄÏÕÓËÁÅÔ ÒÅËÕÒÓÉ×ÎÏÅ ÏÒÅÄÅÌÅÎÉÅ, ÏÄÎÁËÏ ÏÚÎÁËÏÍØÔÅÓØ Ó ÅÅ ÏÒÅÄÅÌÅÎÉÅÍ ÞÅÒÅÚ ÆÕÎË ÉÀ zip:
nonde xs = and ( map leq (zip xs (tail xs))) where leq (x, y) = x <= y
126
VI. óÔÒÕËÔÕÒÙ ÄÁÎÎÙÈ
îÁÏÍÎÉÍ, ÞÔÏ ÆÕÎË ÉÑ and ÂÅÒÅÔ ÓÉÓÏË ÉÚ ÌÏÇÉÞÅÓËÉÈ ×ÅÌÉÞÉÎ É ×ÏÚ×ÒÁÝÁÅÔ True, ÅÓÌÉ ×ÓÅ ÏÎÉ ÒÁ×ÎÙ True, É False × ÒÏÔÉ×ÏÏ ÌÏÖÎÏÍ ÓÌÕÞÁÅ. ä×Á ÅÅ ÏÒÅÄÅÌÅÎÉÑ ÒÁÓÓÍÏÔÒÅÎÙ ÎÁ ÓÔÒÁÎÉ ÁÈ 117 É 121. ÷ÙÒÁÖÅÎÉÅ zip xs (tail xs) ×ÏÚ×ÒÁÝÁÅÔ ÓÉÓÏË ÁÒ ÓÏÓÅÄ ÎÉÈ ÜÌÅÍÅÎÔÏ× ÓÉÓËÁ. ÷ ÞÁÓÔÎÏÓÔÉ, ÉÚ ÌÅÎÉ×ÏÓÔÉ ×ÙÞÉÓÌÅÎÉÊ ÓÌÅ ÄÕÅÔ, ÞÔÏ
zip [ ℄ (tail [ ℄) = [ ℄ zip [x℄ (tail [x℄) = zip [x℄ [ ℄ = [ ℄ úÁÍÅÔÉÍ ÔÁËÖÅ, ÞÔÏ ÆÕÎË ÉÑ leq ÅÓÔØ ÎÅËÁÒÒÉÎÇÏ×ÁÑ ÆÏÒÍÁ ÏÅ ÒÁÔÏÒÁ ÓÒÁ×ÎÅÎÉÑ ¾ÍÅÎØÛÅ ÉÌÉ ÒÁ×ÎÏ¿, Ô. Å. leq = un urry (<=).
J
üÔÉ ÒÉÍÅÒÙ ÒÏÉÌÌÀÓÔÒÉÒÏ×ÁÌÉ, ÞÔÏ ËÏÍÂÉÎÁ ÉÉ map, filter É zip ÍÏÇÕÔ ÒÉÍÅÎÑÔØÓÑ × ÓÁÍÙÈ ÒÁÚÌÉÞÎÙÈ ×ÁÒÉÁÎÔÁÈ. äÌÑ ÔÏÇÏ ÞÔÏÂÙ ÓÄÅÌÁÔØ ÏÒÅÄÅÌÅÎÉÑ ËÏÒÏÞÅ ÍÏÖÎÏ ××ÅÓÔÉ ÆÕÎË ÉÀ zipWith ÓÌÅÄÕÀÝÉÍ ÏÂÒÁÚÏÍ:
zipWith :: ( a -> b -> ) -> ([a℄ -> [b℄ ->[ ℄) zipWith f [℄ ys = [℄ zipWith f xs [℄ = [℄ zipWith f (x:xs) (y:ys) = f x y : zipWith f xs ys îÁÒÉÍÅÒ,
sp xs ys = sum (zipWith (*) xs ys) nonde xs = and (zipWith (<=) xs (tail xs)) äÌÑ ÅÝÅ ÂÏÌØÛÅÊ ËÒÁÔËÏÓÔÉ ÍÙ ÍÏÖÅÍ ××ÅÓÔÉ ÎÅËÁÒÒÉÎÇÏ×ÕÀ ×ÅÒ ÓÉÀ zip É zipWith:
zipp ::([a℄, [b℄) ->[(a, b)℄ zipp = un urry zip zippWith :: (a -> b -> ) -> ([a℄, [b℄) -> [ ℄ zippWith f = map (un urry f) . zipp äÌÑ spp, ÎÅËÁÒÒÉÎÇÏ×ÏÊ ×ÅÒÓÉÉ sp, ÉÍÅÅÍ
spp = sum . zippWith (*) íÙ ÏÌÕÞÉÌÉ ÞÉÓÔÏ ÆÕÎË ÉÏÎÁÌØÎÏÅ ÏÒÅÄÅÌÅÎÉÅ spp: ÏÒÅÄÅÌÅ ÎÉÅ ÓÏ×ÓÅÍ ÎÅ ÓÏÄÅÒÖÉÔ ÁÒÁÍÅÔÒÏ×. îÉÖÅ ÒÉ×ÏÄÉÔÓÑ ÁÎÁÌÏÇÉÞ ÎÏÅ ÏÒÅÄÅÌÅÎÉÅ ÄÌÑ ÆÕÎË ÉÉ nonde :
nonde :: Ord a => [a℄ -> Bool nonde = and . zipWith (<=) . pair (id, tail) ÷ ÎÅÍ ÉÓÏÌØÚÕÅÔÓÑ ÆÕÎË ÉÑ pair, ÚÁÄÁÎÎÁÑ ÔÁË:
1. óÉÓËÉ
127
pair :: (a -> b, a -> ) -> a -> (b, ) pair (f, g) x = (f x, g x) unzip ÷ ÒÏÔÉ×ÏÏÌÏÖÎÏÓÔØ zip ÆÕÎË ÉÑ unzip ÒÅÏÂÒÁÚÕÅÔ ÓÉÓÏË ÁÒ × ÁÒÕ ÓÉÓËÏ×:
æÕÎË ÉÑ
unzip unzip
:: [(a, b)℄ ->([a℄, [b℄) = pair (map fst, map snd)
äÅÊÓÔ×ÉÅ ÜÔÏÊ ÆÕÎË ÉÉ ÒÏÉÌÌÀÓÔÒÉÒÕÅÍ ÒÉÍÅÒÏÍ:
---> unzip [(1, True), (2, True), (3, False)℄ ([1,2,3℄, [True,True,False℄) æÕÎË ÉÑ zipp (ÎÅËÁÒÒÉÎÇÏ×ÁÑ ×ÅÒÓÉÑ zip) É unzip Ó×ÑÚÁÎÙ ÕÒÁ×ÎÅÎÉÅÍ zipp (unzip xys) = xys:
---> zipp (unzip [(1, True), (2, True), (3, False)℄) [(1,True),(2,True),(3,False)℄
H H
ïÒÅÄÅÌÅÎÉÅ ÜÔÏÊ ÆÕÎË ÉÉ Ó ÏÍÏÝØÀ Ó×ÅÒÔËÉ ÓÒÁ×Á ÔÁËÏ×Ï:
unzip :: [(a, b)℄ -> ([a℄, [b℄) unzip = foldr onss ([ ℄, [ ℄) where onss (x, y) (xs, ys) = (x:xs, y:ys)
óËÁÎÉÒÏ×ÁÎÉÅ ÓÌÅ×Á
éÎÏÇÄÁ ×ÏÚÎÉËÁÅÔ ÚÁÄÁÞÁ ÒÉÍÅÎÅÎÉÑ ÆÕÎË ÉÉ foldl Ë ËÁÖÄÏ ÍÕ ÎÁÞÁÌØÎÏÍÕ ÓÅÇÍÅÎÔÕ ÓÉÓËÁ. üÔÁ ÚÁÄÁÞÁ ÒÅÛÁÅÔÓÑ Ó ÏÍÏÝØÀ ÆÕÎË ÉÉ ¾ÓËÁÎÉÒÏ×ÁÎÉÑ ÓÌÅ×Á¿ s anl.
s anl () e [x1 ; x2 ; : : : ; xn 1 ; xn ℄℄ = [e; ex1 ; (ex1 )x2 ; : : : ; ((: : : (ex1 )x2 : : : xn 1 )xn ℄ ÇÄÅ
ÂÉÎÁÒÎÙÊ ÏÅÒÁÔÏÒ, Á e ÓÔÁÒÔÏ×ÏÅ ÚÎÁÞÅÎÉÅ.
÷ ÞÁÓÔÎÏÓÔÉ, s anl (+) 0 ×ÙÞÉÓÌÑÅÔ ÓÉÓÏË ÞÁÓÔÉÞÎÙÈ ÓÕÍÍ ÓÉÓ ËÁ ÞÉÓÅÌ, Á s snl (*) 1 [1 .. n℄ ×ÙÞÉÓÌÑÅÔ ÓÉÓÏË ÅÒ×ÙÈ n ÆÁËÔÏÒÉÁÌÏ× ÞÉÓÅÌ:
---> s anl (+) 0 [1, 1, 1, 1℄ [0, 1, 2, 3, 4℄ ---> s anr (*) 1 [1 .. 5℄ [120, 120, 60, 20, 5, 1℄
H
128
VI. óÔÒÕËÔÕÒÙ ÄÁÎÎÙÈ
÷ ÜÔÏÍ ÒÁÚÄÅÌÅ ÍÙ ÒÁÓÓÍÏÔÒÉÍ Ä×Á ÏÒÅÄÅÌÅÎÉÑ ÜÔÏÊ ÆÕÎË ÉÉ: ÅÒ×ÏÅ ÑÓÎÏÅ, É ×ÔÏÒÏÅ ÜÆÆÅËÔÉ×ÎÏÅ. äÌÑ ÅÒ×ÏÊ ÒÏÇÒÁÍÍÙ ÎÁÍ ÔÒÅÂÕÅÔÓÑ ÆÕÎË ÉÑ inits, ×ÏÚ×ÒÁ ÝÁÀÝÕÀ ÓÉÓÏË ÎÁÞÁÌØÎÙÈ ÓÅÇÍÅÎÔÏ× ÓÉÓËÁ. ÁË ÄÌÑ ÓÉÓËÁ, ÓÏ ÓÔÏÑÝÅÇÏ ÉÚ ÔÒÅÈ ÜÌÅÍÅÎÔÏ×, ÄÏÌÖÎÏ ×ÙÏÌÎÑÔØÓÑ ÓÌÅÄÕÀÝÅÅ ÓÏ ÏÔÎÏÛÅÎÉÅ:
H
inits [x0 , x1 , x2 ℄ = [[ ℄, [x0 ℄, [x0 , x1 ℄, [x0 , x1 , x2 ℄℄. ðÕÓÔÏÊ ÓÉÓÏË ÓÏÓÔÏÉÔ ÔÏÌØËÏ ÉÚ ÏÄÎÏÇÏ ÓÅÇÍÅÎÔÁ, ÔÁËÖÅ Ñ×ÌÑ ÀÝÅÇÏÓÑ ÕÓÔÙÍ ÓÉÓËÏÍ. òÅÚÕÌØÔÁÔ ÒÉÍÅÎÅÎÉÑ ÆÕÎË ÉÉ inits Ë ÓÉÓËÕ ×ÉÄÁ (x:xs) ÓÏÄÅÒÖÉÔ ÕÓÔÏÊ ÓÉÓÏË × ËÁÞÅÓÔ×Å ÓÁÍÏÇÏ ËÏÒÏÔËÏÇÏ ÓÅÇÍÅÎÔÁ, Á ×ÓÅ ÄÒÕÇÉÅ ÎÁÞÁÌØÎÙÅ ÓÅÇÍÅÎÔÙ ÎÁÞÉÎÁÀÔ ÓÑ Ó x É ÓÏÄÅÒÖÁÔ ×ÓÅ ÎÁÞÁÌØÎÙÅ ÓÅÇÍÅÎÔÙ xs. óÏÏÔ×ÅÔÓÔ×ÕÀÝÅÅ ÒÅËÕÒÓÉ×ÎÏÅ ÏÒÅÄÅÌÅÎÉÅ ÔÁËÏ×Ï:
inits :: [a℄ -> [[a℄℄ inits [ ℄ = [[ ℄℄ inits (x:xs) = [ ℄ : map (x:) (inits xs) õÂÅÄÉÍÓÑ × ËÏÒÒÅËÔÎÏÓÔÉ ÎÁÛÅÇÏ ÏÒÅÄÅÌÅÎÉÑ:
---> inits [1,2,3,4℄ [[℄,[1℄,[1,2℄,[1,2,3℄,[1,2,3,4℄℄ ÅÅÒØ ÍÏÖÎÏ ÄÁÔØ ÏÒÅÄÅÌÅÎÉÅ ÆÕÎË ÉÉ s anl:
s anl :: (a -> b -> a) -> a -> [b℄ -> [a℄ s anl f e = map (foldl f e ) . inits
I õÒÁÖÎÅÎÉÅ VI.1.11
ðÏÄÇÏÔÏ×ØÔÅ ÓËÒÉÔ, ÓÏÄÅÒÖÁÝÉÊ ÒÉ×ÅÄÅÎÎÏÅ ×ÙÛÅ ÏÒÅÄÅÌÅ ÎÉÅ ÆÕÎË ÉÉ s anl. îÅ ÚÁÂÕÄØÔÅ, ÞÔÏ ÏÒÅÄÅÌÅÎÉÅ ÜÔÏÊ ÆÕÎË ÉÉ ×ËÌÀÞÅÎÏ × ÒÅÌÀÄÉÀ. ðÏÌÕÞÉÔÅ ÓÉÓÏË ÓÕÍÍ ÞÉÓÅÌ ÏÔ 1 ÄÏ 20 É ÓÉÓÏË ÆÁËÔÏÒÉÁÌÏ× ÏÔ 1 ÄÏ 20.
J
òÁÓÓÍÏÔÒÅÎÎÁÑ ÒÅÁÌÉÚÁ ÉÑ s anl ÓÏÏÔ×ÅÔÓÔ×ÕÅÔ ÏÒÅÄÅÌÅÎÉÀ ÆÕÎË ÉÉ, ÎÏ ÒÉ×ÏÄÉÔ Ë ÎÅÜÆÆÅËÔÉ×ÎÏÊ ÒÏÇÒÁÍÍÅ. æÕÎË ÉÑ f ÒÉÍÅÎÑÅÔÓÑ k ÒÁÚ ×Ï ×ÒÅÍÑ ×ÙÞÉÓÌÅÎÉÑ foldl f e ÄÌÑ ÓÉÓËÁ ÄÌÉ ÎÙ k, Á ÔÁË ËÁË ÎÁÞÁÌØÎÙÅ ÓÅÇÍÅÎÔÙ ÓÉÓËÁ ÄÌÉÎÙ n ÅÓÔØ ÓÉÓËÉ, ÄÌÉÎÙ ËÏÔÏÒÙÈ ÒÁ×ÎÙ 0, 1, : : :, n, ÔÏ ÆÕÎË ÉÑ f ÒÉÍÅÎÑÅÔÓÑ ×ÓÅÇÏ n2 =2 (ÄÏËÁÖÉÔÅ!) ÒÁÚ. ÷ÅÒÓÉÑ ÜÔÏÊ ÆÕÎË ÉÉ, ÒÁÚÍÅÝÅÎÎÁÑ × ÆÁÊÌÅ Prelude.hs, ÍÅÎÅÅ ÏÎÑÔÎÁ, ÎÏ ÚÎÁÞÉÔÅÌØÎÏ ÜÆÆÅËÔÉ×ÎÅÅ:
s anl f e [ ℄ = [e℄ s anl f e (x:xs) = e: s anl f (f e x ) xs
1. óÉÓËÉ
129
üÔÁ ÒÏÇÒÁÍÍÁ ÂÏÌÅÅ ÜÆÆÅËÔÉ×ÎÁ ÏÔÏÍÕ, ÞÔÏ ÆÕÎË ÉÑ f ÒÉÍÅ ÎÑÅÔÓÑ ÔÏÞÎÏ n ÒÁÚ ÄÌÑ ÓÉÓËÁ ÄÌÉÎÙ n. óËÁÎÉÒÏ×ÁÎÉÅ ÓÒÁ×Á
ä×ÏÊÓÔ×ÅÎÎÏÅ ×ÙÞÉÓÌÅÎÉÅ ÄÁÅÔ s anr, ÏÒÅÄÅÌÅÎÎÁÑ ÓÌÅÄÕÀ ÝÉÍ ÏÂÒÁÚÏÍ:
s anr f e = map (foldr f e) . tails æÕÎË ÉÑ tails ×ÏÚ×ÒÁÝÁÅÔ È×ÏÓÔÏ×ÙÅ ÓÅÇÍÅÎÔÙ ÓÉÓËÁ. îÁÒÉ ÍÅÒ,
tails [x0 , x1 , x2 ℄ = [ [x0 , x1 , x2 ℄, [x1 , x2 ℄, [x2 ℄, [ ℄℄ úÁÍÅÔÉÍ, ÞÔÏ inits ÒÏÉÚ×ÏÄÉÔ ÓÉÓÏË ÎÁÞÁÌØÎÙÈ ÓÅÇÍÅÎÔÏ× Ó ×ÏÚ ÒÁÓÔÁÀÝÅÊ ÄÌÉÎÏÊ, Á tails È×ÏÓÔÏ×ÙÅ ÓÅÇÍÅÎÔÙ ÕÂÙ×ÁÀÝÅÊ ÄÌÉ ÎÙ. íÙ ÏÒÅÄÅÌÉÍ tails ÔÁË tails [℄ = [[℄℄ tails (x:xs) = (x:xs) : tails xs ðÒÉÍÅÎÉÍ ÅÅ Ë ÓÉÓËÕ, ÓÏÓÔÏÑÝÅÍÕ ÉÚ ÔÒÅÈ ÜÌÅÍÅÎÔÏ×:
---> tails [1,2,3℄ [[1,2,3℄, [2,3℄, [3℄, [℄℄ òÅËÕÒÓÉ×ÎÏÅ ÏÒÅÄÅÌÅÎÉÅ ÆÕÎË ÉÉ s anr ÍÏÖÅÔ ÂÙÔØ, ÎÁÒÉ ÍÅÒ, ÔÁËÉÍ
s anr f e [ ℄ = [e℄ s anr f e (x:xs) = f x (head ys) : ys where ys = s anr f e xs ðÏÓÍÏÔÒÉÍ ÎÁ ÒÅÚÕÌØÔÁÔ ÅÅ ÒÉÍÅÎÅÎÉÑ:
---> s anr (*) 1 [1 .. 5℄ [120,120,60,20,5,1℄
H
H
óËÁÎÉÒÏ×ÁÎÉÅ ÂÅÚ ÕÓÔÙÈ ÓÉÓËÏ×
ðÏ ÁÎÁÌÏÇÉÉ Ó ÆÕÎË ÉÑÍÉ foldr1 É foldl1 ÍÙ ÍÏÖÅÍ ÏÒÅÄÅ ÌÉÔØ ÅÝÅ ÁÒÕ ÓËÁÎÉÒÕÀÝÉÈ ÓÉÓÏË ÆÕÎË ÉÊ s anl1 É s anr1.
s anl1 f = map (foldl1 f) . inits1 s anr1 f = map (foldr1 f) . tails1
ÎÅÕÓÔÙÅ ÎÁÞÁÌØÎÙÅ É ËÏÎÅÞ
úÄÅÓØ inits1 É tails1 ×ÏÚ×ÒÁÝÁÀÔ ÎÙÅ ÓÅÇÍÅÎÔÙ ÎÅÕÓÔÙÈ ÓÉÓËÏ×. îÁÒÉÍÅÒ,
inits1 (x:xs) = map (x:) (inits xs)
130
VI. óÔÒÕËÔÕÒÙ ÄÁÎÎÙÈ
I õÒÁÖÎÅÎÉÅ VI.1.12
ïÒÅÄÅÌÉÔÅ ÆÕÎË ÉÀ tails1.
J
éÓÏÌØÚÕÑ ÔÏÔ ÆÁËÔ, ÞÔÏ foldl1 f . (x:) = foldl f x, ÏÌÕÞÉÍ ÂÏÌÅÅ ÜÆÆÅËÔÉ×ÎÏÅ ÏÒÅÄÅÌÅÎÉÅ ÆÕÎË ÉÉ s anl1:
s anl1 :: (a -> a -> a) -> [a℄ ->[a℄ s anl1 f (x:xs) = s anl f x xs óÏÓÔÁ×ÌÅÎÉÅ ÂÏÌÅÅ ÜÆÆÅËÔÉ×ÎÏÊ ×ÅÒÓÉÉ s anr1 ÒÅÄÌÁÇÁÅÔÓÑ × ËÁ ÞÅÓÔ×Å ÕÒÁÖÎÅÎÉÑ.
÷ÏÒÏÓÙ É ÚÁÄÁÎÉÑ VI.1.1
ðÕÓÔØ ÉÍÅÀÔÓÑ ÔÒÉ ÓÉÓËÁ xs, ysÉ zs. ïÂßÅÄÉÎÉÔÅ ÜÔÉ ÓÉÓËÉ ÒÉ ÏÍÏÝÉ ÆÕÎË ÉÊ ++ É on at. ñ×ÌÑÅÔÓÑ ÌÉ ÏÅÒÁÔÏÒ ++ ÁÓÓÏ ÉÁ ÔÉ×ÎÙÍ ÏÅÒÁÔÏÒÏÍ? VI.1.2
÷ÙÞÉÓÌÉÔÅ map (map square) [[1,2℄, [3,4,5℄℄. VI.1.3
æÕÎË ÉÑ filter ÍÏÖÅÔ ÂÙÔØ ÏÒÅÄÅÌÅÎÁ × ÔÅÒÍÉÎÁÈ on at É map ÓÌÅÄÕÀÝÉÍ ÏÂÒÁÚÏÍ:
filter p = on at . map box where box x = ... äÁÊÔÅ ÏÒÅÄÅÌÅÎÉÅ ÄÌÑ ÆÕÎË ÉÉ box. VI.1.4
ïÒÅÄÅÌÉÔÅ ÆÕÎË ÉÀ filter p Ó ÏÍÏÝØÀ ÆÕÎË ÉÉ foldr. VI.1.5
÷ÓÏÍÎÉÍ ÏÒÅÄÅÌÅÎÉÑ ÆÕÎË ÉÊ takeWhile É dropWhile, ÒÁÓÓÍÏ ÔÒÅÎÎÙÅ ÎÁ ÓÔÒ. 124. ïÒÅÄÅÌÉÔÅ takeWhile × ÔÅÒÍÉÎÁÈ foldr. íÏÖÎÏ ÌÉ ÏÒÅÄÅÌÉÔØ dropWhile ÞÅÒÅÚ foldr? VI.1.6
ëÁËÏÅ ÉÚ Ä×ÕÈ ÓÌÅÄÕÀÝÉÈ ÏÒÅÄÅÌÅÎÉÊ ×ÅÒÎÏ?
1. óÉÓËÉ
131
foldl (-) x xs = x - sum xs foldr (-) x xs = x - sum xs VI.1.7
òÁÓÓÍÏÔÒÉÍ ÓÌÅÄÕÀÝÅÅ ÏÒÅÄÅÌÅÎÉÅ ÆÕÎË ÉÉ
insert:
insert x xs = takeWhile (<= x) xs ++ [x℄ ++ dropWhile (<= x) xs ðÏËÁÖÉÔÅ, ÞÔÏ ÅÓÌÉ ÜÌÅÍÅÎÔÙ xs ÒÁÓÏÌÏÖÅÎÙ × ÎÅÕÂÙ×ÁÀÝÅÍ Ï ÒÑÄËÅ, ÔÏ ÔÏÖÅ ÓÁÍÏÅ ×ÅÒÎÏ É ÄÌÑ insert x xs ÒÉ ÌÀÂÏÍ x. éÓ ÏÌØÚÕÊÔÅ insert ÄÌÑ ÏÒÅÄÅÌÅÎÉÑ ÆÕÎË ÉÉ isort, ËÏÔÏÒÁÑ ÓÏÒ ÔÉÒÕÅÔ ÓÉÓÏË × ÎÅÕÂÙ×ÁÀÝÅÍ ÏÒÑÄËÅ. ðÒÉÍÅÎÉÔÅ foldr. VI.1.8
æÕÎË ÉÑ remdups ÕÄÁÌÑÅÔ ËÏÉÉ ÏÄÉÎÁËÏ×ÙÈ ÓÏÓÅÄÎÉÈ ÜÌÅÍÅÎÔÏ× ÉÚ ÓÉÓËÁ. îÁÒÉÍÅÒ, remdups [1, 2, 2, 3, 3, 3, 1, 1℄ = [1, 2, 3, 1℄. ïÒÅÄÅÌÉÔÅ remdups, ÉÓÏÌØÚÕÑ foldl ÉÌÉ foldr. VI.1.9
äÁÎ ÓÉÓÏË ÞÉÓÅÌ xs=[x1, x2 , : : :, xn ℄, ÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔØ ÓÌÅ ÄÕÀÝÉÈ ÏÄÉÎ ÚÁ ÄÒÕÇÉÍ ÍÁËÓÉÍÕÍÏ× ( ) ssm xs, ÅÓÔØ ÎÁÉÂÏÌØÛÁÑ ÏÄÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔØ ×ÉÄÁ [xj1 , xj2 , : : :, xjm ℄, ÇÄÅ j1 = 1 É xj < xjk ÄÌÑ j < jk . îÁÒÉÍÅÒ, ÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔØ ÓÌÅÄÕÀÝÉÈ ÍÁËÓÉÍÕÍÏ× ÄÌÑ [3, 1, 3, 4, 9, 2, 10, 7℄ ÅÓÔØ [3, 4, 9, 10℄. ïÒÅÄÅÌÉÔÅ ssm × ÔÅÒÍÉÎÁÈ foldl.
maxima
sequen e of su
essive
VI.1.10
ðÒÅÄÌÏÖÉÔÅ ÜÆÆÅËÔÉ×ÎÕÀ ÒÏÇÒÁÍÍÕ ÄÌÑ s anr. VI.1.11
ëÁËÏÊ ÓÉÓÏË ÏÌÕÞÉÔÓÑ × ÒÅÚÕÌØÔÁÔÅ s anl (/) [1 .. n℄? VI.1.12
íÁÔÅÍÁÔÉÞÅÓËÁÑ ËÏÎÓÔÁÎÔÁ
e ÏÒÅÄÅÌÅÎÁ ËÁË e =
1 X 1
n=0 n!
. îÁÉÛÉ
ÔÅ ×ÙÒÁÖÅÎÉÅ, ËÏÔÏÒÏÅ ÍÏÖÎÏ ÉÓÏÌØÚÏ×ÁÔØ ÄÌÑ ×ÙÞÉÓÌÅÎÉÑ ÎÅËÏÔÏÒÏÊ ÒÁÚÕÍÎÏÊ ÓÔÅÅÎØÀ ÔÏÞÎÏÓÔÉ.
e
Ó
VI. óÔÒÕËÔÕÒÙ ÄÁÎÎÙÈ
132
2. áÂÓÔÒÁË ÉÉ ÓÉÓËÏ× ÷ ÔÅÏÒÉÉ ÍÎÏÖÅÓÔ× ÛÉÒÏËÏ ÒÉÍÅÎÑÅÔÓÑ ÎÏÔÁ ÉÑ ÚÁÄÁÎÉÑ ÍÎÏ ÖÅÓÔ× × ×ÉÄÅ, ÁÎÁÌÏÇÉÞÎÏÍ ÓÌÅÄÕÀÝÅÍÕ: = fx2 j x 2 N; x ÞÅÔÎÏg ðÏ ÁÎÁÌÏÇÉÉ Ó ÜÔÏÊ ÚÁÉÓØÀ, ÎÏÓÑÝÅÊ ÎÁÚ×ÁÎÉÅ ¾×ËÌÀÞÅÎÉÑ ÍÎÏÖÅÓÔ׿, Haskell ÏÚ×ÏÌÑÅÔ ÚÁÄÁ×ÁÔØ ÓÉÓËÉ ÒÉ ÏÍÏÝÉ ÔÁË ÎÁÚÙ×ÁÅÍÙÈ (ÎÁÚÙ×ÁÅÍÙÈ ÔÁËÖÅ ). ðÒÉÍÅÒÏÍ ÔÁËÏÊ ÎÏÔÁ ÉÉ Ñ×ÌÑÅÔÓÑ ×ÙÒÁÖÅÎÉÅ ×ÉÄÁ [ x*x | x <- [1 .. 10℄℄, ËÏÔÏÒÏÅ ÏÒÅÄÅÌÑÅÔ ÓÉÓÏË Ë×ÁÄÒÁÔÏ× ÅÌÙÈ ÞÉÓÅÌ, ÒÉÎÁÄÌÅÖÁÝÉÈ ÉÎÔÅÒ×ÁÌÕ ÏÔ 1 ÄÏ 10. áÂÓÔÒÁË ÉÉ ÓÉÓËÏ× ÓÏÄÅÒÖÁÔ ÎÅËÏÔÏÒÏÅ ×ÙÒÁÖÅÎÉÅ, ÒÁÚÍÅÝÅÎÎÏÅ ÓÌÅ×Á ÏÔ ×ÅÒ ÔÉËÁÌØÎÏÊ ÞÅÒÔÙ, ÒÉÞÅÍ × ÜÔÏ ×ÙÒÁÖÅÎÉÅ ÍÏÇÕÔ ×ÈÏÄÉÔØ ÅÒÅÍÅÎ ÎÙÅ. ïÇÒÁÎÉÞÅÎÉÑ ÎÁ ÜÔÉ ÅÒÅÍÅÎÎÙÅ (x × ÒÅÄÙÄÕÝÅÍ ÒÉÍÅÒÅ) ÒÁÚÍÅÝÁÀÔÓÑ ÓÒÁ×Á ÏÔ ×ÅÒÔÉËÁÌØÎÏÊ ÞÅÒÔÙ. îÏÔÁ ÉÑ x <- xs ÏÚÎÁÞÁÅÔ, áÂÓÔÒÁË ÉÉ ÓÉÓËÏ× ÞÔÏ x ÏÓÌÅÄÏ×ÁÔÅÌØÎÏ ÒÉÎÉÍÁ ×ËÌÀÞÅÎÉÑ ÅÔ ×ÓÅ ÚÎÁÞÅÎÉÑ ÉÚ ÓÉÓËÁ xs. ÍÉ ÓÉÓËÏ× äÌÑ ËÁÖÄÏÇÏ ÔÁËÏÇÏ ÚÎÁÞÅÎÉÑ x ×ÙÞÉÓÌÑÅÔÓÑ ×ÙÒÁÖÅÎÉÅ, ÒÁÚÍÅ ÝÅÎÎÏÅ ÅÒÅÄ ÞÅÒÔÏÊ. ÁË, × ÒÉ ÍÅÒÅ, ÒÉ×ÅÄÅÎÎÏÍ ×ÙÛÅ, ÏÌÕ ÞÁÅÔÓÑ ÔÁËÏÊ ÖÅ ÓÉÓÏË, ÞÔÏ É × ÒÅÚÕÌØÔÁÔÅ ×ÙÏÌÎÅÎÉÑ ËÏÍÁÎÄÙ map square [1 .. 10℄, ÇÄÅ ÆÕÎË ÉÑ square ÏÒÅÄÅÌÅÎÁ ÓÌÅÄÕÀÝÉÍ ÏÂÒÁÚÏÍ:
V
ÍÉ ÓÉÓËÏ×
×ËÌÀÞÅÎÉÊ ÓÉÓËÏ×
ÁÂÓÔÒÁË ÉÑ
, ÎÁÚÙ ×ÁÅÍÙÅ ÔÁËÖÅ , ÄÁÀÔ ÜÌÅÇÁÎÔ ÎÙÊ ÍÅÔÏÄ ÓÖÁÔÏÇÏ ÏÉÓÁÎÉÑ ÏÒÅÄÅÌÅÎÎÙÈ ÏÅÒÁ ÉÊ ÏÂÒÁ ÂÏÔËÉ ÓÉÓËÏ×.
square x = x*x
H
ðÒÅÉÍÕÝÅÓÔ×Ï ÉÓÏÌØÚÏ×ÁÎÉÑ ÁÂÓÔÒÁË ÉÊ ÓÉÓËÏ× ÓÏÓÔÏÉÔ × ÔÏÍ, ÞÔÏ ÍÏÖÎÏ ÏÂÏÊÔÉÓØ ÂÅÚ ÉÍÅÎÏ×ÁÎÉÑ ÆÕÎË ÉÉ, ËÏÔÏÒÕÀ ÔÒÅ ÂÕÅÔÓÑ ×ÙÞÉÓÌÉÔØ (× ÎÁÛÅÍ ÒÉÍÅÒÅ square). îÏÔÁ ÉÑ ÁÂÓÔÒÁË ÉÊ ÓÉÓËÁ ÏÞÅÎØ ÒÁÚÎÏÏÂÒÁÚÎÁ. ðÏÓÌÅ ×ÅÒÔÉ ËÁÌØÎÏÊ ÞÅÒÔÙ ÍÏÇÕÔ ÕËÁÚÙ×ÁÔØÓÑ ÄÉÁÁÚÏÎÙ ÉÚÍÅÎÅÎÉÑ ÎÅÓËÏÌØ ËÉÈ ÅÒÅÍÅÎÎÙÈ. ÷ÙÒÁÖÅÎÉÑ, ÒÁÚÍÅÝÅÎÎÙÅ ÄÏ ÞÅÒÔÙ, ÔÁËÖÅ ÍÏÇÕÔ ÉÍÅÔØ ÓÁÍÙÊ ÒÁÚÎÏÏÂÒÁÚÎÙÊ ×ÉÄ. îÁÒÉÍÅÒ,
---> [(x, y)| x <- [1 .. 2℄, y <- [4 .. 6℄ ℄ [(1,4), (1,5), (1,6), (2,4), (2,5), (2,6)℄ ÷ÔÏÒÁÑ ÅÒÅÍÅÎÎÁÑ ÉÚÍÅÎÑÅÔÓÑ ÂÙÓÔÒÅÅ: ÄÌÑ ËÁÖÄÏÇÏ ÚÎÁÞÅÎÉÑ x, y ÒÏÂÅÇÁÅÔ ×ÓÅ ÚÎÁÞÅÎÉÑ ÉÚ ÓÉÓËÁ [4 .. 6℄. ëÒÏÍÅ ÄÉÁÁÚÏÎÏ× ÉÚÍÅÎÅÎÉÑ ÅÒÅÍÅÎÎÙÈ ÓÒÁ×Á ÏÔ ÞÅÒÔÙ ÍÏ ÇÕÔ ÎÁÈÏÄÉÔÓÑ ÌÏÇÉÞÅÓËÉÅ ×ÙÒÁÖÅÎÉÑ (ÔÉÁ Bool). ÷ ÓÌÅÄÕÀÝÅÍ
2. áÂÓÔÒÁË ÉÉ ÓÉÓËÏ×
133
ÒÉÍÅÒÅ × ÒÅÚÕÌØÔÉÒÕÀÝÉÊ ÓÉÓÏË ÂÕÄÕÔ ÏÍÅÝÅÎÙ ÁÒÙ ÔÏÌØËÏ Ó ÞÅÔÎÙÍÉ x (ÄÌÑ ËÏÔÏÒÙÈ ÚÎÁÞÅÎÉÅ even x ÒÁ×ÎÏ True).
---> [(x, y) | x <- [1 .. 5℄, even x, y <- [1 .. x℄ ℄ [(2,1), (2,2), (4,1), (4,2), (4,3), (4,4)℄ äÌÑ ËÁÖÄÏÊ ÓÔÒÅÌÏÞËÉ (<-) ÅÒÅÍÅÎÎÁÑ, ÕËÁÚÁÎÎÁÑ Ó ÅÅ ÏÍÏ ÝØÀ, ÍÏÖÅÔ ÉÓÏÌØÚÏ×ÁÔØÓÑ ×Ï ×ÓÅÈ ÏÓÌÅÄÕÀÝÉÈ ×ÙÒÁÖÅÎÉÑÈ É × ×ÙÒÁÖÅÎÉÉ ÌÅ×ÅÅ ÞÅÒÔÙ. ÁË × ÒÉÍÅÒÅ x ÉÓÏÌØÚÕÅÔÓÑ × ÔØÀÌÅ (x, y) É × ×ÙÒÁÖÅÎÉÑÈ even x É [1 .. x℄. ïÄÎÁËÏ y ÍÏÖÅÔ ÉÓ ÏÌØÚÏ×ÁÔØÓÑ ÔÏÌØËÏ × (x, y), ÔÁË ËÁË ÅÇÏ ÏÒÅÄÅÌÅÎÉÅ ÒÁÚÍÅÝÅÎÏ ÏÓÌÅÄÎÉÍ. óÔÒÅÌÏÞËÁ (<-), ÉÓÏÌØÚÕÅÍÁÑ ×Ï ×ËÌÀÞÅÎÉÑÈ ÓÉÓËÏ×, Ñ×ÌÑÅÔ ÓÑ ÚÁÒÅÚÅÒ×ÉÒÏ×ÁÎÎÙÍ ÓÉÍ×ÏÌÏÍ ÑÚÙËÁ, Á ÎÅ ÏÅÒÁÔÏÒÏÍ. æÏÒÍÁÌØÎÏ ×ËÌÀÞÅÎÉÅ ÓÉÓËÁ ÉÍÅÀÔ ÆÏÒÍÕ [e | Q℄, ÇÄÅ e ×ÙÒÁÖÅÎÉÅ, Á Q . ë×ÁÌÉÆÉËÁÔÏÒ ÜÔÏ, ×ÏÚÍÏÖÎÏ ÕÓÔÁÑ, ÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔØ É ×ÙÒÁÖÅÎÉÊ, ÒÁÚÄÅÌÅÎÎÙÈ ÚÁÑÔÙÍÉ.
Ë×ÁÌÉÆÉËÁÔÏÒ ÇÅÎÅÒÁÔÏÒÏ× ÏÈÒÁÎÎÙÈ
ðÒÁ×ÉÌÏ ÇÅÎÅÒÁ ÉÉ
[e | x <- xs, Q℄ = on at (map f xs) where f x = [e | Q℄ [e | p, Q℄
ïÈÒÁÎÎÏÅ ÒÁ×ÉÌÏ
= if p then [e | Q℄ else [ ℄
çÅÎÅÒÁÔÏÒÙ ÉÍÅÀÔ ÆÏÒÍÕ x <- xs, ÇÄÅ x ÅÓÔØ ÅÒÅÍÅÎÎÁÑ ÉÌÉ ËÏÒÔÅÖ ÅÒÅÍÅÎÎÙÈ, Á xs ÓÉÓÏË. ïÈÒÁÎÎÏÅ ×ÙÒÁÖÅÎÉÅ ÜÔÏ ÎÅËÏÔÏÒÏÅ ÌÏÇÉÞÅÓËÏÅ ÕÓÌÏ×ÉÅ. ë×ÁÌÉÆÉËÁÔÏÒ Q ÍÏÖÅÔ ÂÙÔØ Õ ÓÔÙÍ, × ÜÔÏÍ ÓÌÕÞÁÅ ÍÙ ÚÁÉÛÅÍ ÒÏÓÔÏ [e℄. éÓÏÌØÚÕÑ ÜÔÉ ÒÁ×ÉÌÁ, ÍÙ ÍÏÖÅÍ ×ÙÞÉÓÌÉÔØ = =
= =
[x * x | x <- [1 .. 5℄, odd x℄ {ÒÁ×ÉÌÏ ÇÅÎÅÒÁ ÉÉ}
on at (map f [ 1 .. 5℄) where f x = [x*x| odd x℄ {ÏÈÒÁÎÎÏÅ ÒÁ×ÉÌÏ }
on at (map f [ 1 .. 5℄) where f x = if odd x then [x*x℄ else [ ℄ { ÒÉÍÅÎÅÎÉÅ map }
on at [[1℄, [ ℄, [9℄, [ ℄, [25℄℄ { ÒÉÍÅÎÅÎÉÅ on at } [1, 9, 25℄
H
134
VI. óÔÒÕËÔÕÒÙ ÄÁÎÎÙÈ
I õÒÁÖÎÅÎÉÅ VI.2.1
H
H H
H H
÷ÙÏÌÎÉÔÅ ÎÅÓËÏÌØËÏ ËÏÍÁÎÄ, ÓÏÄÅÒÖÁÝÉÈ ÁÂÓÔÒÁË ÉÉ ÓÉÓËÏ×:
---> [(a, b) | a <- [1 .. 3℄, b <- [1 ..2℄℄ [(1,1),(1,2),(2,1),(2,2),(3,1),(3,2)℄ ---> [(a, b) | a <- [1 .. 2℄, b <- [1 ..3℄℄ [(1,1),(1,2),(1,3),(2,1),(2,2),(2,3)℄ ëÁË ÇÅÎÅÒÁÔÏÒÙ ÍÏÇÕÔ ÚÁ×ÉÓÅÔØ ÏÔ ÅÒÅÍÅÎÎÙÈ ÏËÁÚÙ×ÁÅÔ ÓÌÅÄÕ ÀÝÉÊ ÒÉÍÅÒ:
---> [(i, j) | i <- [1 .. 4℄, j <- [i+1 .. 4℄℄ [(1,2),(1,3),(1,4),(2,3),(2,4),(3,4)℄ íÙ ÍÏÖÅÍ ÌÅÇËÏ ÒÁÚÎÏÏÂÒÁÚÉÔØ ÇÅÎÅÒÁÔÏÒÙ Ó ÏÍÏÝØÀ ÏÈÒÁÎÎÙÈ ÕÓÌÏ×ÉÊ:
---> [(i, j)| i <- [1..4℄, even i, j <- [i+1..4℄, odd j℄ [(2,3)℄ ÷ ÓÌÅÄÕÀÝÅÍ ÒÉÍÅÒÅ ÇÅÎÅÒÁÔÏÒ ÉÍÅÅÔ ÆÏÒÍÕ (x, y) <- xs. óÎÁ ÞÁÌÁ ÒÁÚÍÅÓÔÉÍ × ÓËÒÉÔÅ ÏÒÅÄÅÌÅÎÉÅ ÓÉÓËÁ ÁÒ:
pairs = [(i, j) | i <- [ 1 .. 2℄, j <- [1 .. 3℄℄ ðÏÓÌÅ ÚÁÇÒÕÚËÉ ÓËÒÉÔÁ ÍÏÖÎÏ ÉÓÏÌØÚÏ×ÁÔØ ÜÔÏÔ ÓÉÓÏË × ÒÁÚÌÉÞ ÎÙÈ ÇÅÎÅÒÁÔÏÒÁÈ:
---> [i+j | (i,j) <- pairs℄ [2,3,4,3,4,5℄
J
÷ ËÁÞÅÓÔ×Å ÂÏÌÅÅ ÉÎÔÅÒÅÓÎÏÇÏ ÒÉÍÅÒÁ ÒÁÓÓÍÏÔÒÉÍ ÒÏÇÒÁÍÍÕ, ÄÁÀÝÕÀ ÓÉÓÏË ÉÆÁÇÏÒÏ×ÙÈ ÔÒÏÅË × ÄÁÎÎÏÍ ÄÉÁÁÚÏÎÅ.
---> triads 13 [(3,4,5),(4,3,5),(5,12,13),(6,8,10),(8,6,10),(12,5,13)℄ ðÉÆÁÇÏÒÏ×ÙÍÉ ÔÒÏÊËÁÍÉ ÎÁÚÙ×ÁÀÔ ËÏÒÔÅÖÉ ÞÉÓÅÌ (x, y, z) ÔÁ ËÉÈ ÞÔÏ, x2 + y 2 = z 2 . íÙ ÏÒÅÄÅÌÉÍ ÆÕÎË ÉÀ triads ÔÁË:
triads :: Int -> [(Int, Int, Int)℄ triads n = [(x,y,z) | (x,y,z) <- triples n, pyth (x,y,z)℄ triples :: Int -> [(Int, Int, Int)℄ triples n = [(x,y,z) | x <- [1..n℄, y <- [1..n℄, z <- [1..n℄℄ pyth :: (Int, Int, Int) -> Bool pyth (x,y,z) = (x*x + y*y == z*z)
2. áÂÓÔÒÁË ÉÉ ÓÉÓËÏ×
135
ÁË ËÁË triads ÎÁÈÏÄÉÔ ÏÄÎÉ É ÔÅ ÖÅ ÔÒÉÁÄÙ Ä×ÕÍÑ ÒÁÚÌÉÞÎÙÍÉ ÕÔÑÍÉ, ÔÏ ÓÌÅÄÕÀÝÅÅ ÏÒÅÄÅÌÅÎÉÅ ÆÕÎË ÉÉ triples ÌÕÞÛÅ:
triples n = [(x,y,z)|x<-[1..n℄, y<-[x..n℄, z<-[y..n℄℄
÷ ÎÏ×ÏÍ ÏÒÅÄÅÌÅÎÉÉ y ÎÁÈÏÄÉÔÓÑ × ÄÉÁÁÚÏÎÅ x 6 y 6 n, Á ×ÅÌÉ ÞÉÎÁ z × ÄÉÁÁÚÏÎÅ y 6 z 6 n, ÔÁËÉÍ ÏÂÒÁÚÏÍ z ÎÅ ÍÏÖÅÔ ÂÙÔØ ÍÅÎØÛÅ, ÞÅÍ ÎÁÉÂÏÌØÛÅÅ ÚÎÁÞÅÎÉÅ ÓÒÅÄÉ x É y. ÷ÓÅ ÔÒÉÁÄÙ ÔÅÅÒØ ÂÕÄÕÔ ×ÓÔÒÅÞÁÔØÓÑ ÔÏÌØËÏ ÏÄÉÎ ÒÁÚ. îÁÒÉÍÅÒ,
---> triads 13 [(3,4,5),(5,12,13),(6,8,10)℄
H
áÂÓÔÒÁË ÉÉ ÓÉÓËÏ× ÏÂÅÓÅÞÉ×ÁÀÔ ÚÁÍÁÎÞÉ×ÕÀ ÁÌØÔÅÒÎÁÔÉ×Õ ÓÔÉÌÀ, ÏÓÎÏ×ÁÎÎÏÍÕ ÎÁ ËÏÍÂÉÎÉÒÏ×ÁÎÉÉ map, filter É on at. óÒÅ ÄÉ ÒÁ×ÉÌ, Ó×ÑÚÙ×ÁÀÝÉÈ ÜÔÉ ÍÅÔÏÄÙ, ÏÔÍÅÔÉÍ ÓÌÅÄÕÀÝÉÅ:
[ f x | x <- xs℄
= map f xs
[ x | x <- xs, p x℄
= filter p xs
[ e | Q, p℄
= on at [[ e | p ℄ | Q℄
[ e | Q, x <- [ d | P℄℄ = [e[x:=d℄ | Q, P℄ ÷ ÏÓÌÅÄÎÅÍ ÕÒÁ×ÎÅÎÉÉ e[x:=d℄ ÏÂÏÚÎÁÞÁÅÔ ×ÙÒÁÖÅÎÉÅ, ËÏÔÏÒÏÅ ÏÌÕÞÁÅÔÓÑ, ÅÓÌÉ ×ÓÅ ×ÈÏÖÄÅÎÉÑ x × ×ÙÒÁÖÅÎÉÅ e ÚÁÍÅÎÉÔØ ÎÁ d (ÏÄÓÔÁÎÏ×ËÁ). óÔÒÏÇÏ ÇÏ×ÏÒÑ, ÎÏÔÁ ÉÑ ÁÂÓÔÒÁË ÉÉ ÓÉÓËÏ× Ñ×ÌÑÅÔÓÑ ÉÚÌÉÛ ÎÅÊ. ÷ÅÄØ ÔÁËÉÈ ÖÅ ÜÆÆÅËÔÏ× ÍÏÖÎÏ ÄÏÂÉÔØÓÑ Ó ÉÓÏÌØÚÏ×ÁÎÉÅÍ ËÏÍÂÉÎÁ ÉÊ ÔÁËÉÈ ÆÕÎË ÉÊ, ËÁË map, filter É on at. ÅÍ ÎÅ ÍÅ ÎÅÅ, ÏÓÏÂÅÎÎÏ × ÓÌÏÖÎÙÈ ÓÌÕÞÁÑÈ, ×ËÌÀÞÅÎÉÑ ÓÉÓËÏ× ÚÎÁÞÉÔÅÌØÎÏ ÌÅÇÞÅ ÄÌÑ ÏÎÉÍÁÎÉÑ. îÉÖÅ ÓÉÓÏË ÁÒ ÏÌÕÞÅÎ Ä×ÕÍÑ ÓÏÓÏÂÁÍÉ: ÂÅÚ ÁÂÓÔÒÁË ÉÉ ÓÉÓËÏ× É Ó ÉÈ ÒÉÍÅÎÅÎÉÅÍ:
---> on at (map f (filter even [1 .. 5℄)) where f x = map g [1 .. x℄ where g y = (x, y) [(2,1), (2,2), (4,1), (4,2), (4,3), (4,4)℄ ---> [(x, y)| x <- [1 .. 5℄, even x, y <- [1 .. x℄ ℄ [(2,1), (2,2), (4,1), (4,2), (4,3), (4,4)℄ úÁÍÅÔØÔÅ, ÞÔÏ ÅÒ×ÁÑ ÚÁÉÓØ ÕÖÅ ÎÅ ÍÏÖÅÔ ÓÞÉÔÁÔØÓÑ ÉÎÔÕÉÔÉ× ÎÏ ÑÓÎÏÊ. éÎÔÅÒÒÅÔÁÔÏÒ ÖÅ ÎÅÏÓÒÅÄÓÔ×ÅÎÎÏ ÅÒÅ×ÏÄÉÔ ÎÏÔÁ ÉÀ ÁÂÓÔÒÁË ÉÉ ÓÉÓËÏ× × ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÉÅ ×ÙÒÁÖÅÎÉÑ Ó ÉÓÏÌØÚÏ×Á ÎÉÅÍ map, filter É on at. ÁËÉÍ ÏÂÒÁÚÏÍ, ÁÂÓÔÒÁË ÉÑ ÓÉÓËÏ×
H
136
VI. óÔÒÕËÔÕÒÙ ÄÁÎÎÙÈ
ÅÓÔØ ÒÏÓÔÏ ÓÒÅÄÓÔ×Ï, ÏÚ×ÏÌÑÀÝÅÅ ÓÄÅÌÁÔØ ÔÅËÓÔ ÏÒÅÄÅÌÅÎÉÑ ÂÏ ÌÅÅ ÏÎÑÔÎÙÍ, Á ÒÏ ÅÓÓ ÒÁÚÒÁÂÏÔËÉ ÒÏÇÒÁÍÍ ÂÏÌÅÅ ÒÏÓÔÙÍ. ÷Ù ÂÏÒ ÍÅÖÄÕ ×ËÌÀÞÅÎÉÑÍÉ ÓÉÓËÏ× É ÓÔÉÌÅÍ ËÏÍÂÉÎÉÒÏ×ÁÎÉÑ map É filter ÏÒÅÄÅÌÑÅÔÓÑ ÒÅÄÏÞÔÅÎÉÑÍÉ ÏÌØÚÏ×ÁÔÅÌÑ.
÷ÏÒÏÓÙ É ÚÁÄÁÎÉÑ VI.2.1
ïÒÅÄÅÌÉÔÅ ÆÕÎË ÉÀ pairs ÔÁËÕÀ, ÞÔÏ pairs n ÅÓÔØ ÓÉÓÏË ×ÓÅÈ ÒÁÚÌÉÞÎÙÈ ÁÒ ÞÉÓÅÌ × ÉÎÔÅÒ×ÁÌÅ 1 6 x; y 6 n. VI.2.2
îÁÉÛÉÔÅ ÒÏÇÒÁÍÍÕ, ÎÁÈÏÄÑÝÕÀ ×ÓÅ ÒÁÚÌÉÞÎÙÅ ÞÅÔ×ÅÒËÉ (a; b; ; d) × ÄÉÁÁÚÏÎÅ 0 < a; b; ; d 6 n ÔÁËÉÅ, ÞÔÏ a2 + b2 = 2 + d2 . VI.2.3
ðÒÅÏÂÒÁÚÕÊÔÅ ÓÌÅÄÕÀÝÉÅ ×ËÌÀÞÅÎÉÑ ÓÉÓËÏ× × ÓÔÉÌØ ËÏÍÂÉÎÉÒÏ ×ÁÎÉÑ ÆÕÎË ÉÊ map, filter É on at
[(x, y) | x <- [1 .. n℄, odd x, y <- [1 ..n℄℄ [(x, y) | x <- [1 .. n℄, y <- [1 ..n℄, odd x℄
3. âÅÓËÏÎÅÞÎÙÅ ÓÉÓËÉ 3.1. óÏÚÄÁÎÉÅ ÂÅÓËÏÎÅÞÎÙÈ ÓÉÓËÏ×
þÉÓÌÏ ÜÌÅÍÅÎÔÏ× × ÓÉÓËÅ ÍÏÖÅÔ ÂÙÔØ ÂÅÓËÏÎÅÞÎÙÍ. óÌÅÄÕÀ ÝÁÑ ÆÕÎË ÉÑ from ÔÅÏÒÅÔÉÞÅÓËÉ ÍÏÖÅÔ ÉÓÏÌØÚÏ×ÁÔØÓÑ ÄÌÑ ÏÌÕ ÞÅÎÉÑ ÔÁËÏÇÏ ÓÉÓËÁ:
from n = n: from (n+1) ëÏÎÅÞÎÏ, ËÏÍØÀÔÅÒ ÎÅ ÓÕÍÅÅÔ ×ÙÄÁÔØ ÂÅÓËÏÎÅÞÎÙÊ ÓÉÓÏË ÜÌÅÍÅÎ ÔÏ×. æÁËÔÉÞÅÓËÉ ÍÙ ÍÏÖÅÍ ÎÁÂÌÀÄÁÔØ ÔÏÌØËÏ ÅÇÏ ÎÁÞÁÌÏ. åÓÌÉ ÎÅ ÒÅÒ×ÁÔØ ÒÁÂÏÔÕ ÆÕÎË ÉÉ, ÎÁÖÁ× ËÏÍÂÉÎÁ ÉÀ ËÌÁ×ÉÛ , ÔÏ ÒÏ ÅÓÓ ×ÙÞÉÓÌÅÎÉÑ ÂÕÄÅÔ ÒÏÄÏÌÖÁÔØÓÑ É ÒÏÄÏÌÖÁÔØÓÑ:
Ctrl+C
H
---> from 5 [5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24, {Interrupted!}
3. âÅÓËÏÎÅÞÎÙÅ ÓÉÓËÉ
137
âÅÓËÏÎÅÞÎÙÊ ÓÉÓÏË ÉÓÏÌØÚÕÅÔÓÑ × ËÁÞÅÓÔ×Å ÒÏÍÅÖÕÔÏÞÎÏÇÏ ÒÅ ÚÕÌØÔÁÔÁ, × ÔÏ ×ÒÅÍÑ ËÁË ÏËÏÎÞÁÔÅÌØÎÙÊ ÒÅÚÕÌØÔÁÔ ÂÕÄÅÔ ËÏÎÅÞ ÎÙÍ. ðÒÏÉÌÌÀÓÔÒÉÒÕÅÍ ÓËÁÚÁÎÎÏÅ ÓÌÅÄÕÀÝÉÍ ÒÉÍÅÒÏÍ. ðÕÓÔØ ÔÒÅÂÕÅÔÓÑ ÎÁÊÔÉ ×ÓÅ ÓÔÅÅÎÉ ÞÉÓÌÁ ÔÒÉ, ÎÅ ÒÅ×ÙÛÁÀÝÉÅ 1000. ðÅÒ×ÙÅ ÄÅÓÑÔØ ÓÔÅÅÎÅÊ ÍÙ ÍÏÖÅÍ ÎÁÊÔÉ Ó ÏÍÏÝØÀ ×ÙÚÏ×Á:
---> map (3^) [1 .. 10℄ [3,9,27,81,243,729,2187,6561,19683,59049℄
H
üÌÅÍÅÎÔÙ ÏÌÕÞÅÎÎÏÇÏ ÓÉÓËÁ, ÎÅ ÒÅ×ÙÛÁÀÝÉÅ 1000, ÎÁÊÄÅÍ ÔÁË:
---> takeWhile (<1000) (map (3^) [1 .. 10℄) [3,9,27,81,243,729℄ îÏ ËÁË ÍÙ ÍÏÇÌÉ ÚÁÒÁÎÅÅ ÂÙÔØ Õ×ÅÒÅÎÙ × ÔÏÍ, ÞÔÏ ÄÅÓÑÔÉ ÜÌÅ ÍÅÎÔÏ× ÅÒ×ÏÎÁÞÁÌØÎÏÇÏ ÓÉÓËÁ ÄÏÓÔÁÔÏÞÎÏ? ðÒÁ×ÉÌØÎÏÅ ÒÅÛÅÎÉÅ ×ÏÓÏÌØÚÏ×ÁÔØÓÑ ÂÅÓËÏÎÅÞÎÙÍ ÓÉÓËÏÍ, ÏÌÕÞÅÎÎÙÍ Ó ÏÍÏÝØÀ ×ÙÚÏ×Á from 1, ×ÍÅÓÔÏ ÓÉÓËÁ [ 1 .. 10℄, É ÏÌÕÞÉÔØ ÔÁËÉÍ ÏÂÒÁ ÚÏÍ ÓÔÅÅÎÉ ÞÉÓÌÁ ÔÒÉ:
×ÓÅ
---> takeWhile (<1000) (map (3^) (from 1)) [3,9,27,81,243,729℄ ÁËÏÊ ÏÄÈÏÄ ×ÏÚÍÏÖÅÎ ÌÉÛØ ÏÔÏÍÕ, ÞÔÏ ÉÎÔÅÒÒÅÔÁÔÏÒ ¾ÄÏ ÓÔÁÔÏÞÎÏ ÌÅÎÉ׿: ×ÙÏÌÎÅÎÉÅ ÒÅÄÓÔÏÑÝÅÊ ÒÁÂÏÔÙ ÏÔËÌÁÄÙ×ÁÅÔÓÑ ÄÏ ÔÅÈ ÏÒ, ÏËÁ ÜÔÏ ×ÏÚÍÏÖÎÏ. ÷ÙÚÏ× map (3^) (from 1) ÎÅ ×Ù ÞÉÓÌÑÅÔÓÑ ÏÌÎÏÓÔØÀ (ÜÔÏ ÏÔÒÅÂÏ×ÁÌÏ ÂÙ ÂÅÓËÏÎÅÞÎÏÇÏ ×ÒÅÍÅÎÉ). óÎÁÞÁÌÁ ×ÙÞÉÓÌÑÅÔÓÑ ÔÏÌØËÏ ÅÒ×ÙÊ ÜÌÅÍÅÎÔ, ËÏÔÏÒÙÊ ÚÁÔÅÍ ÅÒÅ ÄÁÅÔÓÑ ÆÕÎË ÉÉ takeWhile. ÏÌØËÏ ÏÓÌÅ ÏÂÒÁÂÏÔËÉ ÅÒ×ÏÇÏ ÜÌÅ ÍÅÎÔÁ, ÆÕÎË ÉÑ takeWhile ÚÁÒÏÓÉÔ ÓÌÅÄÕÀÝÉÊ ÜÌÅÍÅÎÔ É ×ÔÏÒÏÊ ÜÌÅÍÅÎÔ ÓÉÓËÁ from 1 ÂÕÄÅÔ ÏÒÅÄÅÌÅÎ. ðÒÏÄÏÌÖÁÑ ÔÁËÉÍ ÏÂÒÁ ÚÏÍ, takeWhile ÒÅËÒÁÔÉÔ Ó×ÏÀ ÒÁÂÏÔÕ, Ô. Å. ÎÅ ÓÔÁÎÅÔ ÔÒÅÂÏ×ÁÔØ ÓÌÅÄÕÀÝÉÊ ÜÌÅÍÅÎÔ ÏÔ ÆÕÎË ÉÉ map, ËÁË ÔÏÌØËÏ ÏÞÅÒÅÄÎÏÊ ÜÌÅ ÍÅÎÔ ÕÄÏ×ÌÅÔ×ÏÒÉÔ ÕÓÌÏ×ÉÀ > 1000.
éÓÏÌØÚÏ×ÁÎÉÅ ÂÅÓËÏÎÅÞÎÙÈ ÓÉÓËÏ× ×ÏÚÍÏÖÎÏ ÔÏÌØËÏ ÂÌÁÇÏÄÁ ÒÑ ÌÅÎÉ×ÙÍ ×ÙÞÉÓÌÅÎÉÑÍ. ñÚÙËÉ, ÒÅÁÌÉÚÕÀÝÉÅ ÓÔÒÁÔÅÇÉÀ ÜÎÅÒ ÇÉÞÎÙÈ ×ÙÞÉÓÌÅÎÉÊ (ÂÏÌØÛÉÎÓÔ×Ï ÉÍÅÒÁÔÉ×ÎÙÈ ÑÚÙËÏ× É ÎÅËÏ ÔÏÒÙÅ ÉÚ ÑÚÙËÏ× ÆÕÎË ÉÏÎÁÌØÎÏÇÏ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÑ), ÎÅ ÍÏÇÕÔ ÏÅÒÉÒÏ×ÁÔØ ÂÅÓËÏÎÅÞÎÙÍÉ ÓÔÒÕËÔÕÒÁÍÉ ÄÁÎÎÙÈ. æÕÎË ÉÑ, ËÏÔÏÒÏÊ ÔÒÅÂÕÀÔÓÑ ×ÓÅ ÜÌÅÍÅÎÔÙ ÓÉÓËÁ, ÎÅ ÍÏÖÅÔ ÒÉÍÅÎÑÔØÓÑ Ë ÂÅÓËÏÎÅÞÎÙÍ ÓÉÓËÁÍ. ðÒÉÍÅÒÏÍ ÔÁËÉÈ ÆÕÎË ÉÊ Ñ×ÌÑÀÔÓÑ sum É length. ðÒÉ ×ÙÚÏ×Å ÆÕÎË ÉÊ sum (from 1) ÉÌÉ length (from 1) ÄÁÖÅ ¾ÌÅÎÉ×ÏÅ¿ ×ÙÞÉÓÌÅÎÉÅ ÎÅ ÏÍÏÖÅÔ ÎÁÊÔÉ
H
H
VI. óÔÒÕËÔÕÒÙ ÄÁÎÎÙÈ
138
ÏÔ×ÅÔ ÚÁ ËÏÎÅÞÎÏÅ ×ÒÅÍÑ. ÷ ÜÔÏÍ ÓÌÕÞÁÅ ËÏÍØÀÔÅÒ ÎÉËÏÇÄÁ ÎÅ ×ÙÄÁÓÔ ËÏÎÅÞÎÙÊ ÏÔ×ÅÔ. ÏÔ ÆÁËÔ, ÞÔÏ ÑÚÙË Haskell ÒÅÁÌÉÚÕÅÔ ÓÔÒÁÔÅÇÉÀ ÏÔÌÏÖÅÎÎÙÈ ×ÙÞÉÓÌÅÎÉÊ ÒÁËÔÉÞÅÓËÉ ÏÓÔÏÑÎÎÏ ÕÞÉÔÙ×ÁÅÔÓÑ ÒÉ ÒÏÅËÔÉÒÏ ×ÁÎÉÉ ÒÏÇÒÁÍÍ. ÷ÓÏÍÎÉÍ, Ë ÒÉÍÅÒÕ, ÆÕÎË ÉÀ prime, ÒÏ×ÅÒÑ ÀÝÕÀ Ñ×ÌÑÅÔÓÑ ÌÉ ÅÌÏÅ ÞÉÓÌÏ ÒÏÓÔÙÍ (ÓÔÒ. 98).
prime :: Int -> Bool prime x = denominators x == [1, x℄ îÁÈÏÄÉÔ ÌÉ ÜÔÁ ÆÕÎË ÉÑ ×ÓÅ ÄÅÌÉÔÅÌÉ ÞÉÓÌÁ x ÄÌÑ ÔÏÇÏ, ÞÔÏÂÙ ÚÁÔÅÍ ÓÒÁ×ÎÉÔØ ÉÈ ÓÉÓÏË ÓÏ ÓÉÓËÏÍ [1, x℄? îÅÔ, ÔÁË ËÁË ÎÁ ÜÔÏ ÏÔÒÅÂÏ×ÁÌÏÓØ ÂÙ ÄÏÓÔÁÔÏÞÎÏ ÍÎÏÇÏ ×ÒÅÍÅÎÉ. ðÏÓÍÏÔÒÉÍ, ÞÔÏ ÒÏ ÉÓÈÏÄÉÔ ÒÉ ×ÙÞÉÓÌÅÎÉÉ, ÎÁÒÉÍÅÒ, prime 30. óÎÁÞÁÌÁ ÎÁÈÏÄÉÔÓÑ ÅÒ×ÙÊ ÄÅÌÉÔÅÌØ ÞÉÓÌÁ 30 ÜÔÏ 1. üÔÏ ÚÎÁÞÅÎÉÅ ÓÒÁ×ÎÉ×ÁÅÔÓÑ Ó ÎÁÞÁÌÏÍ ÓÉÓËÁ [1, 30℄. ÷ÙÑÓÎÑÅÔÓÑ, ÞÔÏ ÅÒ×ÙÅ ÜÌÅÍÅÎÔÙ ÓÉÓ ËÁ ÓÏ×ÁÌÉ. ïÒÅÄÅÌÑÅÔÓÑ ×ÔÏÒÏÊ ÄÅÌÉÔÅÌØ 30 ÜÔÏ ÞÉÓÌÏ 2. ïÎÏ ÓÒÁ×ÎÉ×ÁÅÔÓÑ ÓÏ ×ÔÏÒÙÍ ÜÌÅÍÅÎÔÏÍ ÓÉÓËÁ [1, 30℄, ÏÓÌÅ ÞÅÇÏ ×Ù ÑÓÎÑÅÔÓÑ, ÞÔÏ ÏÎÉ . ïÅÒÁÔÏÒ ÒÏ×ÅÒËÉ ÎÁ ÒÁ×ÅÎÓÔ×Ï == ¾ÚÎÁÅÔ¿, ÞÔÏ ÓÉÓËÉ ÎÅ ÍÏÇÕÔ ÓÏ×ÁÓÔØ, ÅÓÌÉ ÎÁ ÏÄÎÏÍ É ÔÏÍ ÖÅ ÍÅ ÓÔÅ × ÎÉÈ ÎÁÈÏÄÑÔÓÑ ÒÁÚÌÉÞÎÙÅ ÜÌÅÍÅÎÔÙ. ðÏÜÔÏÍÕ ×ÏÚ×ÒÁÝÁÅÔÓÑ ÚÎÁÞÅÎÉÅ False. ïÓÔÁÌØÎÙÅ ÄÅÌÉÔÅÌÉ ÞÉÓÌÁ 30 ÎÅ ×ÙÞÉÓÌÑÀÔÓÑ! ìÅÎÉ×ÏÅ Ï×ÅÄÅÎÉÅ ÏÅÒÁÔÏÒÁ == ÓÌÅÄÕÅÔ ÉÚ ÅÇÏ ÏÒÅÄÅÌÅÎÉÑ (ÓÔÒ. 111). òÅËÕÒÓÉ×ÎÙÊ ÓÌÕÞÁÊ × ÅÇÏ ÏÒÅÄÅÌÅÎÉÉ ×ÙÇÌÑÄÉÔ ÔÁË:
ÎÅ ÒÁ×ÎÙ
(x:xs) == (y:ys) = x == y && xs == ys åÓÌÉ x == y ×ÏÚ×ÒÁÝÁÅÔ ÚÎÁÞÅÎÉÅ False, ÔÏ xs == ys ×ÙÞÉÓÌÑÔØ ÕÖÅ ÎÅ ÎÕÖÎÏ: ËÏÎÅÞÎÙÍ ÒÅÚÕÌØÔÁÔÏÍ ×ÓÅÇÄÁ ÂÕÄÅÔ False. üÔÏ ÓÌÅÄ ÓÔ×ÉÅ ÌÅÎÉ×ÏÇÏ Ï×ÅÄÅÎÉÑ ÏÅÒÁÔÏÒÁ &&, ÏÔÒÁÖÅÎÎÏÇÏ × ÅÇÏ ÏÒÅ ÄÅÌÅÎÉÉ:
False && x = False True && x = x åÓÌÉ ÌÅ×ÙÊ ÁÒÁÍÅÔÒ ÉÍÅÅÔ ÚÎÁÞÅÎÉÅ False, ÔÏ ÚÎÁÞÅÎÉÅ ÒÁ×ÏÇÏ ÁÒÁÍÅÔÒÁ ×ÙÞÉÓÌÑÔØ ÎÅ ÎÕÖÎÏ.
I õÒÁÖÎÅÎÉÅ VI.3.1
òÁÓÓÍÏÔÒÉÍ ÚÁÄÁÞÕ ÏÓÔÒÏÅÎÉÑ ÆÕÎË ÉÉ position ÔÁËÏÊ, ÞÔÏ position x xs ×ÏÚ×ÒÁÝÁÅÔ ÎÏÍÅÒ ÏÚÉ ÉÉ ÅÒ×ÏÇÏ ×ÈÏÖÄÅÎÉÑ ÜÌÅ ÍÅÎÔÁ x × ÓÉÓÏË xs (ÎÕÍÅÒÁ ÉÑ ÜÌÅÍÅÎÔÏ× ÓÉÓËÁ ÎÁÞÉÎÁÅÔÓÑ Ó 0), É 1, ÅÓÌÉ x ÎÅ ×ÓÔÒÅÞÁÅÔÓÑ × ÓÉÓËÅ. É ÆÕÎË ÉÉ position:
position
:: Eq a => a -> [a℄ -> Int
3. âÅÓËÏÎÅÞÎÙÅ ÓÉÓËÉ
139
úÁÞÁÓÔÕÀ ÒÉ ÒÅÛÅÎÉÉ ÚÁÄÁÞ ÂÙ×ÁÅÔ ÒÏÝÅ ÓÒÁ×ÉÔÓÑ Ó ÂÏÌÅÅ Ï ÝÅÊ ÚÁÄÁÞÅÊ, Á ÉÓÈÏÄÎÕÀ ÒÁÓÓÍÏÔÒÅÔØ ËÁË ÅÅ ÞÁÓÔÎÙÊ ÓÌÕÞÁÊ. é × ÜÔÏÍ ÓÌÕÞÁÅ, ÍÙ ÓÎÁÞÁÌÁ ÎÁÊÄÅÍ ÏÚÉ ÉÉ ×ÈÏÖÄÅÎÉÊ x × xs:
×ÓÅÈ
positions :: Eq a => a -> [a℄ -> [Int℄ positions x xs = [ i | (i, y) <- zip [0 ..℄ xs, x == y℄ ÷ÙÒÁÖÅÎÉÅ zip [0 ..℄ xs ×ÏÚ×ÒÁÝÁÅÔ ÁÒÙ ËÁÖÄÏÇÏ ÜÌÅÍÅÎ ÔÁ ÓÉÓËÁ xs Ó ÅÇÏ ÏÒÑÄËÏ×ÙÍ ÎÏÍÅÒÏÍ × ÓÉÓËÅ. èÏÔÑ [0 ..℄ ÅÓÔØ ÂÅÓËÏÎÅÞÎÙÊ ÓÉÓÏË, zip [0 ..℄ xs ×ÅÒÎÅÔ ËÏÎÅÞÎÙÊ ÓÉÓÏË, ÏÔÏÍÕ ÞÔÏ xs ËÏÎÅÞÎÙÊ ÓÉÓÏË. ÅÅÒØ ÍÙ ÍÏÖÅÍ ÏÒÅÄÅÌÉÔØ position ÔÁË:
position x xs = head (positions x xs ++ [-1℄) úÁÍÅÔÉÍ, ÞÔÏ ÒÏÓÔÏÔÁ ÜÔÏÇÏ ÏÒÅÄÅÌÅÎÉÑ ÄÏÓÔÉÇÁÅÔÓÑ ÎÅ ÚÁ ÓÞÅÔ Õ×ÅÌÉÞÅÎÉÑ ×ÒÅÍÅÎÉ ×ÙÞÉÓÌÅÎÉÑ. óÎÁÞÁÌÁ ×ÙÞÉÓÌÑÅÔÓÑ ÇÏÌÏ×Á ÓÉÓËÁ É ÎÅÔ ÎÅÏÂÈÏÄÉÍÏÓÔÉ ÒÏÄÏÌÖÁÔØ ÏÒÅÄÅÌÑÔØ ÏÓÔÁÌØÎÙÅ ÜÌÅ ÍÅÎÔÙ ÓÉÓËÁ.
---> position 3 [1, 3, 4, 3℄ 1
J
H
3.2. æÕÎË ÉÉ ÎÁ ÂÅÓËÏÎÅÞÎÙÈ ÓÉÓËÁÈ ÷ ÒÅÌÀÄÉÉ ÍÎÏÇÉÅ ÆÕÎË ÉÉ ÏÒÅÄÅÌÅÎÙ Ó ÏÍÏÝØÀ ÂÅÓËÏÎÅÞ ÎÙÈ ÓÉÓËÏ×. ÁË ÄÅÊÓÔ×ÉÔÅÌØÎÏÅ ÉÍÑ ÆÕÎË ÉÉ from (ÓÔÒ. 136) ÅÓÔØ enumFrom. üÔÕ ÆÕÎË ÉÀ ÏÂÙÞÎÏ ÎÅ ÉÓÏÌØÚÕÀÔ × ÔÁËÏÊ ÆÏÒÍÅ, ÔÁË ËÁË ×ÍÅÓÔÏ enumFrom n ÒÏÝÅ ÚÁÉÓÁÔØ [n .. ℄ (ÓÒÁ×ÎÉÔÅ ÔÁËÕÀ ÚÁÉÓØ Ó ÚÁÉÓØÀ [n .. m℄ ×ÍÅÓÔÏ enumFromTo n m, ÏÂÓÕÖÄÁÅÍÏÊ ÎÁ ÓÔÒ. 109). âÅÓËÏÎÅÞÎÙÊ ÓÉÓÏË, ËÏÔÏÒÙÊ ÓÏÄÅÒÖÉÔ × ÓÅÂÅ Ï×ÔÏÒÅÎÉÅ ÏÄ ÎÏÇÏ É ÔÏÇÏ ÖÅ ÜÌÅÍÅÎÔÁ, ÍÏÖÅÔ ÂÙÔØ ÓÏÚÄÁÎ ÒÉ ÉÓÏÌØÚÏ×ÁÎÉÉ ÆÕÎË ÉÉ repeat:
repeat :: a -> [a℄ repeat x = x : repeat x ÷ÙÚÏ× repeat 't' ÄÁÅÔ ÂÅÓËÏÎÅÞÎÙÊ ÓÉÓÏË "tttttttt..." âÅÓËÏÎÅÞÎÙÊ ÓÉÓÏË, ÇÅÎÅÒÉÒÕÅÍÙÊ ÆÕÎË ÉÅÊ repeat, ÉÓÏÌØ ÚÕÅÔÓÑ × ÒÏÌÉ ÒÏÍÅÖÕÔÏÞÎÏÇÏ ÒÅÚÕÌØÔÁÔÁ ÄÌÑ ÔÏÊ ÉÌÉ ÉÎÏÊ ÆÕÎË ÉÉ, ÉÍÅÀÝÅÊ ËÏÎÅÞÎÙÊ ÒÅÚÕÌØÔÁÔ. îÁÒÉÍÅÒ, ÆÕÎË ÉÑ opy ÓÏ ÚÄÁÅÔ ËÏÎÅÞÎÏÅ ÞÉÓÌÏ ËÏÉÊ ÜÌÅÍÅÎÔÁ:
opy :: Int -> a -> [a℄
opy n x = take n (repeat x)
VI. óÔÒÕËÔÕÒÙ ÄÁÎÎÙÈ
140
âÌÁÇÏÄÁÒÑ ÓÔÒÁÔÅÇÉÉ ÏÔÌÏÖÅÎÎÙÈ ×ÙÞÉÓÌÅÎÉÊ ÆÕÎË ÉÑ opy ÍÏ ÖÅÔ ÉÓÏÌØÚÏ×ÁÔØ ÂÅÓËÏÎÅÞÎÙÊ ÒÅÚÕÌØÔÁÔ ÆÕÎË ÉÉ repeat. æÕÎË ÉÉ repeat É opy ÏÒÅÄÅÌÅÎÙ × ÒÅÌÀÄÉÉ.
H
îÁÉÂÏÌÅÅ ÇÉÂËÉÍÉ × ÓÍÙÓÌÅ ÉÓÏÌØÚÏ×ÁÎÉÑ ÔÏÇÏ ÉÌÉ ÉÎÏÇÏ ×ÉÄÁ ÓÉÓËÏ× Ñ×ÌÑÀÔÓÑ ÆÕÎË ÉÉ ×ÙÓÛÅÇÏ ÏÒÑÄËÁ, Ô. Å. ÉÓÏÌØÚÕÀÝÉÅ ÄÒÕÇÉÅ ÆÕÎË ÉÉ × ËÁÞÅÓÔ×Å ÁÒÁÍÅÔÒÁ. æÕÎË ÉÑ iterate ÏÌÕÞÁ ÅÔ ÆÕÎË ÉÀ É ÎÁÞÁÌØÎÙÊ ÜÌÅÍÅÎÔ × ËÁÞÅÓÔ×Å ÁÒÁÍÅÔÒÏ×. òÅÚÕÌØ ÔÁÔÏÍ Ñ×ÌÑÅÔÓÑ ÂÅÓËÏÎÅÞÎÙÊ ÓÉÓÏË, × ËÏÔÏÒÏÍ ËÁÖÄÙÊ ÜÌÅÍÅÎÔ ÏÌÕÞÁÅÔÓÑ ÏÓÒÅÄÓÔ×ÏÍ ÒÉÍÅÎÅÎÉÑ ÆÕÎË ÉÉ Ë ÒÅÄÙÄÕÝÅÍÕ ÜÌÅ ÍÅÎÔÕ. îÁÒÉÍÅÒ:
---> iterate (+1) 3 [3,4,5,6,7,8, ... {Interrupted!} ---> iterate (*2) 1 [1,2,4,8,16,32,64,128,256, ... {Interrupted!} ---> iterate (`div` 10) 5678 [5678,567,56,5,0,0,0, ... {Interrupted!}
ïÒÅÄÅÌÅÎÉÅ iterate, ÒÉ×ÏÄÉÍÏÅ × ÒÅÌÀÄÉÉ, ÔÁËÏ×Ï:
iterate iterate f x
:: (a -> a) -> a -> [a℄ = x : iterate f (f x)
üÔÁ ÆÕÎË ÉÑ ÎÁÏÍÉÎÁÅÔ ÆÕÎË ÉÀ until, ÏÉÓÁÎÎÕÀ ÎÁ ÓÔÒ. 90. ïÎÁ ÔÁËÖÅ ÏÌÕÞÁÅÔ ÆÕÎË ÉÀ É ÎÁÞÁÌØÎÙÊ ÜÌÅÍÅÎÔ × ËÁÞÅÓÔ×Å ÁÒÁÍÅÔÒÏ×. òÁÚÌÉÞÉÅ ÓÏÓÔÏÉÔ × ÔÏÍ, ÞÔÏ until ÒÅËÒÁÝÁÅÔ Ó×ÏÀ ÒÁÂÏÔÕ, ËÁË ÔÏÌØËÏ ÚÎÁÞÅÎÉÅ ÕÄÏ×ÌÅÔ×ÏÒÉÔ ÏÓÎÏ×ÎÏÍÕ ÕÓÌÏ×ÉÀ (ËÏ ÔÏÒÏÅ ÔÁËÖÅ Ñ×ÌÑÅÔÓÑ ÁÒÁÍÅÔÒÏÍ). ë ÔÏÍÕ ÖÅ until ×ÏÚ×ÒÁÝÁ ÅÔ ÔÏÌØËÏ ËÏÎÅÞÎÙÊ ÒÅÚÕÌØÔÁÔ (ËÏÔÏÒÙÊ ÕÄÏ×ÌÅÔ×ÏÒÑÅÔ ÚÁÄÁÎÎÏÍÕ ÕÓÌÏ×ÉÀ), ÔÏÇÄÁ ËÁË iterate ÓÏÈÒÁÎÑÅÔ ×ÓÀ ÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔØ ÒÅ ÚÕÌØÔÁÔÏ× × ÓÉÓËÅ. üÔÏ ×ÏÚÍÏÖÎÏ, ÏÔÏÍÕ ÞÔÏ ÂÅÓËÏÎÅÞÎÙÅ ÓÉÓËÉ ÎÅ ÉÍÅÀÔ ÏÓÌÅÄÎÅÇÏ ÜÌÅÍÅÎÔÁ. ÷ ÓÌÅÄÕÀÝÉÈ ÒÉÍÅÒÁÈ ÏÂÓÕÖÄÁÅÔÓÑ ËÁË ÆÕÎË ÉÀ iterate ÍÏÖÎÏ ÉÓÏÌØÚÏ×ÁÔØ ÄÌÑ ÒÅÛÅÎÉÑ ÒÁËÔÉÞÅÓËÉÈ ÚÁÄÁÞ: ×Ù×ÏÄÁ ÞÉ ÓÌÁ × ×ÉÄÅ ÓÔÒÏËÉ, ÏÌÕÞÅÎÉÅ ÓÉÓËÁ ×ÓÅÈ ÒÏÓÔÙÈ ÞÉÓÅÌ É ÏÌÕÞÅ ÎÉÅ ¾ÓÌÕÞÁÊÎÏÊ¿ ÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔÉ ÞÉÓÅÌ.
3. âÅÓËÏÎÅÞÎÙÅ ÓÉÓËÉ
141
3.3. ðÒÉÍÅÒÙ ÒÉÍÅÎÅÎÉÑ ÂÅÓËÏÎÅÞÎÙÈ ÓÉÓËÏ× ðÒÅÏÂÒÁÚÏ×ÁÎÉÅ ÞÉÓÌÁ × ÓÔÒÏËÕ
æÕÎË ÉÑ intString ÒÅÏÂÒÁÚÕÅÔ ÏÌÏÖÉÔÅÌØÎÏÅ ÅÌÏÅ ÞÉÓÌÏ × ÓÔÒÏËÕ, ËÏÔÏÒÁÑ ÓÏÓÔÏÉÔ ÉÚ ÉÆÒ ÜÔÏÇÏ ÞÉÓÌÁ. îÁÒÉÍÅÒ, intString 5678 ×ÏÚ×ÒÁÝÁÅÔ ÓÔÒÏËÕ "5678". ó ÏÍÏÝØÀ ÜÔÏÊ ÆÕÎË ÉÉ ×Ù ÍÏÖÅÔÅ ÏÂßÅÄÉÎÑÔØ ÒÅÚÕÌØÔÁÔ ×ÙÞÉÓÌÅÎÉÊ ÓÏ ÓÔÒÏËÏÊ, ÎÁ ÒÉÍÅÒ, intString (3*17) ++ " ÌÉÎÉÊ". æÕÎË ÉÑ intString ÍÏÖÅÔ ÂÙÔØ ÏÌÕÞÅÎÁ ËÁË ÏÓÌÅÄÏ×ÁÔÅÌØ ÎÏÓÔØ ×ÙÏÌÎÅÎÉÑ ÒÑÄÁ ÏÅÒÁ ÉÊ. óÎÁÞÁÌÁ ÞÉÓÌÏ ÄÏÌÖÎÏ ÂÙÔØ ÎÅÓËÏÌØËÏ ÒÁÚ ÒÁÚÄÅÌÅÎÏ ÎÁ ÅÌÏ ÎÁ 10 Ó ÏÍÏÝØÀ ÆÕÎË ÉÉ iterate (ÔÁËÖÅ, ËÁË × ÔÒÅÔØÅÍ ÒÉÍÅÒÅ ÉÓÏÌØÚÏ×ÁÎÉÑ ÆÕÎË ÉÉ iterate). îÅ ÉÎÔÅÒÅÓÕÀÝÕÀ ÎÁÓ ÂÅÓËÏÎÅÞÎÕÀ ÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔØ ÎÕÌÅÊ × ËÏÎ Å ÓÉÓËÁ ÎÕÖÎÏ ÕÂÒÁÔØ, ÒÉÍÅÎÉ× ÆÕÎË ÉÀ takeWhile. Å ÅÒØ ÖÅÌÁÅÍÙÅ ÉÆÒÙ ÍÏÇÕÔ ÂÙÔØ ÎÁÊÄÅÎÙ ËÁË ÏÓÌÅÄÎÉÅ ÉÆÒÙ ÞÉÓÅÌ, ÓÏÄÅÒÖÁÝÉÈÓÑ × ÓÉÓËÅ; ÏÓÌÅÄÎÑÑ ÉÆÒÁ ÞÉÓÌÁ ÒÁ×ÎÁ ÏÓÔÁÔ ËÕ ÏÔ ÅÇÏ ÄÅÌÅÎÉÑ ÎÁ ÅÌÏ ÎÁ ÄÅÓÑÔØ. ðÏÌÕÞÅÎÎÙÅ ÉÆÒÙ ÒÁÓÏ ÌÁÇÁÀÔÓÑ × ÏÂÒÁÔÎÏÍ ÏÒÑÄËÅ, ÞÔÏ ÌÅÇËÏ ÏÒÁ×ÉÌÏ Ó ÏÍÏÝØÀ ÆÕÎË ÉÉ reverse. ÷ ÚÁ×ÅÒÛÅÎÉÅ, ÜÌÅÍÅÎÔÙ ÓÉÓËÁ ( ÉÆÒÙ, Ô.Å. ×Å ÌÉÞÉÎÙ ÔÉÁ Int) ÎÕÖÎÏ ÒÅÏÂÒÁÚÏ×ÁÔØ × ÓÉÍ×ÏÌÙ (ÔÉ Char), ÞÔÏ ÍÙ ÏÓÕÝÅÓÔ×ÉÍ ÒÉ ÏÍÏÝÉ ÆÕÎË ÉÉ digitChar, ÒÁÓÓÍÏÔÒÅÎÎÏÊ ÎÁ ÓÔÒÁÎÉ Å 52. îÉÖÅ ÒÉ×ÏÄÉÔÓÑ ÒÉÍÅÒ, ×ËÌÀÞÁÀÝÉÊ × ÓÅÂÑ ×ÓÅ ×ÙÛÅÅÒÅÞÉÓÌÅÎÎÙÅ ÛÁÇÉ:
5678 # iterate (`div` 10) [5678, 567, 56, 5, 0, 0, 0, ... # takeWhile (/= 0) [5678, 567, 56, 5℄ # map (`rem` 10) [8, 7, 6, 5℄ # reverse [5, 6, 7, 8℄ # map digitChar ['5', '6', '7', '8'℄ æÕÎË ÉÑ intString ÍÏÖÅÔ ÂÙÔØ ÏÒÅÄÅÌÅÎÁ ÒÏÓÔÏ ËÁË ÏÂßÅÄÉÎÅ ÎÉÅ ÜÔÉÈ ÑÔÉ ÛÁÇÏ×. úÁÍÅÔÉÍ, ÞÔÏ ÆÕÎË ÉÉ ÎÁÉÓÁÎÙ × ÏÂÒÁÔÎÏÍ
142
VI. óÔÒÕËÔÕÒÙ ÄÁÎÎÙÈ
ÏÒÑÄËÅ, ÏÔÏÍÕ ÞÔÏ ÏÅÒÁÔÏÒ ÏÓÌÅÄÏ×ÁÔÅÌØÎÏÇÏ ×ÙÏÌÎÅÎÉÑ (.) ÅÓÔØ ËÏÍÏÚÉ ÉÑ ÆÕÎË ÉÊ (ÚÎÁËÏÍÁÑ ÎÁÍ ÆÕÎË ÉÑ `after`):
intString :: Int -> [Char℄ intString = map digitChar . reverse . map (`rem` 10) . takeWhile (/=0) . iterate (`div` 10)
ÆÕÎË ÉÏÎÁÌØÎÏÅ ÒÏÇÒÁÍ ÍÉÒÏ×ÁÎÉÅ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÅ ÏÓÒÅÄÓÔ×ÏÍ ÆÕÎË ÉÊ! üÔÏÔ ÒÏÍÅÒ ÅÝÅ ÒÁÚ ÏÄÞÅÒËÉ×ÁÅÔ, ÞÔÏ
ðÏÌÕÞÅÎÉÅ ÓÉÓËÁ ×ÓÅÈ ÒÏÓÔÙÈ ÞÉÓÅÌ
H
îÁ ÓÔÒÁÎÉ Å 98 ÂÙÌÁ ÏÒÅÄÅÌÅÎÁ ÆÕÎË ÉÑ prime, ÒÅÄÎÁÚÎÁÞÅÎ ÎÁÑ ÄÌÑ ÒÏ×ÅÒËÉ ÒÏÓÔÏÔÙ ÞÉÓÌÁ. ó ÅÅ ÏÍÏÝØÀ ÍÏÖÎÏ ÏÌÕÞÉÔØ ÂÅÓËÏÎÅÞÎÙÊ ÓÉÓÏË ÒÏÓÔÙÈ ÞÉÓÅÌ ÓÌÅÄÕÀÝÉÍ ÏÂÒÁÚÏÍ:
filter prime [2 ..℄ æÕÎË ÉÑ prime ÒÅÄ×ÁÒÉÔÅÌØÎÏ ÎÁÈÏÄÉÔ ×ÓÅ ÄÅÌÉÔÅÌÉ ÞÉÓÌÁ. åÓÌÉ ÞÉÓÌÏ ÄÏÓÔÁÔÏÞÎÏ ÂÏÌØÛÏÅ, ÔÏ ÄÌÑ ÒÏ×ÅÒËÉ ÔÏÇÏ ÆÁËÔÁ, ÞÔÏ ÞÉÓÌÏ ÎÅ Ñ×ÌÑÅÔÓÑ ÒÏÓÔÙÍ, ÏÔÒÅÂÕÅÔÓÑ ÚÎÁÞÉÔÅÌØÎÏÅ ×ÒÅÍÑ òÁÚÕÍÎÅÅ ÂÕÄÅÔ ÉÓÏÌØÚÏ×ÁÎÉÅ ÆÕÎË ÉÉ iterate ÄÌÑ ÏÌÕÞÅ ÎÉÑ ÂÏÌÅÅ ÜÆÆÅËÔÉ×ÎÏÊ ÁÌÇÏÒÉÔÍÁ. üÔÏÔ ÍÅÔÏÄ ÉÚ×ÅÓÔÅÎ Ó ÄÒÅ×ÎÉÈ ×ÒÅÍÅÎ É ÎÏÓÉÔ ÎÁÚ×ÁÎÉÅ ¾ÒÅÛÅÔÏ üÒÁÔÏÓÆÅÎÁ¿. òÁÂÏÔÁ ÍÅÔÏÄÁ ÔÁË ÖÅ ÎÁÞÉÎÁÅÔÓÑ Ó ÏÓÔÒÏÅÎÉÑ ÂÅÓËÏÎÅÞÎÏÇÏ ÓÉÓËÁ [2 ..℄:
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... ðÅÒ×ÏÅ ÞÉÓÌÏ × ÜÔÏÍ ÓÉÓËÅ 2, Ñ×ÌÑÅÔÓÑ ÒÏÓÔÙÍ É ÄÏÌÖÎÏ ÂÙÔØ ÏÍÅÝÅÎÏ × ÓÉÓÏË ÒÏÓÔÙÈ ÞÉÓÅÌ. úÁÔÅÍ ÞÉÓÌÏ 2 É ×ÓÅ ËÒÁÔÎÙÅ ÅÍÕ ÞÉÓÌÁ (4, 6, 8, 10 ...) ÕÄÁÌÑÀÔÓÑ ÉÚ ÓÉÓËÁ:
[3, 5, 7, 9, 11, 13, 15, 17, 19, 21, ... é ÓÎÏ×Á, ÅÒ×ÏÅ ÞÉÓÌÏ × ÓÉÓËÅ 3 ÒÏÓÔÏÅ. üÔÏ ÞÉÓÌÏ É ×ÓÅ ÞÉÓÌÁ, ËÒÁÔÎÙÅ ÅÍÕ ÕÄÁÌÑÀÔÓÑ ÉÚ ÓÉÓËÁ:
[5, 7, 11, 13, 17, 19, 23, 25, 29, 31, ... ðÏ×ÔÏÒÑÅÍ ÒÏ ÅÓÓ, ÎÁÞÁ× Ó 5:
[7, 11, 13, 17, 19, 23, 29, 31, 37, 41, ... é ÔÁË ÄÁÌÅÅ. æÕÎË ÉÑ ¾×ÙÞÅÒËÉ×ÁÎÉÑ ËÒÁÔÎÙÈ ÅÒ×ÏÍÕ ÜÌÅÍÅÎÔÕ¿ ×ÓÅÇÄÁ ÒÉÍÅÎÑÅÔÓÑ Ë ÒÅÄÙÄÕÝÅÍÕ ÒÅÚÕÌØÔÁÔÕ. ðÒÏ ÅÓÓ ÉÔÅÒÁ ÉÉ ÎÁÞÉÎÁÅÔÓÑ ÓÏ ÓÉÓËÁ [2 ..℄:
3. âÅÓËÏÎÅÞÎÙÅ ÓÉÓËÉ
143
iterate rossout [2 ..℄ where rossout (x:xs) = filter (not . multiple x ) xs multiple x y = divisible y x
(þÉÓÌÏ y ËÒÁÔÎÏ x, ÅÓÌÉ y ÄÅÌÉÔÓÑ ÎÁ x). ÷ÈÏÄÎÏÊ ÁÒÇÕÍÅÎÔ ÅÓÔØ ÂÅÓËÏÎÅÞÎÙÊ ÓÉÓÏË, Á ÒÅÚÕÌØÔÁÔ Ñ×ÌÑÅÔÓÑ . ðÏÌÕÞÁÅÍÙÊ ÓÕÅÒÓÉÓÏË ×ÙÇÌÑÄÉÔ ÒÉÍÅÒ ÎÏ ÔÁË:
ÂÅÓËÏÎÅÞÎÙÈ ÓÉÓËÏ×
[ , , , ,
[2, [3, [5, [7, ...
ÂÅÓËÏÎÅÞÎÙÍ ÓÉÓËÏÍ
3, 4, 5, 6, 7, 8, 9, 10, 11, ... 5, 7, 9, 11, 13, 15, 17, 19, 21, ... 7, 11, 13, 17, 19, 23, 25, 29, 31, ... 11, 13, 17, 19, 23, 29, 31, 37, 41, ...
üÔÏÔ ÓÉÓÏË ÎÉËÏÇÄÁ ÎÅ ÕÄÁÓÔÓÑ Õ×ÉÄÅÔØ ÅÌÉËÏÍ ÒÉ ÏÙÔËÅ ÏÌÕÞÉÔØ ÅÇÏ, ×Ù ÓÍÏÖÅÔÅ Õ×ÉÄÅÔØ ÔÏÌØËÏ ÎÁÞÁÌÏ ÅÒ×ÏÇÏ ÓÉÓËÁ. îÏ ÍÏÖÎÏ Õ×ÉÄÅÔØ ÆÒÁÇÍÅÎÔ ÓÉÓËÁ: ÎÕÖÎÙÅ ÎÁÍ ÒÏÓÔÙÅ ÞÉÓÌÁ Ñ×ÌÑÀÔÓÑ ÅÒ×ÙÍÉ ÜÌÅÍÅÎÔÁÍÉ ÓÉÓËÏ× É ÍÏÇÕÔ ÂÙÔØ ÏÌÕÞÅÎÙ ÒÉ ÏÍÏÝÉ ÆÕÎË ÉÉ head, ÒÉÍÅÎÅÎÎÏÊ Ë ËÁÖÄÏÍÕ ÏÄÓÉÓËÕ:
primenums :: [Int℄ primenums = map head (iterate rossout [2 ..℄) where rossout (x:xs) = filter (not . multiple x ) xs multiple x y = divisible y x
divisible :: Int -> Int -> Bool divisible m n = m `rem` n == 0 âÌÁÇÏÄÁÒÑ ÏÔÌÏÖÅÎÎÙÍ ×ÙÞÉÓÌÅÎÉÑÍ ÔÏÌØËÏ ÔÁ ÞÁÓÔØ ËÁÖÄÏÇÏ ÓÉÓËÁ ÏÂÒÁÂÁÔÙ×ÁÅÔÓÑ, ËÏÔÏÒÁÑ ÔÒÅÂÕÅÔÓÑ ÄÌÑ ÏÌÕÞÅÎÉÑ ÖÅÌÁÅ ÍÏÇÏ ÏÔ×ÅÔÁ. äÌÑ ÔÏÇÏ ÞÔÏÂÙ ÎÁÊÔÉ ÓÌÅÄÕÀÝÅÅ ÒÏÓÔÏÅ ÞÉÓÌÏ, ÎÁÈÏ ÄÑÔÓÑ ÄÏÏÌÎÉÔÅÌØÎÙÅ ÜÌÅÍÅÎÔÙ ËÁÖÄÏÇÏ ÓÉÓËÁ, ÎÏ ÒÏ×ÎÏ ÓÔÏÌØ ËÏ, ÓËÏÌØËÏ ÎÅÏÂÈÏÄÉÍÏ.
---> primenums [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71, 73,79,83,89,97,101,103,107,109,113,127,131,137,139,149, 151,157,163,167,173,179,181,191,193,197,199,211,223,227, 229,233,239,241,251,257,263,269,271,277,281,283,293,307, 311,313,317,331{Interrupted!} úÁÞÁÓÔÕÀ ÂÙ×ÁÅÔ ÓÌÏÖÎÏ (ËÁË × ÜÔÏÍ ÒÉÍÅÒÅ) ÏÒÅÄÅÌÉÔØ, ÞÔÏ ×Ù ÞÉÓÌÑÅÔÓÑ × ÔÅËÕÝÉÊ ÍÏÍÅÎÔ. îÏ × ÜÔÏÍ É ÎÅÔ ÎÅÏÂÈÏÄÉÍÏÓÔÉ: ÒÉ ÒÁÚÒÁÂÏÔËÅ ÒÏÇÒÁÍÍ ÄÏÓÔÁÔÏÞÎÏ ÚÎÁÔØ, ÞÔÏ ÂÅÓËÏÎÅÞÎÙÅ ÓÉÓËÉ
H
144
VI. óÔÒÕËÔÕÒÙ ÄÁÎÎÙÈ
ÓÕÝÅÓÔ×ÕÀÔ; ÏÒÑÄÏË ×ÙÞÉÓÌÅÎÉÑ ÖÅ ÂÕÄÅÔ Á×ÔÏÍÁÔÉÞÅÓËÉ ÏÔÉ ÍÉÚÉÒÏ×ÁÎ Ó ÏÍÏÝØÀ ÓÔÒÁÔÅÇÉÉ ÏÔÌÏÖÅÎÎÙÈ ×ÙÞÉÓÌÅÎÉÊ. ¾ðÓÅ×ÄÏÓÌÕÞÁÊÎÙÅ¿ ÞÉÓÌÁ
þÉÓÌÁ, ËÏÔÏÒÙÅ ×ÙÂÉÒÁÀÔÓÑ ÓÌÕÞÁÊÎÙÍ ÏÂÒÁÚÏÍ, ÎÁÈÏÄÑÔ ÍÎÏ ÖÅÓÔ×Ï ÏÌÅÚÎÙÈ ÒÉÍÅÎÅÎÉÊ: ÒÉ ÍÏÄÅÌÉÒÏ×ÁÎÉÉ ÎÁ ËÏÍØÀÔÅÒÅ ÅÓÔÅÓÔ×ÅÎÎÙÈ Ñ×ÌÅÎÉÊ (ÎÁÒÉÍÅÒ, ÓÌÕÞÁÊÎÙÅ ÓÔÏÌËÎÏ×ÅÎÉÑ ÞÁÓÔÉ × ÑÄÅÒÎÏÊ ÆÉÚÉËÅ ÉÌÉ ÏÑ×ÌÅÎÉÅ ÌÀÄÅÊ × ÏÞÅÒÅÄÉ ÞÅÒÅÚ ÓÌÕÞÁÊÎÙÅ ÒÏÍÅÖÕÔËÉ ×ÒÅÍÅÎÉ), ÄÌÑ ÒÅÛÅÎÉÑ ÓÌÏÖÎÙÈ ÚÁÄÁÞ ÞÉÓÌÅÎÎÏÇÏ ÁÎÁÌÉÚÁ (ÔÁËÉÈ, ËÁË ÍÅÔÏÄ íÏÎÔÅ-ëÁÒÌÏ ÎÁÈÏÖÄÅÎÉÑ ÌÏÝÁÄÅÊ), ÒÉ ÔÅÓÔÉÒÏ×ÁÎÉÉ ËÏÍØÀÔÅÒÎÙÈ ÒÏÇÒÁÍÍ × ËÁÞÅÓÔ×Å ÉÓÈÏÄÎÙÈ ÄÁÎÎÙÈ. óÒÁÚÕ ÏÓÌÅ ÏÑ×ÌÅÎÉÑ ËÏÍØÀÔÅÒÏ× ÎÁÞÁÌÉÓØ ÉÓÓÌÅÄÏ×ÁÎÉÑ ÜÆÆÅËÔÉ×ÎÏÇÏ ÓÏÓÏÂÁ ÏÌÕÞÅÎÉÑ ÓÌÕÞÁÊÎÙÈ ÞÉÓÅÌ. âÙÌÉ ÒÅÄ ÌÏÖÅÎÙ ÄÅÓÑÔËÉ ÍÅÔÏÄÏ× ÇÅÎÅÒÁ ÉÉ ÔÁËÉÈ ÞÉÓÅÌ. íÎÏÇÉÅ ÉÚ ÒÁÎ ÎÉÈ ÇÅÎÅÒÁÔÏÒÏ× (ÄÁÔÞÉËÏ×) ÓÌÕÞÁÊÎÙÈ ÞÉÓÅÌ ÒÁÂÏÔÁÌÉ ÎÅÄÏÓÔÁ ÔÏÞÎÏ ÜÆÆÅËÔÉ×ÎÏ (ÔÏ ÅÓÔØ, ÏÌÕÞÁÅÍÁÑ Ó ÉÈ ÏÍÏÝØÀ ÏÓÌÅÄÏ×Á ÔÅÌØÎÏÓÔØ ÞÉÓÅÌ ÎÅ ÕÄÏ×ÌÅÔ×ÏÒÑÌÁ ÒÁÚÎÏÏÂÒÁÚÎÙÍ ÓÔÁÔÉÓÔÉÞÅÓËÉÍ ËÒÉÔÅÒÉÑÍ). äÏÎÁÌØÄ ëÎÕÔ × Ó×ÏÅÊ ÛÉÒÏËÏ ÉÚ×ÅÓÔÎÏÊ ËÎÉÇÅ ¾éÓ ËÕÓÓÔ×Ï ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÑ¿ [4℄ ÒÉ×ÏÄÉÔ ÉÓÞÅÒÙ×ÁÀÝÉÊ ÏÂÚÏÒ É ÁÎÁÌÉÚ ÒÁÚÌÉÞÎÙÈ ÇÅÎÅÒÁÔÏÒÏ×. ÁÍ ÖÅ ÒÉ×ÏÄÉÔÓÑ ÄÏÓÔÁÔÏÞÎÏ ÒÏÓÔÏÊ, ÎÏ ×ÏÌÎÅ ËÁÞÅÓÔ×ÅÎÎÙÊ ÁÌÇÏÒÉÔÍ ÄÌÑ ÏÌÕÞÅÎÉÑ ÞÉÓÅÌ, ¾ÓÌÕÞÁÊÎÏ¿ ÒÁÓÒÅÄÅÌÅÎÎÙÈ ÎÁ ÉÎÔÅÒ×ÁÌÅ ÏÔ ÎÕÌÑ ÄÏ 2147483647. îÉÖÅ ÒÉ×ÏÄÉÔÓÑ ÅÇÏ ÒÅÁÌÉÚÁ ÉÑ ÎÁ ÑÚÙËÅ Haskell:
next_seed :: Int -> Int next_seed n =
ase test>0 of True -> test False -> test + 2147483647 where test = 48271 * lo - 3399 * hi hi = n `div` 44488 lo = n `mod` 44488 îÁÞÁÌØÎÏÅ ÚÎÁÞÅÎÉÅ n ÍÏÖÅÔ ÂÙÔØ ×ÙÂÒÁÎÏ ÒÏÉÚ×ÏÌØÎÏ. äÌÑ Ï ÌÕÞÅÎÉÑ ÒÁÚÌÉÞÎÙÈ ÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔÅÊ ÓÌÅÄÕÅÔ ÒÉÍÅÎÉÔØ ÄÁÎ ÎÙÊ ÁÌÇÏÒÉÔÍ Ó ÄÒÕÇÏÍÕ ÎÁÞÁÌØÎÏÍÕ ÚÎÁÞÅÎÉÀ. ÷ÙÚÏ× ÆÕÎË ÉÉ next_seed ÄÁÅÔ ÅÒ×ÏÅ ¾ÓÅ×ÄÏÓÌÕÞÁÊÎÏÅ¿ ÞÉÓÌÏ, ÅÒÅÄÁ×ÁÅÍÏÅ ÅÊ ÓÎÏ×Á × ËÁÞÅÓÔ×Å ÎÏ×ÏÇÏ ÁÒÇÕÍÅÎÔÁ. äÌÑ ÒÅÁÌÉÚÁ ÉÉ ÜÔÏÇÏ ÏÄÈÏÄÁ ÕÄÏÂÎÏ ÉÓÏÌØÚÏ×ÁÔØ ÆÕÎË ÉÀ iterate:
rand :: [Int℄
3. âÅÓËÏÎÅÞÎÙÅ ÓÉÓËÉ
145
rand = iterate next_seed 23765492 éÚ ÂÅÓËÏÎÅÞÎÏÇÏ ÓÉÓËÁ, ÇÅÎÅÒÉÒÕÅÍÏÇÏ ÆÕÎË ÉÅÊ rand, ÓÌÅÄÕÅÔ ×ÙÂÒÁÔØ ÔÒÅÂÕÅÍÏÅ ÞÉÓÌÏ ÎÁÞÁÌØÎÙÈ ÜÌÅÍÅÎÔÏ× ÒÉ ÏÍÏÝÉ ÆÕÎË ÉÉ take, ÎÁÒÉÍÅÒ,
---> take 5 rand [23765492,427796834,2125708109,1139992232,1444060144℄ äÌÑ ÏÌÕÞÅÎÉÑ ÓÉÓËÁ ÓÌÕÞÁÊÎÙÈ ÞÉÓÅÌ, ÍÅÎØÛÉÈ ÎÅËÏÔÏÒÏÇÏ ÚÁÄÁÎÎÏÇÏ ÚÎÁÞÅÎÉÑ (ÎÁÒÉÍÅÒ, 100), ÍÏÖÎÏ ÂÒÁÔØ ÏÓÔÁÔÏË ÏÔ ÄÅ ÌÅÎÉÑ ÓÌÕÞÁÊÎÏÇÏ ÞÉÓÌÁ ÎÁ ÄÁÎÎÏÅ.
rand :: [Int℄ rand = [ x `mod` 100 | x <- iterate next_seed 23765492 ℄ ÷ ÒÅÚÕÌØÔÁÔÅ ×ÙÚÏ×Á ÔÁË ÏÒÅÄÅÌÅÎÎÏÊ ÆÕÎË ÉÉ ÏÌÕÞÁÅÔÓÑ ÂÅÓËÏ ÎÅÞÎÙÈ ÓÉÓÏË ÞÉÓÅÌ × ÄÉÁÁÚÏÎÅ ÏÔ 0 ÄÏ 99.
---> take 20 rand [92,34,9,32,44,51,46,21,5,54,19,70,70,99,5,69,88,3,17,3℄
H
H
I õÒÁÖÎÅÎÉÅ VI.3.2
óÕÝÅÓÔ×ÕÅÔ ÂÏÌØÛÏÅ ÞÉÓÌÏ ÎÁÕÞÎÏ ÏÂÏÓÎÏ×ÁÎÎÙÈ ËÒÉÔÅÒÉÅ× ÄÏ ÂÒÏÔÎÏÓÔÉ ÇÅÎÅÒÁÔÏÒÏ× ÓÌÕÞÁÊÎÙÈ ÞÉÓÅÌ, ÏÉÓÁÎÎÙÈ, ÎÁÒÉÍÅÒ, × [4℄. îÏ ÄÁÖÅ ÂÅÚ ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÅÊ ÔÅÏÒÉÉ ÉÎÔÕÉÔÉ×ÎÏ ÑÓÎÏ, ÞÔÏ × ÓÌÕÞÁÊÎÏÊ ÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔÉ ËÏÌÉÞÅÓÔ×Ï ÞÅÔÎÙÈ É ÎÅÞÅÔÎÙÈ ÞÉÓÅÌ ÄÏÌÖÎÏ ÂÙÔØ ÒÉÂÌÉÚÉÔÅÌØÎÏ ÒÁ×ÎÏ. îÁÉÛÅÍ ÒÏÇÒÁÍÍÕ, ÏÄÓÞÉÔÙ×ÁÀÝÕÀ ÄÏÌÀ ÞÅÔÎÙÈ É ÎÅÞÅÔÎÙÈ ÞÉÓÅÌ × ÏÓÌÅÄÏ×ÁÔÅÌØ ÎÏÓÔÉ, ÏÌÕÞÁÅÍÏÊ Ó ÏÍÏÝØÀ ÏÉÓÁÎÎÏÇÏ ×ÙÛÅ ÇÅÎÅÒÁÔÏÒÁ ÓÌÕ ÞÁÊÎÙÈ ÞÉÓÅÌ. óÎÁÞÁÌÁ ÏÒÅÄÅÌÉÍ ÆÕÎË ÉÀ quantum, ×ÏÚ×ÒÁÝÁÀÝÕÀ ÁÒÕ ÞÉÓÅÌ ÞÉÓÌÏ ÎÅÞÅÔÎÙÈ É ÞÅÔÎÙÈ ÞÉÓÅÌ × ÓÉÓËÅ, Ñ×ÌÑÀÝÉÍÓÑ ÁÒÇÕÍÅÎÔÏÍ ÄÁÎÎÏÊ ÆÕÎË ÉÉ:
quantum
:: [Int℄ ->(Int, Int)
quantum [ ℄ = (0, 0) quantum (x:xs) =
ase odd x of True -> (u+1, v) False -> ( u, v+1) where (u, v) = quantum xs
VI. óÔÒÕËÔÕÒÙ ÄÁÎÎÙÈ
146
ðÏÄÓÞÉÔÁÅÍ Ó ÅÅ ÏÍÏÝØÀ ÞÉÓÌÏ ÞÅÔÎÙÈ É ÎÅÞÅÔÎÙÈ ÞÉÓÅÌ ÓÒÅÄÉ ÅÒ×ÏÊ ÔÙÓÑÞÉ ÅÌÙÈ ÞÉÓÅÌ:
---> quantum [1 .. 1000℄ (500,500)
æÕÎË ÉÑ proportion ÏÄÓÞÉÔÙ×ÁÅÔ ÄÏÌÀ ËÁÖÄÏÇÏ ÜÌÅÍÅÎÔÁ Á ÒÙ ÏÔ ÉÈ ÓÕÍÍÁÒÎÏÇÏ ËÏÌÉÞÅÓÔ×Á:
proportion :: (Int, Int) -> (Float, Float) proportion (0, 0) = (0.0, 0.0) proportion (0, _) = (0.0, 1.0) proportion (_, 0) = (1.0, 0.0) proportion (a, b) = (fromInt a / , fromInt b / ) where = fromInt(a+b)
ïÓÔÁÅÔÓÑ ÒÉÍÅÎÉÔØ ËÏÍÏÚÉ ÉÀ ÜÔÉÈ ÆÕÎË ÉÊ Ë ÓÉÓËÕ ÓÌÕÞÁÊ ÎÙÈ ÞÉÓÅÌ, ÏÌÕÞÅÎÎÏÇÏ Ó ÏÍÏÝØÀ ÆÕÎË ÉÉ rn:
rn :: Int -> [Int℄ rn n = take n rand test :: Int -> (Float, Float) test = proportion . quantum . rn
H
ïÂÒÁÔÉÔÅ ×ÎÉÍÁÎÉÅ, ÞÔÏ ÆÕÎË ÉÑ test ÏÒÅÄÅÌÅÎÁ × ÞÉÓÔÏ ÆÕÎË ÉÏÎÁÌØÎÏÍ ÓÔÉÌÅ ËÁË ËÏÍÏÚÉ ÉÑ ÔÒÅÈ ÆÕÎË ÉÊ. ÅÅÒØ ÍÏÖÎÏ ÒÏ×ÅÓÔÉ ÔÅÓÔÉÒÏ×ÁÎÉÅ ÏÌÕÞÅÎÎÏÊ ÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔÉ:
---> test 500 (0.508,0.492) ---> test 5000 (0.5008,0.4992) ëÁË ×ÉÄÉÍ, ÄÏÌÉ ÞÅÔÎÙÈ É ÎÅÞÅÔÎÙÈ ÞÉÓÅÌ ÄÏÓÔÁÔÏÞÎÏ ÂÌÉÚËÉ.
I õÒÁÖÎÅÎÉÅ VI.3.3
J
òÁÓÓÍÏÔÒÉÍ ÅÝÅ ÏÄÉÎ ÁÌÇÏÒÉÔÍ ÓÏÒÔÉÒÏ×ËÉ ÓÉÓËÏ× ÔÁË ÎÁÚÙ ×ÁÅÍÕÀ ¾ÂÙÓÔÒÕÀ¿ ÓÏÒÔÉÒÏ×ËÕ ( ):
qui ksort
qui ksort :: Ord a => [a℄ -> [a℄ qui ksort [℄ = [℄ qui ksort (x:xs) = qui ksort [y | y <- xs, y <= x℄ ++ [x℄ ++ qui ksort [y | y <- xs, y > x℄
H
4. ëÏÒÔÅÖÉ
147
ðÏÌÕÞÉÔÅ 400 ÞÉÓÅÌ ÒÉ ÏÍÏÝÉ ÇÅÎÅÒÁÔÏÒÁ ÓÌÕÞÁÊÎÙÈ ÞÉÓÅÌ, ÏÉÓÁÎÎÏÇÏ ÎÁ ÓÔÒ. 144. ÷ËÌÀÞÉÔÅ ÓÔÁÔÉÓÔÉÞÅÓËÕÀ Ï ÉÀ ÉÎÔÅÒ ÒÅÔÁÔÏÒÁ É ÕÂÅÄÉÔÅÓØ × ÔÏÍ, ÞÔÏ ÎÁÚ×ÁÎÉÅ ÜÔÏÊ ÆÕÎË ÉÉ ÏÔÒÁ ÖÁÅÔ ÅÅ ÒÏÉÚ×ÏÄÉÔÅÌØÎÏÓÔØ, ÓÒÁ×ÎÉ× ÅÅ Ó ÄÒÕÇÉÍÉ ÓÏÒÔÉÒÏ×ËÁÍÉ, ÒÁÓÓÍÏÔÒÅÎÎÙÍÉ ÒÁÎÅÅ:
---> qui ksort (take 400 rand) . . . (85142 redu tions, 114637 ells) ---> msort (take 400 rand) . . . (141649 redu tions, 189366 ells) ---> isort (take 400 rand) (403054 redu tions, 526123 ells, 2 garbage olle tions) ðÒÉ ÏÂÒÁÂÏÔËÅ ÏÓÌÅÄÎÅÇÏ ×ÙÚÏ×Á Hugs Ä×ÁÖÄÙ ÉÓÏÌØÚÏ×ÁÌ ÍÅÈÁ ÎÉÚÍ ¾×ÓÔÒÏÅÎÎÏÊ ÓÂÏÒËÉ ÍÕÓÏÒÁ¿ (garbage olle tion), Ô. Å. ÕÄÁÌÑÌ ÉÚ ÁÍÑÔÉ ÄÁÎÎÙÅ, ËÏÔÏÒÙÅ ÎÅ ÔÒÅÂÕÀÔÓÑ ÄÌÑ ÄÁÌØÎÅÊÛÉÈ ×ÙÞÉ ÓÌÅÎÉÊ. ðÏÄÏÂÎÏÇÏ ÒÏÄÁ ÔÅÈÎÉËÕ Á×ÔÏÍÁÔÉÞÅÓËÏÇÏ ÏÓ×ÏÂÏÖÄÅÎÉÑ ÎÅ ÕÓÏÌØÚÕÅÍÙÈ ÕÞÁÓÔËÏ× ÁÍÑÔÉ ÉÓÏÌØÚÕÀÔ ÍÎÏÇÉÅ ÓÏ×ÒÅÍÅÎ ÎÙÅ ÑÚÙËÉ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÑ, ÎÁÒÉÍÅÒ, Java, Ruby.
J
÷ÏÒÏÓÙ É ÚÁÄÁÎÉÑ VI.3.1
éÚÍÅÎÉÔÅ ÆÕÎË ÉÀ rand ÔÁËÉÍ ÏÂÒÁÚÏÍ, ÞÔÏÂÙ ÍÏÖÎÏ ÂÙÌÏ ÂÙ ÚÁÄÁ×ÁÔØ ÎÁÞÁÌØÎÏÅ ÚÎÁÞÅÎÉÅ ÄÁÔÞÉËÁ × ËÁÞÅÓÔ×Å ÁÒÁÍÅÔÒÁ ÆÕÎË ÉÉ. ðÒÏ×ÅÄÉÔÅ ÎÅÓËÏÌØËÏ ÜËÓÅÒÉÍÅÎÔÏ×, ÏÒÅÄÅÌÑÑ ÄÏÌÉ ÞÅÔÎÙÈ É ÎÅÞÅÔÎÙÈ ÞÉÓÅÌ × ÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔÑÈ, ÏÌÕÞÅÎÎÙÈ ÒÉ ÒÁÚÎÙÈ ÎÁÞÁÌØÎÙÈ ÚÎÁÞÅÎÉÑÈ.
4. ëÏÒÔÅÖÉ 4.1. éÓÏÌØÚÏ×ÁÎÉÅ ËÏÒÔÅÖÅÊ ÷ÓÅ ÜÌÅÍÅÎÔÙ ÓÉÓËÁ ÏÂÑÚÁÎÙ ÉÍÅÔØ ÏÄÉÎ É ÔÏÔ ÖÅ ÔÉ. äÌÑ ÈÒÁ ÎÅÎÉÑ ×ÅÌÉÞÉÎ ÒÁÚÌÉÞÎÙÈ ÔÉÏ× ÉÓÏÌØÚÕÀÔ ËÏÒÔÅÖÉ (ÔØÀÌÙ). þÁÓÔÏ Ï ËÏÒÔÅÖÁÈ ÇÏ×ÏÒÑÔ ËÁË Ï ÕÏÒÑÄÏÞÅÎÎÙÈ ÍÎÏÖÅÓÔ×ÁÈ, ÔÁË ËÁË ÄÌÑ ÎÉÈ ×ÁÖÅÎ ÏÒÑÄÏË ÒÁÚÍÅÝÅÎÉÑ ÜÌÅÍÅÎÔÏ×, ÎÁÒÉÍÅÒ,
H
VI. óÔÒÕËÔÕÒÙ ÄÁÎÎÙÈ
148
(True, 23) É (23, True) Ñ×ÌÑÀÔÓÑ ÓÏ×ÅÒÛÅÎÎÏ ÒÁÚÌÉÞÎÙÍÉ ËÏÒ ÔÅÖÁÍÉ. ÷ ÒÅÌÀÄÉÉ ÏÒÅÄÅÌÅÎÙ ÎÅÓËÏÌØËÏ ÆÕÎË ÉÊ ÄÌÑ ÒÁÂÏÔÙ Ó ÔØÀÌÁÍÉ: fst fst (x,_)
:: (a,b) -> a = x
snd snd (_,y)
:: (a,b) -> b = y
ðÏ ÁÎÁÌÏÇÉÉ ÍÏÖÎÏ ÚÁÄÁÔØ ÆÕÎË ÉÉ ÄÌÑ ×ÙÄÅÌÅÎÉÑ ÓÏÓÔÁ×ÎÙÈ ÞÁ ÓÔÅÊ ÔÒÏÅË:
fst3 :: fst3(x, _, _) = snd3 :: snd3(_, y, _) = thd3 :: thd3(_, _, z) =
(a, b, ) -> a x (a, b, ) -> b y (a, b, ) -> z
üÔÉ ÆÕÎË ÉÉ ÏÌÉÍÏÒÆÎÙ, ÔÁË ËÁË ÏÎÉ ÍÏÇÕÔ ÒÉÍÅÎÑÔØÓÑ Ë Ä×ÏÊ ËÁÍ É ÔÒÏÊËÁÍ, ÓÏÄÅÒÖÁÝÉÍ ÄÁÎÎÙÅ ÌÀÂÏÇÏ ÔÉÁ. ïÄÎÁËÏ ÍÏÖÎÏ ÏÒÅÄÅÌÑÔØ ÆÕÎË ÉÉ ÎÁ ÔØÀÌÁÈ ÆÉËÓÉÒÏ×ÁÎÎÏÇÏ ÔÉÁ, ÎÁÒÉÍÅÒ:
f :: (Int, Char) -> [Char℄ f (n, ) = intString n ++ [ ℄ åÓÌÉ ÇÒÕÉÒÕÀÔÓÑ ×ÍÅÓÔÅ Ä×Å ×ÅÌÉÞÉÎÙ, ÉÍÅÀÝÉÅ ÏÄÉÎÁËÏ ×ÙÊ ÔÉ, ÔÏ ×Ù ÍÏÖÅÔÅ ÉÓÏÌØÚÏ×ÁÔØ ÓÉÓÏË ÄÌÑ ÉÈ ÈÒÁÎÅÎÉÑ. ÅÍ ÎÅ ÍÅÎÅÅ, ÎÉÞÔÏ ÎÅ ÍÅÛÁÅÔ ÏÂßÅÄÉÎÉÔØ ÉÈ × ËÏÒÔÅÖ. ÏÞËÁ ÎÁ ÌÏÓ ËÏÓÔÉ, ÎÁÒÉÍÅÒ, ÏÉÓÙ×ÁÅÔÓÑ Ä×ÕÍÑ ÞÉÓÌÁÍÉ ÔÉÁ Float. åÅ ÍÏÖ ÎÏ ÒÅÄÓÔÁ×ÉÔØ É ËÁË ÓÉÓÏË ÉÚ Ä×ÕÈ ÜÌÅÍÅÎÔÏ× É ËÁË ÁÒÕ ÞÉÓÅÌ. ÷ ÏÂÏÉÈ ÓÌÕÞÁÑÈ ÍÏÖÎÏ ÏÒÅÄÅÌÉÔØ ÆÕÎË ÉÉ ÄÌÑ ÒÁÂÏÔÙ Ó ÔÏÞ ËÁÍÉ, ÎÁÒÉÍÅÒ, ÆÕÎË ÉÀ, ÏÒÅÄÅÌÑÀÝÅÅ ÒÁÓÓÔÏÑÎÉÅ ÏÔ ÔÏÞËÉ ÄÏ ÎÁÞÁÌÁ ËÏÏÒÄÉÎÁÔ. îÉÖÅ ÒÅÄÓÔÁ×ÌÅÎÙ Ä×Å ÆÕÎË ÉÉ: distan eL, ÏÒÅÄÅÌÅÎÎÕÀ ÎÁ ÓÉÓËÅ, É distan eT, ÉÓÏÌØÚÕÀÝÕÀ ËÏÒÔÅÖÉ:
distan eL :: [Float℄ -> Float distan eL [x, y℄ = sqrt (x*x + y*y) distan eT :: (Float, Float) -> Float distan eT (x, y) = sqrt (x*x + y*y) ðÒÉ ËÏÒÒÅËÔÎÏÍ ×ÙÚÏ×Å ÜÔÉÈ ÆÕÎË ÉÊ ÎÅÔ ÎÉËÁËÉÈ ÒÁÚÌÉÞÉÊ × ÉÈ ÉÓÏÌØÚÏ×ÁÎÉÉ. îÏ ÍÏÖÅÔ ÔÁË ÓÌÕÞÉÔØÓÑ, ÞÔÏ × ÒÅÚÕÌØÔÁÔÅ ÏÛÉÂËÉ
4. ëÏÒÔÅÖÉ
149
××ÏÄÁ ÉÌÉ ÌÏÇÉÞÅÓËÏÊ ÏÛÉÂËÉ ÆÕÎË ÉÑ ÂÕÄÅÔ ×ÙÚ×ÁÎÁ Ó ÔÒÅÍÑ Á ÒÁÍÅÔÒÁÍÉ. ÷ ÓÌÕÞÁÅ distan eT ÏÛÉÂËÁ ÂÕÄÅÔ ÏÂÎÁÒÕÖÅÎÁ ÅÝÅ ÎÁ ÜÔÁÅ ÁÎÁÌÉÚÁ ÒÏÇÒÁÍÍÙ: ËÏÒÔÅÖ ÉÚ ÔÒÅÈ ÞÉÓÅÌ ÏÔÎÏÓÉÔÓÑ ÓÏ×ÓÅÍ Ë ÄÒÕÇÏÍÕ ÔÉÕ ÄÁÎÎÙÈ.
---> distan eL [3, 5.0 ---> distan eT (3, 5.0 ---> distan eT (3, ERROR - Type error *** Expression *** Term *** Type *** Does not mat h
4℄
H
4) 4, 6) in appli ation : distan eT (3,4,6) : (3,4,6) : (a,b, ) : (Float,Float)
ðÒÉ ÉÓÏÌØÚÏ×ÁÎÉÉ distan eL ÏÛÉÂËÁ ÔÁËÖÅ ÂÕÄÅÔ ÏÂÎÁÒÕÖÅÎÁ, ÎÏ ÕÖÅ ÎÁ ÜÔÁÅ ×ÙÏÌÎÅÎÉÑ ÆÕÎË ÉÉ. ðÒÉ ÓÏÏÓÔÁ×ÌÅÎÉÉ ×ÈÏÄÎÙÈ ÄÁÎÎÙÈ Ó ÏÂÒÁÚ ÏÍ ÓÉÓËÁ (ÓÏÄÅÒÖÁÝÉÍ ×ÓÅÇÏ Ä×Á ÜÌÅÍÅÎÔÁ!) × ÏÒÅÄÅÌÅÎÉÉ ÆÕÎË ÉÉ ÂÕÄÅÔ ×ÙÑ×ÌÅÎÏ ÉÈ ÎÅÓÏÏÔ×ÅÔÓÔ×ÉÅ:
---> distan eL [3, 4, 6℄
H
Program error: {distan eL [Num_fromInt instNum_v47 3, Num_fromInt instNum_v47 4,Num_fromInt instNum_v47 6℄} ÷ ÜÔÏÍ ÒÉÍÅÒÅ ÉÓÏÌØÚÏ×ÁÎÉÅ ËÏÒÔÅÖÁ ×ÍÅÓÔÏ ÓÉÓËÁ Ñ×ÌÑÅÔÓÑ ÂÏÌÅÅ ÒÅÄÏÞÔÉÔÅÌØÎÙÍ, ÔÁË ËÁË ÒÉ ×ÙÚÏ×Å ÆÕÎË ÉÉ distan eT ÏÛÉÂËÁ ×ÙÑ×ÌÑÌÉÓØ ÎÁ ÂÏÌÅÅ ÒÁÎÎÅÊ ÓÔÁÄÉÉ. éÓÏÌØÚÏ×ÁÎÉÅ ËÏÒÔÅÖÅÊ ÏÚ×ÏÌÑÅÔ ÌÅÇËÏ ÏÒÅÄÅÌÑÔØ ÆÕÎË ÉÉ, ×ÏÚ×ÒÁÝÁÀÝÉÅ ÓÒÁÚÕ ÎÅÓËÏÌØËÏ ÚÎÁÞÅÎÉÊ. ÷ ÓÌÕÞÁÅ Ó ÎÅÓËÏÌØ ËÉÍÉ ÁÒÇÕÍÅÎÔÁÍÉ ÅÝÅ ÍÏÖÅÔ ×ÙÒÕÞÉÔØ ÉÓÏÌØÚÏ×ÁÎÉÅ ÍÅÈÁÎÉÚÍÁ ËÁÒÒÉÎÇÁ, ÎÏ ÄÌÑ ÆÕÎË ÉÊ Ó ÎÅÓËÏÌØËÉÍÉ ÒÅÚÕÌØÔÁÔÁÍÉ ÁÌØÔÅÒÎÁ ÔÉ×Ù ÉÓÏÌØÚÏ×ÁÎÉÑ ËÏÒÔÅÖÅÊ ÎÅÔ! ðÒÉÍÅÒÏÍ ÏÄÏÂÎÏÊ ÆÕÎË ÉÉ ÍÏÖÅÔ ÓÌÕÖÉÔØ ÓÌÅÄÕÀÝÁÑ ÆÕÎË ÉÑ, ÒÁÚÂÉ×ÁÀÝÁÑ ÓÉÓÏË ÎÁ Ä×Å ÞÁÓÔÉ:
splitAt :: Int -> [a℄ -> ([a℄, [a℄) splitAt n xs = (take n xs, drop n xs) óÌÅÄÕÀÝÁÑ ×ÅÒÓÉÑ ÜÔÏÊ ÆÕÎË ÉÉ ÂÏÌÅÅ ÜÆÆÅËÔÉ×ÎÁ:
splitAt :: splitAt 0 xs = splitAt n [℄ = splitAt (n+1) (x:xs) =
Int -> [a℄ -> ([a℄, [a℄) ([℄, xs) ([℄, [℄) (x:ys, zs)
VI. óÔÒÕËÔÕÒÙ ÄÁÎÎÙÈ
150
where (ys, zs) = splitAt n xs ÷ÙÚÏ× splitAt 2 "Haskell" ×ÏÚ×ÒÁÔÉÔ ÔØÀÌ ("Ha", "skell"). ÷ ÒÅËÕÒÓÉ×ÎÏÍ ÒÁ×ÉÌÅ ÜÔÏÊ ÆÕÎË ÉÉ ÏËÁÚÁÎÏ, ËÁË ÍÏÖÎÏ ÉÓ ÏÌØÚÏ×ÁÔØ ÏÂÒÁÚ Ù ÒÉ ÒÁÂÏÔÅ Ó ËÁÒÔÅÖÁÍÉ.
4.2. ëÏÒÔÅÖÉ É ÓÉÓËÉ
ëÏÒÔÅÖÉ ÞÁÓÔÏ Ñ×ÌÑÀÔÓÑ ÜÌÅÍÅÎÔÁÍÉ ÓÉÓËÁ. óÉÓÏË, ÓÏÄÅÒÖÁ ÝÉÊ ÁÒÙ, ÉÓÏÌØÚÕÀÔ ÄÌÑ ÏÒÇÁÎÉÚÁ ÉÉ ÏÉÓËÁ (ÓÌÏ×ÁÒÉ, ÔÅÌÅÆÏÎ ÎÙÅ ÓÒÁ×ÏÞÎÉËÉ É Ô..). æÕÎË ÉÑ ÏÉÓËÁ sear h ÍÏÖÅÔ ÂÙÔØ ÌÅÇ ËÏ ÚÁÉÓÁÎÁ Ó ÏÍÏÝØÀ ÏÂÒÁÚ Á, Ñ×ÌÑÀÝÅÇÏÓÑ ÎÅÕÓÔÙÍ ÓÉÓËÏÍ Ó ÅÒ×ÙÍ ÜÌÅÍÅÎÔÏÍ × ×ÉÄÅ ÁÒÙ:
sear h :: Eq a => [(a, b)℄ -> a -> b sear h ((x, y):ts) s | x == s = y | otherwise = sear h ts s úÁÄÁÎÎÁÑ ÔÁËÉÍ ÏÂÒÁÚÏÍ ÆÕÎË ÉÑ ÏÌÉÍÏÒÆÎÁ, ÔÁË ËÁË ÍÏÖÅÔ ÒÁ ÂÏÔÁÔØ Ó ÓÉÓËÏÍ ÁÒ ÌÀÂÏÇÏ ÒÏÉÚ×ÏÌØÎÏÇÏ ×ÉÄÁ. ïÄÎÁËÏ, ÜÌÅÍÅÎ ÔÙ ÒÉÈÏÄÉÔÓÑ ÓÒÁ×ÎÉ×ÁÔØ ÍÅÖÄÕ ÓÏÂÏÊ, ÏÜÔÏÍÕ ÔÒÅÂÕÅÔÓÑ ÒÉ ÎÁÄÌÅÖÎÏÓÔØ ÅÒ×ÙÈ ÜÌÅÍÅÎÔÏ× ÁÒ ËÌÁÓÓÕ Eq. æÕÎË ÉÑ ÏÉÓËÁ ÍÏÖÅÔ ÂÙÔØ ÌÅÇËÏ ÞÁÓÔÉÞÎÏ ÁÒÁÍÅÔÒÉÚÏ×ÁÎÁ ÕËÁÚÁÎÉÅÍ ÓÅ ÉÆÉ ÞÅÓËÏÇÏ ÓÉÓËÁ, ÎÁÒÉÍÅÒ,
telephoneNr = sear h telephoneDire tory translation = sear h di tionary óÉÓËÉ telephoneDire tory É di tionary ÍÏÇÕÔ ÏÒÅÄÅÌÑÔØÓÑ ÏÔ ÄÅÌØÎÏ. äÒÕÇÁÑ ÆÕÎË ÉÑ, ÉÓÏÌØÚÕÀÝÁÑ ÁÒÙ, ÎÁÍ ÕÖÅ ÉÚ×ÅÓÔÎÁ ÜÔÏ ÆÕÎË ÉÑ zip (ÓÔÒ. 124):
zip :: zip [ ℄ ys = zip (x:xs) [ ℄ = zip (x:xs) (y:ys) =
[a℄ -> [b℄ -> [(a,b)℄ [ ℄ [ ℄ (x, y) : zip xs ys
ðÒÉÍÅÒÏÍ ÆÕÎË ÉÉ ×ÙÓÛÅÇÏ ÏÒÑÄËÁ ÄÌÑ ÒÁÂÏÔÙ 2-ÔØÀÌÁÍÉ ÓÌÕ ÖÉÔ ÆÕÎË ÉÑ zipWith (ÓÔÒ. 126):
zipWith :: ( a -> b -> ) -> ([a℄ -> [b℄ ->[ ℄) zipWith f [℄ ys = [℄ zipWith f xs [℄ = [℄ zipWith f (x:xs) (y:ys) = f x y : zipWith f xs ys
4. ëÏÒÔÅÖÉ
151
üÔÁ ÆÕÎË ÉÑ ÒÉÍÅÎÑÅÔ ÆÕÎË ÉÀ (Ó Ä×ÕÍÑ ÁÒÁÍÅÔÒÁÍÉ) ËÏ ×ÓÅÍ ÜÌÅÍÅÎÔÁÍ Ä×ÕÈ ÓÉÓËÏ×. ïÔÍÅÔÉÍ, ÞÔÏ ÆÕÎË ÉÉ zip É zipWith × ÎÅËÏÔÏÒÏÊ ÓÔÅÅÎÉ Ñ×ÌÑÀÔÓÑ ÁÎÁÌÏÇÁÍÉ ÆÕÎË ÉÉ map, ËÏÔÏÒÁÑ ÒÉ ÍÅÎÑÅÔ ÆÕÎË ÉÀ (Ó ÏÄÎÉÍ ÁÒÁÍÅÔÒÏÍ) ËÏ ×ÓÅÍ ÜÌÅÍÅÎÔÁÍ ÓÉÓËÁ. íÏÖÎÏ ÄÁÔØ ÄÒÕÇÏÅ ÏÒÅÄÅÌÅÎÉÅ ÆÕÎË ÉÉ zip ËÁË ÞÁÓÔÉÞÎÏ ÁÒÁÍÅÔÒÉÚÏ×ÁÎÎÕÀ ÆÕÎË ÉÀ zipWith:
zip = zipWith makePair where makePair x y = (x, y)
I õÒÁÖÎÅÎÉÅ VI.4.1
ðÕÓÔØ ÁÒÁ ×ÉÄÁ (String, Int) ÈÒÁÎÉÔ ÉÎÆÏÒÍÁ ÉÀ Ï ÉÍÅÎÉ É ×ÏÚÒÁÓÔÅ ÞÅÌÏ×ÅËÁ. îÁÉÛÅÍ ÒÏÇÒÁÍÍÕ, ÏÒÅÄÅÌÑÀÝÕÀ Ï ÄÁÎÎÏ ÍÕ ÓÉÓËÕ ÔÁËÉÈ ÁÒ ÉÍÑ ÓÁÍÏÇÏ ÀÎÏÇÏ ÞÅÌÏ×ÅËÁ. óÎÁÞÁÌÁ ÎÁÉÛÅÍ ÆÕÎË ÉÀ, ËÏÔÏÒÁÑ ÉÚ Ä×ÕÈ ÔÁËÉÈ ÁÒ ×ÙÂÉ ÒÁÅÔ ÔÕ, ËÏÔÏÒÁÑ ÓÏÄÅÒÖÉÔ ÉÎÆÏÒÍÁ ÉÀ Ï ÂÏÌÅÅ ÀÎÏÍ ÞÅÌÏ×ÅËÅ:
younger :: (String, Int) -> (String, Int) -> (String, Int) younger p1(_, age1) p2(_, age2) = if age1 < age2 then p1 else p2 ïÂÒÁÔÉÔÅ ×ÎÉÍÁÎÉÅ ÎÁ ÉÓÏÌØÚÏ×ÁÎÉÅ -ÏÂÒÁÚ Ï× É ÁÎÏÎÉÍÎÙÈ Å ÒÅÍÅÎÎÙÈ × ÏÂÒÁÚ ÁÈ ÓÏÏÔ×ÅÔÓÔ×ÉÑ ÄÁÎÎÏÊ ÆÕÎË ÉÉ. òÅËÕÒÓÉ×ÎÁÑ ÆÕÎË ÉÑ youngest ÏÒÅÄÅÌÑÅÔ ÔØÀÌ, ÓÏÄÅÒÖÁ ÝÉÊ ÄÁÎÎÙÅ ÓÁÍÏÇÏ ÍÏÌÏÄÏÇÏ ÞÅÌÏ×ÅËÁ × ÎÅÕÓÔÏÍ ÓÉÓËÅ ÔÁËÉÈ ÁÒ:
youngest :: [(String, Int)℄ -> (String, Int) youngest (p : [℄) = p youngest (p:ps) = younger p (youngest ps) ÅÅÒØ ÓÏÚÄÁÄÉÍ ÓÉÓÏË Ó ÄÁÎÎÙÍÉ Ï ÞÌÅÎÁÈ ÎÅËÏÊ ÓÅÍØÉ É ÏÒÅÄÅÌÉÍ ÏÓÎÏ×ÎÕÀ ÆÕÎË ÉÀ main, ÅÞÁÔÁÀÝÕÀ ÉÍÑ ÓÁÍÏÇÏ ÍÏ ÌÏÄÏÇÏ ÞÌÅÎÁ ÜÔÏÊ ÓÅÍØÉ:
family :: [(String, Int)℄ family = [("óÔÅÁÎ", 7), ("ëÓÅÎÉÑ", 3), ("ðÁ×ÅÌ", 39), ("îÉÎÁ", 37)℄
main = let (name, _) = youngest family in putStr ("óÁÍÙÊ ÍÏÌÏÄÏÊ ÞÌÅÎ ÓÅÍØÉ - " ++ name ++ ".")
VI. óÔÒÕËÔÕÒÙ ÄÁÎÎÙÈ
152
H
æÕÎË ÉÑ putStr ÅÞÁÔÁÅÔ Ó×ÏÊ ÁÒÇÕÍÅÎÔ ÓÔÒÏËÕ. ðÏÓÍÏÔÒÉÔÅ ÎÁ ÒÅÚÕÌØÔÁÔ ÒÁÂÏÔÙ ÆÕÎË ÉÉ:
---> main óÁÍÙÊ ÍÏÌÏÄÏÊ ÞÌÅÎ ÓÅÍØÉ - ëÓÅÎÉÑ.
J
4.3. ëÏÒÔÅÖÉ É ËÁÒÒÉÎÇ
ëÏÒÔÅÖÉ ÏÚ×ÏÌÑÀÔ ÉÓÏÌØÚÏ×ÁÔØ ÎÅÓËÏÌØËÏ ÁÒÁÍÅÔÒÏ× Õ ÆÕÎË ÉÉ ÂÅÚ ÒÉ×ÌÅÞÅÎÉÑ ÍÅÈÁÎÉÚÍÁ ËÁÒÒÉÎÇÁ. ðÏÓÍÏÔÒÉÍ ÎÁ ÓÌÅ ÄÕÀÝÅÅ ÏÒÅÄÅÌÅÎÉÅ:
add (x, y) = x + y úÁÉÓØ ÜÔÏÊ ÆÕÎË ÉÉ ×ÙÇÌÑÄÉÔ ËÁË ÚÁÉÓØ ÆÕÎË ÉÉ, ÒÉÎÑÔÁÑ × ÍÁÔÅÍÁÔÉËÅ. âÏÌØÛÉÎÓÔ×Ï ÌÀÄÅÊ, ÇÌÑÄÑ ÎÁ ÔÁËÏÅ ÏÒÅÄÅÌÅÎÉÅ, ÓËÁ ÖÕÔ, ÞÔÏ ÚÁÄÁÎÁ ÆÕÎË ÉÑ ÏÔ Ä×ÕÈ ÁÒÇÕÍÅÎÔÏ× É ÞÔÏ ÁÒÁÍÅÔÒÙ ¾ÅÓÔÅÓÔ×ÅÎÎÏ¿ ÒÁÓÏÌÏÖÅÎÙ ×ÎÕÔÒÉ ÓËÏÂÏË. îÏ ÍÙ ÔÏ ÚÎÁÅÍ Õ ÜÔÏÊ ÆÕÎË ÉÉ ÏÄÉÎ ÁÒÁÍÅÔÒ: ËÏÒÔÅÖ ÉÚ Ä×ÕÈ ÞÉÓÅÌ, × ÅÅ ÏÒÅÄÅ ÌÅÎÉÉ ÒÉÓÕÔÓÔ×ÕÅÔ ÛÁÂÌÏÎ ËÏÒÔÅÖÁ. ÅÍ ÎÅ ÍÅÎÅÅ, ÉÓÏÌØÚÏ×ÁÎÉÅ ÍÅÈÁÎÉÚÍÁ ËÁÒÒÉÎÇÁ ÒÅÄÏÞÔÉ ÔÅÌØÎÅÅ ÒÁÂÏÔÙ Ó ÔØÀÌÁÍÉ. ëÁÒÒÉÒÏ×ÁÎÎÕÀ ÆÕÎË ÉÀ ÍÏÖÎÏ ÞÁ ÓÔÉÞÎÏ ×ÙÞÉÓÌÉÔØ (ÁÒÁÍÅÔÒÉÚÏ×ÁÔØ), Á ÆÕÎË ÉÀ, ÉÓÏÌØÚÕÀÝÕÀ ÔØÀÌ ÎÅÔ. ðÏÜÔÏÍÕ ×ÓÅ ÓÔÁÎÄÁÒÔÎÙÅ ÆÕÎË ÉÉ, ÚÁ×ÉÓÑÝÉÅ ÂÏÌÅÅ ÞÅÍ ÏÔ ÏÄÎÏÇÏ ÁÒÁÍÅÔÒÁ, ÉÓÏÌØÚÕÀÔ × ËÁÒÒÉÎÇÏ×ÏÊ ÆÏÒÍÅ.
îÁÏÍÎÉÍ, ÞÔÏ × ÒÅÌÀÄÉÉ ÓÏÄÅÒÖÁÔØÓÑ Ä×Å ÆÕÎË ÉÉ ÒÅÏÂÒÁ ÚÏ×ÁÎÉÑ ÆÕÎË ÉÊ (Ô. Å. ÂÅÒÕÝÉÅ ÆÕÎË ÉÉ × ËÁÞÅÓÔ×Å ÁÒÇÕÍÅÎÔÁ É ×ÏÚ×ÒÁÝÁÀÝÉÅ ÆÕÎË ÉÀ):
urry
urry f x y
:: ((a,b) -> ) -> (a -> b -> ) = f (x,y)
un urry :: (a -> b -> ) -> ((a,b) -> ) un urry f (x, y) = f x y
5. óÉÎÏÎÉÍÙ ðÅÒÅÄ ÔÅÍ ËÁË ÒÏÄÏÌÖÉÔØ, ÕÍÅÓÔÎÏ ××ÅÓÔÉ ÒÏÓÔÏÊ ÓÏÓÏ ÚÁ ÉÓÉ, ÏÚ×ÏÌÑÀÝÉÊ ÄÁ×ÁÔØ ÁÌØÔÅÒÎÁÔÉ×ÎÙÅ ÉÍÅÎÁ ÔÉÁÍ ÄÁÎÎÙÈ. úÁÄÁ×ÁÅÍÙÅ Ó ÏÍÏÝØÀ ÜÔÏÇÏ ÓÏÓÏÂÁ ÉÍÅÎÁ ÑÓÎÅÅ ÏÔÒÁÖÁÀÔ ÅÌÉ, ÒÁÄÉ ËÏÔÏÒÙÈ ××ÏÄÉÔÓÑ ÔÉ ÄÁÎÎÙÈ.
5. óÉÎÏÎÉÍÙ
153
ëÏÇÄÁ × ÎÅÓËÏÌØËÉÈ ÆÕÎË ÉÑÈ ÉÓÏÌØÚÕÅÔÓÑ ÏÄÉÎ É ÔÏÔ ÖÅ ÔÉ ËÏÒÔÅÖÁ ÉÌÉ ÓÉÓËÁ, ÓÔÁÎÏ×ÉÔÓÑ ÎÅÓËÏÌØËÏ ÕÔÏÍÉÔÅÌØÎÙÍ ÏÉÓÁ ÎÉÅ ÜÔÉÈ ÔÉÏ× × ÏÂßÑ×ÌÅÎÉÑÈ ÆÕÎË ÉÊ. ðÒÅÄÏÌÏÖÉÍ, ÞÔÏ ÎÁÍ ÔÒÅÂÕÅÔÓÑ ÎÁÉÓÁÔØ ÎÁÂÏÒ ÆÕÎË ÉÊ ÄÌÑ ÏÅÒÁ ÉÊ Ó ÔÏÞËÁÍÉ ÎÁ ÌÏÓËÏÓÔÉ: distan e ÒÁÓÓÔÏÑÎÉÅ ÏÔ ÔÏÞËÉ ÄÏ ÎÁÞÁÌÁ ËÏÏÒÄÉÎÁÔ, differen e ÒÁÓÓÔÏÑÎÉÅ ÍÅÖÄÕ Ä×ÕÍÑ ÔÏÞËÁÍÉ, area_polygon ÌÏÝÁÄØ ÍÎÏÇÏÕÇÏÌØÎÉËÁ, É transf_polygon ÆÕÎË ÉÀ ÔÒÁÎÓ ÆÏÒÍÁ ÉÉ ÍÎÏÇÏÕÇÏÌØÎÉËÁ. éÈ ÏÂßÑ×ÌÅÎÉÑ ÔÁËÏ×Ù:
distan e :: (Float, Float) -> Float differen e :: (Float, Float) ->(Float, Float) -> Float area_polygon :: [(Float, Float)℄ -> Float transf_polygon :: ((Float, Float) -> (Float, Float)) -> [(Float, Float)℄ -> [(Float, Float)℄ ëÁË ×ÉÄÉÍ × ÏÂßÑ×ÌÅÎÉÑÈ Õ ÎÁÓ ÏÓÔÏÑÎÎÏ Ï×ÔÏÒÑÅÔÓÑ ÏÉÓÁÎÉÅ ÁÒÙ, ÓÏÄÅÒÖÁÝÅÊ ËÏÏÒÄÉÎÁÔÙ ÏÔÄÅÌØÎÏÊ ÔÏÞËÉ. ÷ ÔÁËÏÍ ÓÌÕÞÁÅ ÕÄÏÂÎÏ ××ÅÓÔÉ ÎÏ×ÏÅ . ïÎÏ ÏÚ×ÏÌÉÔ ÑÓÎÅÅ ÏÔÒÁ ÚÉÔØ ÎÁÚÎÁÞÅÎÉÅ ÆÕÎË ÉÊ:
ÏÒÅÄÅÌÅÎÉÅ ÔÉÁ
type Point = (Float, Float) íÙ ÄÁÌÉ ÎÏ×ÏÅ ÏÒÅÄÅÌÅÎÉÅ Point (ÔÏÞËÁ) ÄÌÑ ÁÒÙ ÞÉÓÅÌ ÔÉÁ Float. ó ÉÓÏÌØÚÏ×ÁÎÉÅÍ ÔÁËÏÇÏ ÏÒÅÄÅÌÅÎÉÑ ÔÉÁ ÏÂßÑ×ÌÅÎÉÑ ÎÁ ÛÉÈ ÆÕÎË ÉÊ ÓÔÁÌÉ ÑÓÎÅÅ ÏÔÒÁÖÁÔØ ÎÁÚÎÁÞÅÎÉÅ ÜÔÉÈ ÆÕÎË ÉÊ:
distan e differen e area_polygon transf_polygon
:: :: :: ::
Point -> Float Point -> Point -> Float [Point℄ -> Float (Point -> Point) -> [Point℄ -> [Point℄
íÏÖÎÏ ÅÝÅ ÏÒÅÄÅÌÉÔØ É ¾ÍÎÏÇÏÕÇÏÌØÎÉË¿:
type Polygon = [Point℄ area_polygon :: Polygon -> Float transf_polygon :: (Point -> Point) -> Polygon -> Polygon åÓÔØ ÎÅÓËÏÌØËÏ ×ÅÝÅÊ, Ï ËÏÔÏÒÙÈ ÎÕÖÎÏ ÏÍÎÉÔØ ÒÉ ÏÒÅÄÅÌÅÎÉ ÑÈ ÔÉÁ:
ÓÌÏ×Ï type ÓÅ ÉÁÌØÎÏ ÚÁÒÅÚÅÒ×ÉÒÏ×ÁÎÏ ÄÌÑ ÜÔÏÇÏ ÓÌÕÞÁÑ; ÉÍÑ ÎÏ×ÏÇÏ ÏÒÅÄÅÌÅÎÉÑ ÔÉÁ ÄÏÌÖÎÏ ÎÁÞÉÎÁÔØÓÑ Ó ÚÁÇÌÁ× ÎÏÊ ÂÕË×Ù (ÔÁË ËÁË ÜÔÏ ËÏÎÓÔÁÎÔÁ, Á ÎÅ ÅÒÅÍÅÎÎÁÑ); ÏÂßÑ×ÌÅÎÉÅ ÔÉÁ ÏÒÅÄÅÌÑÅÔ ÔÉ ÆÕÎË ÉÉ, ÏÒÅÄÅÌÅÎÉÅ ÔÉ Á ÏÒÅÄÅÌÑÅÔ ÎÏ×ÏÅ ÉÍÑ ÄÌÑ ÔÉÁ.
154
VI. óÔÒÕËÔÕÒÙ ÄÁÎÎÙÈ
éÎÔÅÒÒÅÔÁÔÏÒ ÒÁÓÓÍÁÔÒÉ×ÁÅÔ ÎÏ×ÏÅ ÏÒÅÄÅÌÅÎÉÅ ÔÉÁ ÒÏÓÔÏ ËÁË ÁÂÂÒÅ×ÉÁÔÕÒÕ (ÓÏËÒÁÝÅÎÉÅ). ïÎ ÎÅ ÓÞÉÔÁÅÔ, ÞÔÏ ÌÀÂÏÅ ×ÙÒÁÖÅÎÉÅ ÔÉ (Float, Float) ÅÓÔØ ÔÉ Point. ÷ÏÚÍÏÖÎÏ ÉÓÏÌØÚÏ×ÁÎÉÅ É Ä×ÕÈ ÒÁÚÌÉÞÎÙÈ ÉÍÅÎ ÄÌÑ ÏÄÎÏÇÏ É ÔÏÇÏ ÖÅ ÔÉÁ, ÎÁÒÉÍÅÒ,
type Point = (Float, Float) type Complex = (Float, Float) úÄÅÓØ Point × ÔÏÞÎÏÓÔÉ ÔÏÖÅ ÓÁÍÏÅ, ÞÔÏ É Complex É (Float, Float). ðÏÜÔÏÍÕ ÔÁËÉÅ ÏÒÅÄÅÌÅÎÉÑ ÔÉÁ É ÎÁÚÙ×ÁÀÔ ÓÉÎÏÎÉÍÁ ÍÉ. ÷ ÄÁÌØÎÅÊÛÅÍ ×Ù ÕÚÎÁÅÔÅ ËÁË ÄÅÊÓÔ×ÉÔÅÌØÎÏ ××ÅÓÔÉ ÔÉ ÄÁÎÎÙÈ. ðÏÖÁÌÕÊ ÎÁÉÂÏÌÅÅ ÉÚ×ÅÓÔÎÙÊ ÔÉ ÓÉÎÏÎÉÍ ÜÔÏ String. ïÒÅ ÄÅÌÅÎÉÅ ÜÔÏÇÏ ÓÉÎÏÎÉÍÁ × ÒÅÁÍÂÕÌÅ ××ÏÄÉÔ ÔÉ String ËÁË ÓÉÓÏË ÜÌÅÍÅÎÔÏ× ÔÉÁ Char:
ÎÏ×ÙÊ
H
H
type String = [Char℄ óÔÒÏËÉ ÚÁÉÓÙ×ÁÀÔÓÑ × ÓÅ ÉÁÌØÎÏÍ ×ÉÄÅ: ÓÉÍ×ÏÌÙ, ÓÏÓÔÁ×ÌÑÀ ÝÉÅ ÓÔÒÏËÕ, ÚÁËÌÀÞÁÀÔÓÑ × Ä×ÏÊÎÙÅ ËÁ×ÙÞËÉ. òÁÚÌÉÞÉÅ ÍÅÖÄÕ 'a' É "a"× ÔÏÍ, ÞÔÏ ÅÒ×ÏÅ ÅÓÔØ ÓÉÍ×ÏÌ, Á ÏÓÌÅÄÎÅÅ ÓÉÓÏË ÓÉÍ×ÏÌÏ×, ÓÏÓÔÏÑÝÉÊ ÔÏÌØËÏ ÉÚ ÏÄÎÏÇÏ ÜÌÅÍÅÎÔÁ. óÔÒÏËÉ Ñ×ÌÑÀÔÓÑ ÔÉÏÍ ÓÉÎÏÎÉÍÏÍ É ÎÅ Ñ×ÌÑÀÔÓÑ ÏÔÄÅÌØÎÙÍ, ÓÁÍÏÓÔÏÑÔÅÌØÎÙÍ ÔÉÏÍ ÄÁÎÎÙÈ. ïÎÉ ÎÁÓÌÅÄÕÀÔ Ó×ÏÊÓÔ×Á, ÒÉÓÕ ÝÉÅ ×ÓÅÍ ÓÉÓËÁÍ. óÒÁ×ÎÅÎÉÅ ÓÔÒÏË ÓÌÅÄÕÅÔ ÎÏÒÍÁÌØÎÏÍÕ ÌÅËÓÉ ËÏÇÒÁÆÉÞÅÓËÏÍÕ ÏÒÑÄËÕ. îÁÒÉÍÅÒ,
---> "hello" < "hallo" False ---> "Jo" <"Joanna" True
ÏÓÉÍ×ÏÌØÎÏ
þÁÝÅ ×ÓÅÇÏ ÎÁÍ ÈÏÞÅÔÓÑ ÅÞÁÔÁÔØ ÓÔÒÏËÉ . üÔÏ ÏÚÎÁ ÞÁÅÔ, ÞÔÏ (1) Ä×ÏÊÎÙÅ ËÁ×ÙÞËÉ ÎÅ ×Ù×ÏÄÑÔÓÑ É (2) ÎÅËÏÔÏÒÙÅ ÓÉÍ ×ÏÌÙ (ÔÁËÉÅ ËÁË \n) ÉÎÔÅÒÒÅÔÉÒÕÀÔÓÑ ËÁË ÓÅ ÉÁÌØÎÙÅ ËÏÍÁÎÄÙ. ïÓÏÂÅÎÎÏÓÔÉ ××ÏÄÁ É ×Ù×ÏÄÁ ÂÕÄÕÔ ÒÁÓÓÍÏÔÒÅÎÙ × ÇÌÁ×Å 8, ÓÅÊÞÁÓ ÄÏÓÔÁÔÏÞÎÏ ÏÔÍÅÔÉÔØ, ÞÔÏ Haskell ÏÂÌÁÄÁÅÔ ×ÓÔÒÏÅÎÎÏÊ ÆÕÎË ÉÅÊ putStr, ÒÅÄÎÁÚÎÁÞÅÎÎÏÊ ÄÌÑ ÅÞÁÔÉ ÓÔÒÏË. ÷ ÓÌÕÞÁÅ ÒÉÍÅÎÅÎÉÑ ÆÕÎË ÉÉ putStr Ë ÓÔÒÏËÅ, ÏÎÁ ÂÕÄÅÔ ÅÞÁÔÁÔØÓÑ ÏÓÉÍ×ÏÌØÎÏ.
---> putStr "Hello World" Hello World ---> putStr "Hello \nWorld" Hello World
5. óÉÎÏÎÉÍÙ
155
I õÒÁÖÎÅÎÉÅ VI.5.1
÷ÅÒÎÅÍÓÑ Ë ÚÁÄÁÞÅ ÎÁÈÏÖÄÅÎÉÑ ËÏÒÎÅÊ Ë×ÁÄÒÁÔÎÏÇÏ ÕÒÁ×ÎÅÎÉÑ. îÁ ÓÔÒÁÎÉ Å 47 ÄÁÎÏ ÏÒÅÄÅÌÅÎÉÅ ÆÕÎË ÉÉ ab Formula, ÒÅÄÎÁÚÎÁÞÅÎ ÎÏÊ ÄÌÑ ÔÅÈ ÖÅ ÅÌÅÊ:
ab Formula :: Float -> Float -> Float -> [Float℄ ab Formula a b = [(-b + sqrt(b*b - 4.0*a* ))/(2.0*a), (-b - sqrt(b*b - 4.0*a* ))/(2.0*a) ℄ üÔÁ ÆÕÎË ÉÑ ÒÅÄÓÔÁ×ÌÅÎÁ × ËÁÒÒÉÎÇÏ×ÏÊ ÆÏÒÍÅ, ÏÎÁ ÏÓÌÅÄÏ×Á ÔÅÌØÎÏ ÂÅÒÅÔ ÔÒÉ ÁÒÇÕÍÅÎÔÁ É ×ÏÚ×ÒÁÝÁÅÔ ÓÉÓÏË ËÏÒÎÅÊ. ïÒÅÄÅ ÌÉÍ ÎÏ×ÕÀ ÆÕÎË ÉÀ roots, ÒÅÄÎÁÚÎÁÞÅÎÎÕÀ ÄÌÑ ÔÅÈ ÖÅ ÅÌÅÊ, ÎÏ ÏÌÕÞÁÀÝÕÀ ÔÒÏÊËÕ ÞÉÓÅÌ ËÏÜÆÆÉ ÉÅÎÔÏ× ÕÒÁ×ÎÅÎÉÑ, É ×ÏÚ ×ÒÁÝÁÀÝÕÀ ÁÒÕ ËÏÒÎÅÊ. ïÓÏÂÏ ×ÙÄÅÌÉÍ ÓÌÕÞÁÊ, ËÏÇÄÁ ÕÒÁ×ÎÅÎÉÅ ÎÅ ÉÍÅÅÔ ÒÅÛÅÎÉÊ. ïÂßÑ×ÌÅÎÉÅ ÔÉÁ ÜÔÏÊ ÆÕÎË ÉÉ ÂÕÄÅÔ ÔÁËÉÍ:
roots
:: (Float, Float, Float) -> (Float, Float)
äÌÑ ÌÕÞÛÅÇÏ ÏÔÒÁÖÅÎÉÑ ÓÕÔÉ ÎÁÛÅÊ ÚÁÄÁÞÉ ××ÅÄÅÍ Ä×Á ÔÉÁ ÓÉÎÏ ÎÉÍÁ ÄÌÑ ËÏÜÆÆÉ ÉÅÎÔÏ× ÕÒÁ×ÎÅÎÉÑ É ÅÇÏ ËÏÒÎÅÊ:
type Coeffs = (Float, Float, Float) type Roots = (Float, Float) üÔÏ ÏÉÓÁÎÉÅ ÄÁÅÔ ÎÏ×ÙÅ ÉÍÅÎÁ ÄÌÑ ÕÖÅ ÓÕÝÅÓÔ×ÕÀÝÉÈ ÔÉÏ×. ïÂßÑ×ÌÅÎÉÅ ÆÕÎË ÉÉ roots ÔÅÅÒØ ÍÏÖÎÏ ÚÁÉÓÁÔØ ÔÁË:
roots
:: Coeffs -> Roots
îÏ×ÙÊ ÔÉ ÏÉÓÁÎÉÑ ËÏÒÏÞÅ É ÂÏÌÅÅ ÉÎÆÏÒÍÁÔÉ×ÅÎ. ðÒÉÞÅÍ ÏÒÅ ÄÅÌÅÎÉÅ ÔÉÁ Roots ÏËÁÚÙ×ÁÅÔ, ÞÔÏ Õ Ë×ÁÄÒÁÔÎÏÇÏ ÕÒÁ×ÎÅÎÉÑ ÎÅ ÍÏÖÅÔ ÂÙÔØ ÂÏÌØÛÅ Ä×ÕÈ ËÏÒÎÅÊ. ÷ ÏÒÅÄÅÌÅÎÉÉ ÆÕÎË ÉÉ Ó ÏÍÏÝØÀ ÏÈÒÁÎÎÙÈ ×ÙÒÁÖÅÎÉÊ ×Ù ÄÅÌÉÍ ÓÌÕÞÁÊ, ËÏÇÄÁ ÕÒÁ×ÎÅÎÉÅ ÎÅ ÉÍÅÅÔ ËÏÒÎÅÊ. åÓÌÉ ËÏÒÎÉ ÓÏ ×ÁÄÕÔ, ÔÏ ÏÂÁ ÜÌÅÍÅÎÔÁ ÁÒÙ ÂÕÄÕÔ ÏÄÉÎÁËÏ×Ù. äÌÑ ÔÏÇÏ, ÞÔÏÂÙ ÉÚÂÅÖÁÔØ Ï×ÔÏÒÎÙÈ ×ÙÞÉÓÌÅÎÉÊ ××ÅÄÅÍ ÌÏËÁÌØÎÙÅ ÏÒÅÄÅÌÅÎÉÑ ÄÌÑ ÎÅËÏÔÏÒÙÈ ×ÙÒÁÖÅÎÉÊ. îÉÖÅ ÒÉ×ÅÄÅÎ ÓËÒÉÔ, ÓÏÄÅÒÖÁÝÉÊ ÏÌÎÏÓÔØÀ ÏÒÅÄÅÌÅÎÉÅ ÆÕÎË ÉÉ roots:
type Coeffs = (Float, Float, Float) type Roots = (Float, Float) roots
:: Coeffs -> Roots
roots (a, b, )
VI. óÔÒÕËÔÕÒÙ ÄÁÎÎÙÈ
156
| d >= 0 = ( (-b + d')/a', (-b - d')/a') | otherwise = error "ëÏÒÎÅÊ ÎÅÔ!" where d = b*b - 4.0*a* d' = sqrt d a' = 2.0 * a
H
ÅÅÒØ ÍÏÖÎÏ ÕÂÅÄÉÔÓÑ × ËÏÒÒÅËÔÎÏÊ ÒÁÂÏÔÅ ÏÌÕÞÅÎÎÏÊ ÒÏÇÒÁÍ ÍÙ. óÎÁÞÁÌÁ ÏÒÏÂÕÅÍ ÒÅÄÌÏÖÉÔØ ÒÏÇÒÁÍÍÅ ÄÁÎÎÙÅ ÎÅÏÄÈÏ ÄÑÝÅÇÏ ÔÉÁ, ÚÁÔÅÍ ÒÁÚÌÉÞÎÙÅ ÔÒÏÊËÉ ËÏÜÆÆÉ ÉÅÎÔÏ×:
---> roots (1.0, 2.0) ERROR - Type error in appli ation *** Expression : roots (1.0,2.0) *** Term : (1.0,2.0) *** Type : (a,b) *** Does not mat h : (Float,Float,Float) ---> roots (1.0, 2.0, 1.0) (-1.0,-1.0) ---> roots (1.0, -6.0, 5.0) (5.0,1.0) ---> roots (1.0, 2.0, 5.0) Program error: ëÏÒÎÅÊ ÎÅÔ!
J I õÒÁÖÎÅÎÉÅ VI.5.2
ïÒÅÄÅÌÉÍ ÆÕÎË ÉÀ move, ËÏÔÏÒÁÑ ÂÅÒÅÔ ÞÉÓÌÏ, Ñ×ÌÑÀÝÅÅÓÑ ÒÁÓ ÓÔÏÑÎÉÅÍ, ÕÇÏÌ É ÁÒÕ ËÏÏÒÄÉÎÁÔ ÔÏÞËÉ ÎÁ ÌÏÓËÏÓÔÉ, ÏÓÌÅ ÞÅÇÏ ×ÙÞÉÓÌÑÅÔ ËÏÏÒÄÉÎÁÔÙ ÎÏ×ÏÊ ÔÏÞËÉ ÌÏÓËÏÓÔÉ, ÏÌÏÖÅÎÉÅ ËÏÔÏÒÏÊ ÏÒÅÄÅÌÑÅÔÓÑ ÒÁÓÓÔÏÑÎÉÅÍ É ÕÇÌÏÍ.
íÙ ÍÏÖÅÍ ××ÅÓÔÉ ÔÉÙ ÓÉÎÏÎÉÍÙ ÄÌÑ ×ÅÌÉÞÉÎ, ÉÓÏÌØÚÕÅÍÙÈ × ÚÁÄÁÞÅ ÓÌÅÄÕÀÝÉÍ ÏÂÒÁÚÏÍ:
type Position = (Float, Float) type Angle = Float type Distan e = Float úÁÍÅÔØÔÅ, ÞÔÏ É Angle É Distan e Ñ×ÌÑÀÔÓÑ ÓÉÎÏÎÉÍÁÍÉ Float. ÅÅÒØ ÍÏÖÎÏ ÏÒÅÄÅÌÉÔØ move ÔÁË:
move :: Distan e -> Angle -> Position ->Position move d a (x, y) = (x + d * os a, y + d * sin a)
5. óÉÎÏÎÉÍÙ
157
B d α A(x, y) 0 ÒÉÇÏÎÏÍÅÔÒÉÞÅÓËÉÅ ÆÕÎË ÉÉ os É sin Ñ×ÌÑÀÔÓÑ ÒÉÍÉÔÉ×ÁÍÉ. ÁË ÖÅ ËÁË ÔÉ ÏÉÓÁÎÉÑ ÆÕÎË ÉÉ roots, ÔÁËÏÅ ÏÉÓÁÎÉÅ move ËÏÒÏÞÅ É ÏÍÏÇÁÅÔ ÏÎÑÔØ ÎÁÚÎÁÞÅÎÉÅ ÆÕÎË ÉÉ move.
J
É ÓÉÎÏÎÉÍ ÍÏÖÅÔ ÂÙÔØ ÁÒÁÍÅÔÒÉÚÏ×ÁÎ ÏÄÎÉÍ ÉÌÉ ÂÏÌØÛÉÍ ÞÉÓÌÏÍ ÔÉÏ× ÅÒÅÍÅÎÎÙÈ, ÁÎÁÌÏÇÉÞÎÏ ÏÒÅÄÅÌÅÎÉÑÍ ÄÒÕÇÉÈ ÔÉ Ï× ÄÁÎÎÙÈ. ÷ÏÔ ÎÅÓËÏÌØËÏ ËÏÒÒÅËÔÎÙÈ ÒÉÍÅÒÏ× ÉÓÏÌØÚÏ×ÁÎÉÑ ÓÉÎÏÎÉÍÏ×:
type Pairs a = (a, a) type Antomorph a = a -> a type Flag a = (a, Bool) ä×Á ÔÉÁ ÓÉÎÏÎÉÍÁ ÎÅ ÍÏÇÕÔ ÂÙÔØ ÏÂßÑ×ÌÅÎÙ × ÔÅÒÍÉÎÁÈ ÄÒÕÇ ÄÒÕÇÁ, ÔÁË ËÁË ËÁÖÄÙÊ ÓÉÎÏÎÉÍ ÄÏÌÖÅÎ ×ÙÒÁÖÁÔØÓÑ × ÔÅÒÍÉÎÁÈ ÓÕÝÅÓÔ×ÕÀÝÉÈ ÔÉÏ×. ó ÄÒÕÇÏÊ ÓÔÏÒÏÎÙ, ×ÏÌÎÅ ÚÁËÏÎÎÏ ÏÂßÑ×ÌÅ ÎÉÅ ÏÄÎÏÇÏ ÓÉÎÏÎÉÍÁ × ÔÅÒÍÉÎÁÈ ÄÒÕÇÏÇÏ. îÁÒÉÍÅÒ,
type Bools = Pairs Bool úÄÅÓØ Bools ÔÉ ÓÉÎÏÎÉÍ ÄÌÑ Pairs Bool, Ô. Å ×ÏÚ×ÒÁÝÁÅÔ ÓÉÎÏ ÎÉÍ ÄÌÑ ÁÒÙ (Bool, Bool).
5.1. òÁ ÉÏÎÁÌØÎÙÅ ÞÉÓÌÁ ïÄÎÏÊ ÉÚ ÚÁÄÁÞ, × ËÏÔÏÒÙÈ ÕÄÏÂÎÏ ÉÓÏÌØÚÏ×ÁÔØ ÁÒÙ ÞÉÓÅÌ, Ñ×ÌÑÅÔÓÑ ÚÁÄÁÞÁ ÏÓÕÝÅÓÔ×ÌÅÎÉÑ ÍÁÔÅÍÁÔÉÞÅÓËÉÈ ÄÅÊÓÔ×ÉÊ Ó ÒÁ É ÏÎÁÌØÎÙÍÉ ÞÉÓÌÁÍÉ. ëÁË ÉÚ×ÅÓÔÎÏ, ÞÉÓÌÏ ÒÅÄÓÔÁ×ÉÍÏÅ × ×ÉÄÅ p ÎÅÓÏËÒÁÔÉÍÏÊ ÄÒÏÂÉ , ÇÄÅ p É q ÅÌÙÅ ÞÉÓÌÁ, ÎÁÚÙ×ÁÅÔÓÑ ÒÁ
q
ÉÏÎÁÌØÎÙÍ. íÎÏÖÅÓÔ×Ï ×ÓÅÈ ÒÁ ÉÏÎÁÌØÎÙÈ ÞÉÓÅÌ ÏÂÏÚÎÁÞÁÅÔÓÑ ËÁË Q. îÅ×ÏÚÍÏÖÎÏ ÉÓÏÌØÚÏ×ÁÎÉÅ ÔÉÁ Float ÄÌÑ ÒÅÄÓÔÁ×ÌÅÎÉÑ
VI. óÔÒÕËÔÕÒÙ ÄÁÎÎÙÈ
158
ÄÒÏÂÅÊ, ×ÅÄØ ×ÓÅ ×ÙÞÉÓÌÅÎÉÑ ÄÏÌÖÎÙ ÂÙÔØ ÁÂÓÏÌÀÔÎÏ ÔÏÞÎÙÍÉ: 1 1 5 ÔÁË + ÄÏÌÖÎÏ ÒÁ×ÎÑÔØÓÑ , Á ÎÅ 0.833333. 2 3 6 äÒÏÂÉ ÍÏÇÕÔ ÂÙÔØ ÒÅÄÓÔÁ×ÌÅÎÙ ËÁË ÁÒÁ ÅÌÙÈ ÞÉÓÅÌ: ÞÉÓÌÉ ÔÅÌØ É ÚÎÁÍÅÎÁÔÅÌØ. ïÔÓÀÄÁ ÏÞÅ×ÉÄÎÏÅ ÏÒÅÄÅÌÅÎÉÅ ÔÉÁ:
type Fra tion = (Int, Int) äÌÑ ÎÁÉÂÏÌÅÅ ÞÁÓÔÏ ÉÓÏÌØÚÕÅÍÙÈ ÄÒÏÂÅÊ ÍÏÖÎÏ ××ÅÓÔÉ ÓÅ ÉÁÌØ ÎÙÅ ÉÍÅÎÁ:
qZero = (0, 1); qHalve = (1, 2);
qOne = (1, 1); qThird = (1, 3);
qTwo = (2, 1) qQuarter = (1, 4)
îÁÍ ÔÒÅÂÕÅÔÓÑ ÎÁÉÓÁÔØ ÎÅÓËÏÌØËÏ ÆÕÎË ÉÊ, ÏÚ×ÏÌÑÀÝÉÈ ÏÓÕÝÅ ÓÔ×ÌÑÔØ ÏÓÎÏ×ÎÙÅ ÁÒÉÆÍÅÔÉÞÅÓËÉÅ ÏÅÒÁ ÉÉ Ó ÄÒÏÂÑÍÉ:
qMul qDiv qAdd qSub
:: :: :: ::
Fra tion Fra tion Fra tion Fra tion
-> -> -> ->
Fra tion Fra tion Fra tion Fra tion
-> -> -> ->
Fra tion Fra tion Fra tion Fra tion
ïÓÎÏ×ÎÁÑ ÒÏÂÌÅÍÁ ÓÏÓÔÏÉÔ × ÔÏÍ, ÞÔÏ ÏÄÎÁ É ÔÁ ÖÅ ÄÒÏÂØ ÍÏ ÖÅÔ ÒÅÄÓÔÁ×ÌÑÔØÓÑ × ×ÉÄÅ ÒÁÚÌÉÞÎÙÈ ÄÒÏÂÅÊ, ÎÁÒÉÍÅÒ, ÏÌÏ×É ÎÁ ÍÏÖÅÔ ÂÙÔØ ÒÅÄÓÔÁ×ÌÅÎÁ ÎÅ ÔÏÌØËÏ ËÁË (1, 2), ÎÏ É ×ÉÄÅ (2, 4) ÉÌÉ (17, 34). ðÒÉ ÕÍÎÏÖÅÎÉÉ ÞÅÔ×ÅÒÔÉ ÎÁ Ä×Á ÒÅÚÕÌØÔÁÔ ÄÏÌ ÖÅÎ ÒÁ×ÎÑÔØÓÑ ÏÌÏ×ÉÎÅ. äÌÑ ÒÅÛÅÎÉÑ ÜÔÏÊ ÒÏÂÌÅÍÙ ÏÒÅÄÅÌÉÍ ÆÕÎË ÉÀ simplify, ÒÅÄÎÁÚÎÁÞÅÎÎÕÀ ÄÌÑ ÕÒÏÝÅÎÉÑ ÄÒÏÂÅÊ. ðÒÉ ÍÅÎÑÑ ÜÔÕ ÆÕÎË ÉÀ ÏÓÌÅ ÌÀÂÏÊ ÏÅÒÁ ÉÉ Ó ÄÒÏÂÑÍÉ, ÍÙ ÂÕÄÅÍ ÏÌÕÞÁÔØ ÒÅÚÕÌØÔÁÔ × ÏÄÎÏÍ É ÔÏÍ ÖÅ ×ÉÄÅ: ÒÅÚÕÌØÔÁÔ ÓÒÁ×ÎÅÎÉÑ Ï ÌÏ×ÉÎËÉ Ó ÒÏÉÚ×ÅÄÅÎÉÅÍ ÞÅÔ×ÅÒÔÉ ÎÁ Ä×Á ÄÏÌÖÅÎ ÒÁ×ÎÑÔØÓÑ True. æÕÎË ÉÑ simplify ÄÅÌÉÔ ÞÉÓÌÉÔÅÌØ É ÚÎÁÍÅÎÁÔÅÌØ ÄÒÏÂÉ ÎÁ ÉÈ (îïä, g d, greatest ommon divisor). îÁÉÂÏÌØÛÉÊ ÏÂÝÉÊ ÄÅÌÉÔÅÌØ Ä×ÕÈ ÞÉÓÅÌ ÅÓÔØ ÎÁÉÂÏÌØÛÅÅ ÞÉÓÌÏ, ÎÁ ËÏÔÏÒÏÅ ÄÅÌÉÔÓÑ ËÁË ÞÉÓÌÉÔÅÌØ, ÔÁË É ÚÎÁÍÅÎÁÔÅÌØ ÄÒÏÂÉ. äÌÑ ÕÞÅÔÁ ÚÎÁËÁ ÄÒÏÂÉ ×ÏÓÏÌØÚÕÅÍÓÑ ÆÕÎË ÉÅÊ signum. ïÒÅÄÅÌÅÎÉÅ simplify ÔÁËÏ×Ï:
ÎÁÉÂÏÌØÛÉÊ ÏÂÝÉÊ ÄÅÌÉÔÅÌØ
simplify (n,d) = ((signum d*n) `div` g, abs d `div` g) where g = g d n d ðÒÏÓÔÏÅ ÏÒÅÄÅÌÅÎÉÅ g d x y ÍÙ ÏÌÕÞÉÍ, ÅÓÌÉ ÓÒÅÄÉ ÄÅÌÉ ÔÅÌÅÊ ÞÉÓÌÁ x ×ÙÂÅÒÅÍ ÎÁÉÂÏÌØÛÉÊ, Ñ×ÌÑÀÝÉÊÓÑ ÒÉ ÜÔÏÍ ÄÅÌÉ ÔÅÌÅÍ ÞÉÓÌÁ y, ÄÌÑ ÞÅÇÏ ×ÏÓÏÌØÚÕÅÍÓÑ ÆÕÎË ÉÑÍÉ divisors É divisible, ÒÁÓÓÍÏÔÒÅÎÎÙÍÉ ÎÁ ÓÔÒ. 97.
g d x y = last (filter (divisible y') (divisors x'))
5. óÉÎÏÎÉÍÙ
159
where x' = abs x y' = abs y ðÏÌÕÞÅÎÎÏÅ ÏÒÅÄÅÌÅÎÉÅ ÆÕÎË ÉÉ g d ÎÅ ÜÆÆÅËÔÉ×ÎÏ, É × ÒÅÌÀ ÄÉÉ ÒÉ×ÏÄÉÔÓÑ ÄÒÕÇÁÑ ÒÅÁÌÉÚÁ ÉÑ ÜÔÏÊ ÆÕÎË ÉÉ, ÉÓÏÌØÚÕÀÝÁÑ ÁÌÇÏÒÉÔÍ å×ËÌÉÄÁ ÎÁÈÏÖÄÅÎÉÑ îïä. áÌÇÏÒÉÔÍ å×ËÌÉÄÁ ÏÓÎÏ×ÁÎ ÎÁ ÓÌÅÄÕÀÝÉÈ Ó×ÏÊÓÔ×ÁÈ: ÄÌÑ ×ÓÅÈ a É b, ÂÏÌØÛÉÈ ÉÌÉ ÒÁ×ÎÙÈ 0, ×ÙÏÌÎÅÎÙ ÓÏÏÔÎÏÛÅÎÉÑ
îïä(a, b) = îïä(a - b, b)= îïä(a, b - a); îïä(a, 0) = îïä(0, a) = a îïä(0, 0) ÎÅ ÏÒÅÄÅÌÅÎ ïÒÅÄÅÌÅÎÉÅ g d, ÕÞÉÔÙ×ÁÀÝÅÅ ÁÌÇÏÒÉÔÍ å×ËÌÉÄÁ, ÔÁËÏ×Ï:
g d 0 0 g d x y
= error "g d 0 = g d' (abs x) where g d' x g d' x
0 is undefined" (abs y) 0 = x y = g d' y (x `rem` y)
ðÏÄÇÏÔÏ×É× ÆÕÎË ÉÀ simplify, ÍÏÖÎÏ ÒÉÓÔÕÁÔØ Ë ÒÁÚÒÁÂÏÔ ËÅ ÆÕÎË ÉÊ, ÒÅÄÎÁÚÎÁÞÅÎÎÙÈ ÄÌÑ ÁÒÉÆÍÅÔÉÞÅÓËÉÈ ÏÅÒÁ ÉÊ Ó ÄÒÏÂÑÍÉ. äÌÑ ÕÍÎÏÖÅÎÉÑ Ä×ÕÈ ÄÒÏÂÅÊ ÓÌÅÄÕÅÔ ÅÒÅÍÎÏÖÉÔØ ÉÈ 10 ) É ÕÒÏÓÔÉÔØ ÒÅÚÕÌØÔÁÔ: ÞÉÓÌÉÔÅÌÉ É ÚÎÁÍÅÎÁÔÅÌÉ ( 32 54 = 12
qMul (x, y) (p, q) = simplify (x*p, y*q) äÅÌÅÎÉÅ Ó×ÏÄÉÔÓÑ Ë ÕÍÎÏÖÅÎÉÀ ÎÁ ÏÂÒÁÔÎÕÀ ×ÅÌÉÞÉÎÕ:
qDiv (x, y) (p, q) = simplify (x*q, y*p) ðÅÒÅÄ ÓÌÏÖÅÎÉÅÍ Ä×ÕÈ ÄÒÏÂÅÊ ÉÈ ÓÎÁÞÁÌÁ ÒÉ×ÏÄÑÔ Ë ÏÂÝÅÍÕ ÚÎÁ ÍÅÎÁÔÅÌÀ, ÏÓÌÅ ÞÅÇÏ ÓËÌÁÄÙ×ÁÀÔ ÞÉÓÌÉÔÅÌÉ ÏÌÕÞÅÎÎÙÈ ÄÒÏÂÅÊ 3 = 110 + 34 = 10 + 12 = 22 ). ïÔÓÀÄÁ ÏÌÕÞÁÅÍ ÏÒÅÄÅÌÅÎÉÑ ( 41 + 10 410 410 40 40 40
qAdd (x, y) (p, q) = simplify (x*q + y*p, y*q) qSub (x, y) (p, q) = simplify (x*q - y*p, y*q) òÅÚÕÌØÔÁÔ ×ÙÞÉÓÌÅÎÉÑ ×Ù×ÏÄÉÔÓÑ × ×ÉÄÅ ËÏÒÔÅÖÁ ÉÚ Ä×ÕÈ ÜÌÅ ÍÅÎÔÏ×. ÁË ËÁË ÜÔÏ ÎÅ ÏÞÅÎØ ÕÄÏÂÎÏ, ÔÏ ÍÏÖÎÏ ÏÒÅÄÅÌÉÔØ ÆÕÎË ÉÀ fra tionString, ÒÅÏÂÒÁÚÕÀÝÕÀ ËÏÒÔÅÖ × ÓÔÒÏËÕ:
fra tionString :: Fra tion -> String fra tionString (x, y) | y' == 1 = intString x' | otherwise = intString x' ++ ``/'' ++ intString y' where (x', y') = simplify (x, y)
VI. óÔÒÕËÔÕÒÙ ÄÁÎÎÙÈ
160
õÞÔÉÔÅ, ÞÔÏ ÆÕÎË ÉÑ fra tionString × ÔÁËÏÍ ×ÉÄÅ ÓÏÓÏÂÎÁ ÒÅÏÂÒÁÚÏ×Ù×ÁÔØ ÔÏÌØËÏ ÏÌÏÖÉÔÅÌØÎÙÅ ÄÒÏÂÉ (ÓÍ. ÏÒÅÄÅÌÅÎÉÅ ÆÕÎË ÉÉ intString ÎÁ ÓÔÒ. 142).
I õÒÁÖÎÅÎÉÅ VI.5.3
H
éÚÍÅÎÉÍ ÏÒÅÄÅÌÅÎÉÅ fra tionString ÔÁË, ÞÔÏÂÙ ÆÕÎË ÉÑ ÍÏÇÌÁ ÏÅÒÉÒÏ×ÁÔØ ÌÀÂÙÍÉ ÒÁ ÉÏÎÁÌØÎÙÍÉ ÞÉÓÌÁÍÉ. äÌÑ ÜÔÏÇÏ ÄÏÂÁ×ÉÍ ÆÕÎË ÉÀ signIntString, ÒÅÏÂÒÁÚÕÀÝÕÀ ÅÌÏÅ ÞÉÓÌÏ × ÓÔÒÏËÕ:
signIntString :: Int -> String signIntString x | x == 0 = "0" | otherwise = signumChar x ++ intString (abs x) where signumChar x | signum x == -1 = "-" | otherwise = [℄ ÅÅÒØ ÍÙ ÍÏÖÅÍ ÒÅÄÓÔÁ×ÉÔØ × ×ÉÄÅ ÓÔÒÏËÉ ÌÀÂÏÅ ÅÌÏÅ ÞÉÓÌÏ:
---> signIntString 0 "0" ---> signIntString (-1234450) "-1234450" ðÏÌÎÏÓÔØÀ ÓËÒÉÔ ×ÙÇÌÑÄÉÔ ÔÁË:
type Fra tion = (Int, Int) qZero, qOne, qTwo, qHalve, qThird, qQuarter :: Fra tion qZero = (0, 1); qOne = (1, 1); qTwo = (2, 1) qHalve = (1, 2); qThird = (1, 3); qQuarter = (1, 4) simplify :: Fra tion -> Fra tion simplify (n,d) = ((signum d*n) `div` g, abs d `div` g) where g = g d n d qMul, qDiv, qMul (x, y) qDiv (x, y) qAdd (x, y) qSub (x, y)
qAdd, qSub (p, q) (p, q) (p, q) (p, q)
:: = = = =
Fra tion simplify simplify simplify simplify
-> Fra tion -> Fra tion (x*p, y*q) (x*q, y*p) (x*q + y*p, y*q) (x*q - y*p, y*q)
fra tionString :: Fra tion -> String fra tionString (x, y) | x' == 0 = signIntString x'
5. óÉÎÏÎÉÍÙ
161
| y' == 1 = signIntString x' | otherwise = signIntString x' ++ "/" ++ intString y' where (x', y') = simplify (x, y) intString :: Int -> String intString = map digitChar . reverse . map (`rem` 10) . takeWhile (/=0) . iterate (`div` 10) digitChar :: Int -> Char digitChar n | n >= 0 && n < 10 = hr (n +ord '0') signIntString :: Int -> String signIntString x | x == 0 = "0" | otherwise = signumChar x ++ intString (abs x) where signumChar x | signum x == -1 = "-" | otherwise = [℄ ÅÅÒØ ÍÏÖÎÏ ÒÏ×ÏÄÉÔØ ÁÒÉÆÍÅÔÉÞÅÓËÉÅ ÏÅÒÁ ÉÉ Ó ÄÒÏÂÑÍÉ:
---> fra tionString "-1" ---> fra tionString "9/20" ---> fra tionString "201/10100" ---> fra tionString "-10/91"
H
(qMul qThird (-3,1)) (qSub (1, 2) (1, 20)) (qAdd (1, 100) (1, 101)) (qDiv qQuarter (91, -40))
J
÷ÏÒÏÓÙ É ÚÁÄÁÎÉÑ VI.5.1
ëÁË ÉÚ×ÅÓÔÎÏ, ÄÅÌÉÔØ ÎÁ ÎÏÌØ ÚÁÒÅÝÅÎÏ. éÚÍÅÎÉÔÅ ÆÕÎË ÉÀ qDiv ÔÁË, ÞÔÏÂÙ ÒÉ ÏÙÔËÅ ÒÁÚÄÅÌÉÔØ ÎÁ ÎÏÌØ ÏÑ×ÌÑÌÏÓØ ÂÙ ÓÏÏÂÝÅ ÎÉÅ Ï ÏÛÉÂËÅ.
162
VI. óÔÒÕËÔÕÒÙ ÄÁÎÎÙÈ
VI.5.2
íÎÏÇÏÞÌÅÎ ÓÔÅÅÎÉ n ÏÔ ÅÒÅÍÅÎÎÏÊ x ÍÏÖÅÔ ÂÙÔØ ÒÅÄÓÔÁ×ÌÅÎ, ËÁË ÓÉÓÏË ÅÇÏ ËÏÜÆÆÉ ÉÅÎÔÏ×. ðÒÅÄÏÌÏÖÉÍ, ÞÔÏ ËÏÜÆÆÉ ÉÅÎ ÔÙ ÒÁÚÍÅÝÁÀÔÓÑ × ÓÉÓËÅ × ÏÒÑÄËÅ ÕÂÙ×ÁÎÉÑ ÓÔÅÅÎÅÊ ÞÉÓÌÁ x. îÁÒÉÍÅÒ, ÍÎÏÇÏÞÌÅÎ 3:1x4 + 4:2x3 + 9:3x + 7:4, ËÏÔÏÒÙÊ ÅÓÔØ × ÔÏÞ ÎÏÓÔÉ ÍÎÏÇÏÞÌÅÎ 3:1x4 + 4:2x3 + 0:0x2 + 9:3x + 7:4, ÒÅÄÓÔÁ×ÌÑÅÔÓÑ ÓÉÓËÏÍ [3.1, 4.2, 0.0, 9.3, 7.4℄. ÷×ÅÄÉÔÅ ÔÉ ÓÉÎÏÎÉÍ Poly ÄÌÑ ÓÉÓËÁ ËÏÜÆÆÉ ÉÅÎÔÏ× ÍÎÏÇÏÞÌÅÎÁ, ÏÓÌÅ ÞÅÇÏ (Á) ÎÁÉÛÉÔÅ ÆÕÎË ÉÀ, ÓËÌÁÄÙ×ÁÀÝÕÀ Ä×Á ÍÎÏÇÏÞÌÅÎÁ ×ÍÅÓÔÅ
padd :: Poly -> Poly -> Poly; (Â) ÎÁÉÛÉÔÅ ÆÕÎË ÉÀ, ×ÙÞÉÓÌÑÀÝÕÀ ÚÎÁÞÅÎÉÅ ÍÎÏÇÏÞÌÅÎÁ ÄÌÑ ÒÏÉÚ×ÏÌØÎÏÇÏ ÚÎÁÞÅÎÉÑ x
eval :: Poly -> Float -> Float; (×) ÎÁÉÛÉÔÅ ÆÕÎË ÉÀ ÄÌÑ ÕÍÎÏÖÅÎÉÑ Ä×ÕÈ ÍÎÏÇÏÞÌÅÎÏ×
ptimes :: Poly -> Poly -> Poly.
çÌÁ×Á VII
Haskell ËÁË ÑÚÙË ïïð 1. ïÂßÅËÔÎÏ-ÏÒÉÅÎÔÉÒÏ×ÁÎÎÏÅ ÍÉÒÏ×ÁÎÉÅ
ÒÏÇÒÁÍ
ïÄÎÏÊ ÉÚ ÓÆÅÒ ÒÉÍÅÎÅÎÉÑ ÑÚÙËÁ Haskell Ñ×ÌÑÅÔÓÑ ÉÓÏÌØÚÏ ×ÁÎÉÅ ÅÇÏ ÄÌÑ ÂÙÓÔÒÏÇÏ ÒÏÔÏÔÉÉÒÏ×ÁÎÉÑ ÓÌÏÖÎÙÈ ÒÏÇÒÁÍÍÎÙÈ ÓÉÓÔÅÍ. ëÁË ÏËÁÚÁÌ ÏÙÔ ÔÁËÉÈ ËÏÍÁÎÉÊ, ËÁË Eri sson, ÒÉÍÅÎÉ× ÛÅÊ ÜÔÏÔ ÑÚÙË ÒÉ ÒÁÚÒÁÂÏÔËÅ ÔÅÌÅËÏÍÍÕÎÉËÁ ÉÏÎÎÙÈ ÒÉÌÏÖÅ ÎÉÊ, É Software AG (ÜËÓÅÒÔÎÁÑ ÓÉÓÔÅÍÁ Natural Expert ÎÁÉÓÁÎÁ ÎÁ Haskell), ÓËÏÒÏÓÔØ ÓÏÚÄÁÎÉÑ ðï ×ÏÚÒÁÓÔÁÌÁ × 925 ÒÁÚ Ï ÓÒÁ× ÎÅÎÉÀ Ó ÁÎÁÌÏÇÉÞÎÙÍÉ ÒÏÅËÔÁÍÉ, ÇÄÅ ÉÓÏÌØÚÏ×ÁÌÉÓØ C/C++. îÁÉÓÁÎÎÙÊ ÎÁ Haskell ÒÏÔÏÔÉ ÒÏÇÒÁÍÍÎÏÊ ÓÉÓÔÅÍÙ, ÏÚ×ÏÌÑ ÅÔ ÒÏÁÎÁÌÉÚÉÒÏ×ÁÔØ ÌÀÓÙ É ÍÉÎÕÓÙ ÔÏÇÏ ÉÌÉ ÉÎÏÇÏ ÒÏÅËÔÁ É ×ÎÅÓÔÉ ÎÅÉÚÂÅÖÎÙÅ ÉÚÍÅÎÅÎÉÑ × ÒÏÅËÔ ÓÉÓÔÅÍÙ ÅÝÅ ÎÁ ÒÁÎÎÅÊ ÓÔÁÄÉÉ. ïÔÌÉÞÉÔÅÌØÎÁÑ ÏÓÏÂÅÎÎÏÓÔØ Haskell ×ÏÚÍÏÖÎÏÓÔØ ÉÓÏÌØ ÚÏ×ÁÎÉÑ ÓÏÂÓÔ×ÅÎÎÏÇÏ ÓÉÎÔÁËÓÉÓÁ ÄÌÑ ÆÏÒÍÁÌØÎÏÇÏ ÏÉÓÁÎÉÑ ÔÒÅÂÏ×ÁÎÉÊ Ë ÒÏÅËÔÕ, ÞÔÏ ÓÏ ÓÏÂÓÔ×ÕÅÔ ÂÅÚÂÏÌÅÚÎÅÎÎÏÍÕ ÅÒÅÈÏÄÕ ÏÔ ÒÏÅËÔÉÒÏ×ÁÎÉÑ Ë ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÀ.
æð + ïïð = Haskell
Haskell ÄÁÅÔ ×ÏÚÍÏÖÎÏÓÔØ ÉÓÁÔØ ÒÏÓÔÏÊ, ËÒÁÔËÉÊ É ÎÁÇÌÑÄ ÎÙÊ ËÏÄ, ÏÂÅÓÅÞÉ×ÁÑ ÎÅÓÌÏÖÎÙÍÉ ÓÒÅÄÓÔ×ÁÍÉ ÉÎËÁÓÕÌÑ ÉÀ É Ï ÌÉÍÏÒÆÉÚÍ. ÁË, ÒÅËÕÒÓÉ×ÎÏÅ ÏÉÓÁÎÉÅ ÒÏ ÅÄÕÒÙ ÂÙÓÔÒÏÊ ÓÏÒÔÉ ÒÏ×ËÉ, ÒÁÓÓÍÏÔÒÅÎÎÏÊ ÎÁ ÓÔÒ. 163, ÚÁÎÉÍÁÅÔ ×ÓÅÇÏ ÎÅÓËÏÌØËÏ ÓÔÒÏË. éÓÏÌØÚÏ×ÁÔØ ÔÁËÕÀ ÒÏ ÅÄÕÒÕ ÍÏÖÎÏ Ó ÄÁÎÎÙÍÉ ÌÀÂÙÈ ÔÉÏ×, ÄÏÕÓËÁÀÝÉÍÉ ÓÒÁ×ÎÅÎÉÅ.
qui ksort [ ℄ = [ ℄ qui ksort (x:xs) = qui ksort [ u | u <- xs, u <= x ℄ ++ [x℄ ++ qui ksort [ u | u <- xs, u > x ℄ 163
164
VII. Haskell ËÁË ÑÚÙË ïïð
áÎÁÌÏÇÉÞÎÙÊ ÁÌÇÏÒÉÔÍ, ÎÁÉÓÁÎÎÙÊ, ÄÏÕÓÔÉÍ, ÎÁ ÑÚÙËÅ C, ÂÕÄÅÔ ÏÒÉÅÎÔÉÒÏ×ÁÎ ÎÁ ÒÁÂÏÔÕ ÓÏ ÓÉÓËÁÍÉ ÏÒÅÄÅÌÅÎÎÏÇÏ ÔÉÁ, ÎÁÒÉ ÍÅÒ, ÍÁÓÓÉ×ÏÍ ÞÉÓÅÌ, × ÔÏ ×ÒÅÍÑ ËÁË ÒÉ×ÅÄÅÎÎÁÑ ×ÙÛÅ ÆÕÎË ÉÑ ÎÁ Haskell ÂÏÌÅÅ ÕÎÉ×ÅÒÓÁÌØÎÁ: ÏÎÁ ÏÔÓÏÒÔÉÒÕÅÔ É ÓÉÓËÉ ÞÉÓÅÌ, É ÓÉÓËÉ ÓÔÒÏË ÉÌÉ ÓÉÍ×ÏÌÏ×. ÷ÓÅ ÚÁÄÁÞÉ ÕÒÁ×ÌÅÎÉÑ ÁÍÑÔØÀ ÒÉ ×ÙÏÌÎÅÎÉÉ ÒÏÇÒÁÍÍÙ, ÎÁÉÓÁÎÎÏÊ ÎÁ Haskell, ×ÏÚÌÁÇÁÀÔÓÑ ÎÁ ÉÓÏÌÎÑÀÝÕÀ ÓÒÅÄÕ. ðÒÏ ÇÒÁÍÍÉÓÔÕ ÎÅ ÎÁÄÏ ÚÁÂÏÔÉÔØÓÑ Ï ×ÙÄÅÌÅÎÉÉ É ÏÓ×ÏÂÏÖÄÅÎÉÉ ÄÉÎÁ ÍÉÞÅÓËÏÊ ÁÍÑÔÉ. ðÏÍÉÍÏ ÜÔÏÇÏ ÓÒÅÄÁ ÒÅÁÌÉÚÕÅÔ ÔÁË ÎÁÚÙ×ÁÅÍÏÅ ÌÅÎÉ×ÏÅ ×ÙÞÉÓÌÅÎÉÅ × ÈÏÄÅ ×ÙÏÌÎÅÎÉÑ ÒÏÇÒÁÍÍÙ ÒÏÉÓÈÏÄÉÔ ×ÙÞÉÓÌÅÎÉÅ ÔÏÌØËÏ ÔÅÈ ÄÁÎÎÙÈ, ËÏÔÏÒÙÅ ÒÅÁÌØÎÏ ÚÁÒÁÛÉ×ÁÀÔÓÑ. îÅÄÏÓÔÁÔËÉ Haskell, Á ÉÍÅÎÎÏ, Ï×ÙÛÅÎÎÙÅ ÔÒÅÂÏ×ÁÎÉÑ Ë ÁÍÑ ÔÉ (ÉÚ-ÚÁ ÒÅËÕÒÓÉÉ) É ÎÅ ÏÞÅÎØ ×ÙÓÏËÏÅ ÂÙÓÔÒÏÄÅÊÓÔ×ÉÅ, ÎÅ Ñ×ÌÑ ÀÔÓÑ ËÒÉÔÉÞÎÙÍÉ ÎÁ ÜÔÏÍ ÜÔÁÅ ÒÁÚÒÁÂÏÔËÉ ðï. ðÒÁËÔÉÞÅÓËÉ ×ÓÅ ÓÏ×ÒÅÍÅÎÎÙÅ ÒÏÇÒÁÍÍÎÙÅ ÒÁÚÒÁÂÏÔËÉ ÏÓÎÏ ×Ù×ÁÀÔÓÑ ÎÁ ÒÉÎ ÉÁÈ ÏÂßÅËÔÎÏ-ÏÒÉÅÎÔÉÒÏ×ÁÎÎÏÇÏ ÒÏÇÒÁÍÍÉ ÒÏ×ÁÎÉÑ, ÏÚ×ÏÌÑÀÝÉÈ Ï×ÙÓÉÔØ ÎÁÄÅÖÎÏÓÔØ ÒÏÇÒÁÍÍÎÙÈ ËÏÍ ÏÎÅÎÔ É ÉÈ Ï×ÔÏÒÎÏÅ ÉÓÏÌØÚÏ×ÁÎÉÅ, ÞÔÏ ÓÏËÒÁÝÁÅÔ ÓÕÍÍÁÒÎÙÅ ÚÁÔÒÁÔÙ ÎÁ ÉÈ ÒÁÚÒÁÂÏÔËÕ. óÏËÒÙÔÉÅ ÉÎÆÏÒÍÁ ÉÉ É ÁÂÓÔÒÁËÔÎÏÓÔØ ÄÁÎÎÙÈ ÕÒÏÝÁÀÔ ÉÓÏÌØÚÏ×ÁÎÉÅ ÒÏÇÒÁÍÍÎÏÇÏ ËÏÄÁ, ÎÁÉÓÁÎÎÏÇÏ ËÅÍ-ÔÏ ÒÁÎÅÅ. éÍÅÎÎÏ Haskell, ÓÏÞÅÔÁÀÝÉÊ × ÓÅÂÅ ÜÌÅÍÅÎÔÙ ÆÕÎË ÉÏÎÁÌØÎÏÇÏ É ÏÂßÅËÔÎÏ-ÏÒÉÅÎÔÉÒÏ×ÁÎÎÏÇÏ ÓÔÉÌÑ ÒÁÚÒÁÂÏÔËÉ ÒÏ ÇÒÁÍÍ, Ñ×ÌÑÅÔÓÑ ÓÁÍÙÍ ÏÄÈÏÄÑÝÉÍ ÉÎÓÔÒÕÍÅÎÔÏÍ ÄÌÑ ÓÏÚÄÁÎÉÑ ÒÏÔÏÔÉÏ× ÒÏÇÒÁÍÍÎÙÈ ÓÉÓÔÅÍ. ñÚÙË Haskell ÏÄÄÅÒÖÉ×ÁÅÔ ÏÂßÅËÔÎÏ-ÏÒÉÅÎÔÉÒÏ×ÁÎÎÕÀ ÁÒÁ ÄÉÇÍÕ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÑ. ïÄÎÉÍ ÉÚ ÏÓÎÏ×ÎÙÈ ÏÔÌÉÞÉÊ ïïð ÏÔ ÄÒÕÇÉÈ ÓÔÉÌÅÊ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÑ Ñ×ÌÑÅÔÓÑ ÔÏ, ÞÔÏ × ÏÂÙÞÎÏÍ ÒÏ ÇÒÁÍÍÉÒÏ×ÁÎÉÉ ÒÏÇÒÁÍÍÉÓÔ ÏÇÒÁÎÉÞÅÎ ×ÓÔÒÏÅÎÎÙÍÉ ÔÉÁÍÉ ÄÁÎ ÎÙÈ, × ÔÏ ×ÒÅÍÑ ËÁË × ÓÌÕÞÁÅ ïïð ÒÏÇÒÁÍÍÉÓÔ ÍÏÖÅÔ ÏÒÅÄÅÌÑÔØ Ó×ÏÉ ÓÏÂÓÔ×ÅÎÎÙÅ ÁÂÓÔÒÁËÔÎÙÅ ÔÉÙ ÄÁÎÎÙÈ.
1.1. éÎËÁÓÕÌÑ ÉÑ É ÎÁÓÌÅÄÏ×ÁÎÉÅ ïÂßÅËÔÎÏ-ÏÒÉÅÎÔÉÒÏ×ÁÎÎÙÅ ÑÚÙËÉ ÒÅÄÏÓÔÁ×ÌÑÀÔ Ä×Á ÇÌÁ×ÎÙÈ ÍÅÈÁÎÉÚÍÁ ÁÂÓÔÒÁË ÉÉ: É , ËÏÔÏÒÙÅ ÍÏ ÇÕÔ ÉÓÏÌØÚÏ×ÁÔØÓÑ ÒÉ ÒÁÚÒÁÂÏÔËÅ ÒÏÇÒÁÍÍÎÏÇÏ ÏÂÅÓÅÞÅÎÉÑ.
ÉÎËÁÓÕÌÑ ÉÀ ÎÁÓÌÅÄÏ×ÁÎÉÅ
ÍÏÄÕÌØÎÏÓÔÉ
âÌÁÇÏÄÁÒÑ ÉÎËÁÓÕÌÑ ÉÉ ÍÏÖÎÏ ÄÏÓÔÉÞØ , ÏÚ×Ï ÌÑÀÝÅÊ ÒÁÓÓÍÁÔÒÉ×ÁÔØ ÏÂßÅËÔÙ × ËÁÞÅÓÔ×Å ÓÔÒÏÉÔÅÌØÎÙÈ ÂÌÏËÏ×
1. ïÂßÅËÔÎÏ-ÏÒÉÅÎÔÉÒÏ×ÁÎÎÏÅ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÅ
165
ÓÌÏÖÎÏÊ ÓÉÓÔÅÍÙ. üÔÏ Ó×ÏÊÓÔ×Ï ïïð ÓÏÓÏÂÓÔ×ÕÅÔ ÂÙÓÔÒÏÍÕ Ï ÓÔÒÏÅÎÉÀ ÒÏÔÏÔÉÁ ÓÉÓÔÅÍÙ, ÒÉÞÅÍ ÏËÏÎÞÁÔÅÌØÎÁÑ ÄÏ×ÏÄËÁ ¾ÂÙ ÓÔÒÙÈ É ÓÈÅÍÁÔÉÞÎÙÈ ÒÅÛÅÎÉÊ¿ ÏÔËÌÁÄÙ×ÁÅÔÓÑ ÎÁ ÂÏÌÅÅ ÏÚÄÎÅÅ ×ÒÅÍÑ. äÒÕÇÏÅ ÒÅÉÍÕÝÅÓÔ×Ï ÏÂßÅËÔÎÏ-ÏÒÉÅÎÔÉÒÏ×ÁÎÎÏÇÏ ÏÄÈÏÄÁ, ËÏ ÔÏÒÏÅ ÞÁÓÔÏ ÓÞÉÔÁÀÔ ÇÌÁ×ÎÙÍ, ×ÏÚÍÏÖÎÏÓÔØ Ï×ÔÏÒÎÏÇÏ ÉÓÏÌØ ÚÏ×ÁÎÉÑ ËÏÄÁ. îÁÓÌÅÄÏ×ÁÎÉÅ × ÜÔÏÍ ÏÔÎÏÛÅÎÉÉ Ñ×ÌÑÅÔÓÑ ÏÞÅÎØ ÅÎ ÎÙÍ ÉÎÓÔÒÕÍÅÎÔÏÍ. íÅÈÁÎÉÚÍ ÎÁÓÌÅÄÏ×ÁÎÉÑ ÏÚ×ÏÌÑÅÔ ÒÏÇÒÁÍÍÉ ÓÔÕ ÉÚÍÅÎÑÔØ É ÎÁÓÔÒÁÉ×ÁÔØ Ï×ÅÄÅÎÉÅ ËÌÁÓÓÁ ÏÂßÅËÔÏ× ÂÅÚ ÎÅÏ ÈÏÄÉÍÏÓÔÉ ÏÌÕÞÁÔØ ÄÏÓÔÕ Ë ÉÓÈÏÄÎÏÍÕ ËÏÄÕ ÒÅÁÌÉÚÁ ÉÉ ÜÔÏÇÏ ËÌÁÓÓÁ. ïÂßÅËÔ ÍÏÖÎÏ ÒÁÓÓÍÁÔÒÉ×ÁÔØ ËÁË ×ÏÌÏÝÅÎÉÅ (ÜÌÅÍÅÎÔ) Á ÓÔÒÁËÔÎÏÇÏ ÔÉÁ ÄÁÎÎÙÈ. þÔÏÂÙ ÉÓÏÌØÚÏ×ÁÔØ ÏÂßÅËÔ, ËÌÉÅÎÔ ÄÏÌ ÖÅÎ ÌÉÛØ ÚÎÁÔØ, ÏÂßÅËÔ ÄÅÌÁÅÔ, Á ÎÅ ÜÔÏ Ï×ÅÄÅÎÉÅ ÒÅÁ ÌÉÚÕÅÔÓÑ. ó ÔÏÞËÉ ÚÒÅÎÉÑ ÒÅÁÌÉÚÁ ÉÉ ÎÁ ÏÒÅÄÅÌÅÎÎÏÍ ÑÚÙËÅ ÒÏ ÇÒÁÍÍÉÒÏ×ÁÎÉÑ ÏÂßÅËÔ ÅÓÔØ ÎÅ ÞÔÏ ÉÎÏÅ, ËÁË ×ÙÓÏËÏÕÒÏ×ÎÅ×ÁÑ ÏÒ ÇÁÎÉÚÁ ÉÑ ÄÁÎÎÙÈ.
ÞÔÏ
ËÁË
îÁÓÌÅÄÏ×ÁÎÉÅ ÒÅÄÓÔÁ×ÌÑÅÔ ÓÏÂÏÊ ÏÂÝÉÊ É ÍÏÝÎÙÊ ÍÅÈÁÎÉÚÍ Ï×ÔÏÒÎÏÇÏ ÉÓÏÌØÚÏ×ÁÎÉÑ ËÏÄÁ. áÂÓÔÒÁËÔÎÙÊ ÔÉ ÄÁÎÎÙÈ ÏÂÕÓÌÏ ×ÌÉ×ÁÅÔ Ï×ÅÄÅÎÉÅ ÎÅËÏÔÏÒÏÊ ÓÏ×ÏËÕÎÏÓÔÉ ÓÕÝÎÏÓÔÅÊ. éÓÏÌØÚÕÑ ÍÅÈÁÎÉÚÍ ÎÁÓÌÅÄÏ×ÁÎÉÑ ÄÌÑ ÒÁÓÛÉÒÅÎÉÑ ÏÒÅÄÅÌÅÎÉÑ ÎÅËÏÔÏÒÏÇÏ ÔÉÁ, ÍÙ ÌÉÂÏ ÚÁÄÁÅÍ ÎÏ×ÏÅ Ï×ÅÄÅÎÉÅ × ÄÏÏÌÎÅÎÉÅ Ë ÚÁÄÁÎÎÏÍÕ, ÌÉÂÏ ÉÚÍÅÎÑÅÍ ÕÎÁÓÌÅÄÏ×ÁÎÎÏÅ, ÌÉÂÏ ÄÅÌÁÅÍ É ÔÏ É ÄÒÕÇÏÅ. õÓÌÏ×ÉÅ, ËÏÔÏÒÏÅ ÄÏÌÖ ÎÏ ÎÅÒÅÍÅÎÎÏ ÓÏÂÌÀÄÁÔØÓÑ ÒÉ ÉÚÍÅÎÅÎÉÉ ÕÎÁÓÌÅÄÏ×ÁÎ ÎÏÇÏ Ï×ÅÄÅÎÉÑ, ÓÏÓÔÏÉÔ × ÔÏÍ, ÞÔÏ ÉÚÍÅÎÅÎÎÙÅ ÏÄÏ ÎÙÍ ÏÂÒÁÚÏÍ ÏÂßÅËÔÙ ÏÂÑ ÚÁÔÅÌØÎÏ ÄÏÌÖÎÙ ÄÏÕÓËÁÔØ ÉÈ ÉÓÏÌØÚÏ×ÁÎÉÅ ×ÅÚÄÅ, ÇÄÅ ÍÏÇÕÔ ÒÉÍÅÎÑÔØÓÑ ÏÂßÅËÔÙ ÉÓÈÏÄÎÏÇÏ ÔÉÁ.
ðÏÌÉÍÏÒÆÉÚÍ
áÂÓÔÒÁËÔÎÏÅ ÎÁÓÌÅÄÏ×ÁÎÉÅ ïÔÎÏÛÅÎÉÅ ÕÔÏÞÎÅÎÉÑ É ÏÄÔÉÙ òÁÚÌÉÞÎÙÅ ÔÉÙ ÏÌÉÍÏÒÆÉÚÍÁ ÉÏ×ÁÑ ÁÂÓÔÒÁË ÉÑ óÏËÒÙÔÉÅ ÒÅÄÓÔÁ×ÌÅÎÉÑ òÅËÕÒÓÉ×ÎÙÅ ÏÒÅÄÅÌÅÎÉÑ ÔÉÏ× ÄÁÎÎÙÈ
éÔÁË, ÍÏÖÎÏ ÓËÁÚÁÔØ, ÞÔÏ ÎÁÚÎÁÞÅÎÉÅ ÏÂßÅËÔÏ× ÒÅÁÌÉÚÁ ÉÑ ÎÅËÏÔÏÒÙÈ ÓÏÇÌÁÛÅÎÉÊ. óÏÇÌÁÛÅÎÉÅ ÆÉËÓÉÒÕÅÔÓÑ × ÏÒÅÄÅÌÅÎÉÉ ËÌÁÓÓÁ, ÜËÚÅÍÌÑÒÏÍ ËÏÔÏÒÏÇÏ Ñ×ÌÑÅÔÓÑ ÄÁÎÎÙÊ ÏÂßÅËÔ. îÁÓÌÅÄÏ ×ÁÎÉÅ ÍÏÖÎÏ ÏÎÉÍÁÔØ ËÁË ÍÅÈÁÎÉÚÍ ÒÅÁÌÉÚÁ ÉÉ ÕÔÏÞÎÅÎÉÑ Ï ×ÅÄÅÎÉÑ, ËÏÔÏÒÏÅ × ËÏÎÅÞÎÏÍ ÓÞÅÔÅ ÏÚÎÁÞÁÅÔ ÕÓÏ×ÅÒÛÅÎÓÔ×Ï×ÁÎÉÅ ÓÏÇÌÁÛÅÎÉÑ, ÒÅÇÌÁÍÅÎÔÉÒÕÀÝÅÇÏ Ï×ÅÄÅÎÉÅ ÏÂßÅËÔÁ.
VII. Haskell ËÁË ÑÚÙË ïïð
166
1.2. ëÌÁÓÓÙ É ÅÒÅÇÒÕÚËÁ ó ÔÅÏÒÅÔÉÞÅÓËÏÊ ÔÏÞËÉ ÚÒÅÎÉÑ ÓÕÝÎÏÓÔØ ÏÂßÅËÔÎÏ-ÏÒÉÅÎÔÉÒÏ ×ÁÎÎÏÇÏ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÑ ÓÏÓÔÏÉÔ × ÏÂßÅÄÉÎÅÎÉÉ Ó ËÏÎ Å ÉÅÊ . üÔÉ ÏÎÑ ÔÉÑ ÍÏÖÎÏ ÓÞÉÔÁÔØ ÁÂÓÔÒÁËÔÎÙÍ ÄÏÏÌÎÅÎÉÅÍ Ë ÂÏÌÅÅ ËÏÎËÒÅÔÎÙÍ ÏÎÑÔÉÑÍ É . ÉÉÚÁ ÉÑ, ËÁË ÍÙ ÕÖÅ ÏÔÍÅÞÁÌÉ ÒÁÎÅÅ, ÒÅÄÓÔÁ×ÌÑÅÔ ÓÏÂÏÊ ÍÏÝÎÏÅ ÓÒÅÄÓÔ×Ï ÄÌÑ ÂÏÒØÂÙ Ó ÏÛÉÂËÁÍÉ × ÒÏÇÒÁÍÍÁÈ. ÉÉÚÁ ÉÑ ÍÏÖÅÔ ÒÁÚÌÉÞÁÔØÓÑ Ï ×ÉÄÕ ( ÉÌÉ ) É Ï ÕÒÏ×ÎÀ ( ÉÌÉ ). ðÒÉ ÓÔÁÔÉÞÅÓËÏÊ ÔÉÉÚÁ ÉÉ ËÏÎÔÒÏÌØ ÔÉÏ× ÏÓÕÝÅÓÔ×ÌÑÅÔÓÑ ÎÁ ÜÔÁÅ ËÏÍÉÌÑ ÉÉ, Á ÒÉ ÄÉÎÁ ÍÉÞÅÓËÏÊ ÎÁ ÜÔÁÅ ×ÙÏÌÎÅÎÉÑ. Haskell ÏÔÎÏÓÉÔÓÑ Ë ÑÚÙËÁÍ, ÏÄ ÄÅÒÖÉ×ÁÀÝÉÍ ÓÔÁÔÉÞÅÓËÕÀ ÔÉÉÚÁ ÉÀ. óÉÌØÎÏ ÔÉÉÚÉÒÏ×ÁÎÎÙÅ ÑÚÙËÉ Ó×ÑÚÙ×ÁÀÔ ÒÏÇÒÁÍÍÉÓÔÁ ÄÏ×ÏÌØÎÏ ÖÅÓÔËÉÍÉ ÏÇÒÁÎÉÞÅÎÉ ÑÍÉ. ðÒÉ ÍÏÄÅÌÉÒÏ×ÁÎÉÉ ÒÅÁÌØÎÏÊ ÒÅÄÍÅÔÎÏÊ ÏÂÌÁÓÔÉ ÚÁÞÁÓÔÕÀ ÏÞÅÎØ ÓÌÏÖÎÏ ¾×ÔÉÓÎÕÔØ¿ ÔÒÅÂÕÅÍÕÀ ÓÉÓÔÅÍÕ ÔÉÏ× × ÒÁÍËÉ ÉÍÅÀ ÝÉÈÓÑ ÔÉÏ×. ïÄÎÁËÏ, ËÏÇÄÁ ÒÅÞØ ÉÄÅÔ Ï ÒÁÚÒÁÂÏÔËÅ ×ÙÓÏËÏÎÁÄÅÖ ÎÙÈ ÒÏÇÒÁÍÍ, ÎÅÔÉÉÚÉÒÏ×ÁÎÎÙÅ ÓÒÅÄÓÔ×Á, ËÁË ÒÁ×ÉÌÏ, ÓÞÉÔÁÀÔ ÎÅÕÄÏ×ÌÅÔ×ÏÒÉÔÅÌØÎÙÍÉ. ÅÍ ÎÅ ÍÅÎÅÅ, ÄÁÖÅ × ÒÁÍËÁÈ ÓÔÒÏÇÏ ÔÉÉÚÉÒÏ×ÁÎÎÙÈ ÓÒÅÄÓÔ×, ÄÌÑ ÔÏÇÏ, ÞÔÏÂÙ ÓÄÅÌÁÔØ ÓÉÓÔÅÍÕ ÔÉÏ× ÂÏÌÅÅ ÕÄÏÂÎÏÊ ÄÌÑ ÒÁËÔÉ ÞÅÓËÏÇÏ ÉÓÏÌØÚÏ×ÁÎÉÑ, ÄÅÌÁÀÔ ÏÔÓÔÕÌÅÎÉÑ ÏÔ ÓÔÒÏÇÏÊ ÔÉÉÚÁ ÉÉ, ÒÁÚÒÅÛÁÑ ÒÉÍÅÎÅÎÉÅ ÅÒÅÇÒÕÖÅÎÎÙÈ ÆÕÎË ÉÊ, ÒÉ×ÅÄÅÎÉÅ ÔÉÏ× É ÚÎÁÞÅÎÉÊ, ÏÂÝÉÈ ÄÌÑ ÎÅÓËÏÌØËÉÈ ÔÉÏ×. òÁÚÌÉÞÁÀÔ Ä×Á ×ÉÄÁ ÏÌÉÍÏÒÆÉÚÍÁ. ÏÌÉÍÏÒÆÉÚÍ, × Ó×ÏÀ ÏÞÅÒÅÄØ, ÍÏÖÅÔ ÒÉÎÉÍÁÔØ ÆÏÒ ÍÕ (Ó×ÑÚÁÎÎÏÇÏ Ó ÍÅÈÁÎÉÚÍÏÍ ÎÁÓÌÅÄÏ×ÁÎÉÑ) É (ÏÓÎÏ×ÁÎÎÏÇÏ ÎÁ ÏÄÄÅÒÖËÅ ÒÏÄÏ×ÙÈ ÔÉÏ×). äÒÕÇÏÊ ÒÏÄ ÏÌÉÍÏÒÆÉÚÍÁ, ÎÁÚÙ×ÁÅÍÙÊ ÏÌÉÍÏÒÆÉÚÍ, ÒÅÄÓÔÁ×ÌÑÅÔ ÓÏÂÏÊ ÎÁÄÓÔÒÏÊËÕ ÎÁÄ ÎÅÏÌÉÍÏÒÆÎÏÊ ÍÏÄÅÌØÀ ÔÉ ÉÚÁ ÉÉ É ÉÚ×ÅÓÔÅÎ ËÁË ÅÒÅÇÒÕÚËÁ ( ). ÷ÏÔ ÎÅÓËÏÌØËÏ ÒÉÍÅÒÏ× ÏÌÉÍÏÒÆÉÚÍÁ ÜÔÏÇÏ ×ÉÄÁ.
ÓÔÒÁËÔÎÙÈ ÔÉÏ× ÄÁÎÎÙÈ ÉÎËÁÓÕÌÑ ÉÉ ÎÁÓÌÅÄÏ×ÁÎÉÑ ÓÉÌØÎÁÑ
ËÏÎ Å ÉÉ ÁÂ ÏÌÉÍÏÒÆÉÚÍÁ
ÓÔÁÔÉÞÅÓËÁÑ ÓÌÁÂÁÑ
ïÂÝÉÊ ×ËÌÀÞÁÀÝÅÇÏ ÍÅÔÒÉÞÅÓËÏÇÏ ÏÌÉÍÏÒÆÉÚÍÁ
ÄÉÎÁÍÉÞÅÓËÁÑ
ÁÒÁ
ad ho overloading
ìÉÔÅÒÁÌÙ 1, 2, . . . , ÞÁÓÔÏ ÉÓÏÌØÚÕÀÔ ÄÌÑ ÒÅÄÓÔÁ×ÌÅÎÉÑ Å
ÌÙÈ ÞÉÓÅÌ ËÁË Ó ÆÉËÓÉÒÏ×ÁÎÎÏÊ, ÔÁË É Ó ÒÏÉÚ×ÏÌØÎÏÊ ÔÏÞÎÏ ÓÔØÀ. áÒÉÆÍÅÔÉÞÅÓËÉÅ ÏÅÒÁÔÏÒÙ, ÔÁËÉÅ ËÁË +, ÏÒÅÄÅÌÑÀÔÓÑ ÄÌÑ ÒÁÂÏÔÙ Ó ÒÁÚÌÉÞÎÙÍÉ ×ÉÄÁÍÉ ÞÉÓÅÌ. ïÅÒÁ ÉÑ ÒÏ×ÅÒËÉ ÎÁ ÒÁ×ÅÎÓÔ×Ï == ÒÁÂÏÔÁÅÔ ËÁË Ó ÞÉÓÌÁÍÉ, ÔÁË É ÓÏ ÍÎÏÇÉÍÉ ÄÒÕÇÉÍÉ (ÎÏ ÎÅ ÓÏ ×ÓÅÍÉ) ÔÉÁÍÉ.
1. ïÂßÅËÔÎÏ-ÏÒÉÅÎÔÉÒÏ×ÁÎÎÏÅ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÅ
167
ïÔÍÅÔÉÍ, ÞÔÏ ÔÁËÏÅ ÅÒÅÇÒÕÖÅÎÎÏÅ Ï×ÅÄÅÎÉÅ ÒÁÚÌÉÞÎÏ ÄÌÑ ËÁ ÖÄÏÇÏ ÔÉÁ (ÉÎÏÇÄÁ Ï×ÅÄÅÎÉÅ ÎÅ ÏÒÅÄÅÌÅÎÎÏ, ÞÔÏ ÒÉ×ÏÄÉÔ Ë ÏÛÉÂËÅ), ÔÏÇÄÁ ËÁË ÒÉ ÁÒÁÍÅÔÒÉÞÅÓËÏÍ ÏÌÉÍÏÒÆÉÚÍÅ ÔÉ ÎÅ ÉÍÅÅÔ ÎÉËÁËÏÇÏ ÚÎÁÞÅÎÉÑ. ÷ Haskell ËÌÁÓÓ ÏÂÅÓÅÞÉ×ÁÅÔ ÓÔÒÕËÔÕÒ ÎÙÊ ÓÏÓÏ ÕÒÁ×ÌÅÎÉÑ -ÏÌÉÍÏÒÆÉÚÍÏÍ ÉÌÉ ÅÒÅÇÒÕÚËÏÊ. óÉÎÔÁËÓÉÓ ÑÚÙËÁ Haskell ÒÅÄÏÓÔÁ×ÌÑÅÔ ×ÏÚÍÏÖÎÏÓÔØ ÏÒÅÄÅ ÌÑÔØ ËÌÁÓÓÙ. ÉÙ ÄÁÎÎÙÈ × Haskell ÒÁÓÓÍÁÔÒÉ×ÁÀÔÓÑ ËÁË ÜËÚÅÍ ÌÑÒÙ (instan e) ÔÏÇÏ ÉÌÉ ÉÎÏÇÏ ËÌÁÓÓÁ. ïÂßÑ×ÌÅÎÉÅ ËÌÁÓÓÁ lass ××ÏÄÉÔ ÎÏ×ÙÊ ËÌÁÓÓ ÔÉÏ× É ÅÒÅ ÇÒÕÖÁÅÔ ÏÅÒÁ ÉÉ, ÏÄÄÅÒÖÉ×ÁÅÍÙÅ × ÌÀÂÏÍ ÔÉÅ, Ñ×ÌÑÀÝÉÍÓÑ ÜËÚÅÍÌÑÒÏÍ ÄÁÎÎÏÇÏ ËÌÁÓÓÁ. ïÂßÑ×ÌÅÎÉÅ ÜËÚÅÍÌÑÒÁ instan e ÄÅËÌÁÒÉÒÕÅÔ, ÞÔÏ ëÌÁÓÓ (type lass) × Haskell ÅÓÔØ ÔÉ Ñ×ÌÑÅÔÓÑ ÜËÚÅÍÌÑÒÏÍ ËÏÌÌÅË ÉÑ ÔÉÏ×, ÒÁÓÒÅÄÅÌÑÀ ËÌÁÓÓÁ É ×ËÌÀÞÁÅÔ ÏÒÅÄÅÌÅ ÝÉÈ ÍÅÖÄÕ ÓÏÂÏÊ ÎÁÂÏÒ ÆÕÎË ÉÊ ÎÉÑ ÅÒÅÇÒÕÖÅÎÎÙÈ ÏÅÒÁ ÉÊ, É/ÉÌÉ ÏÅÒÁÔÏÒÏ×. ÎÁÚÙ×ÁÅÍÙÈ × ÓÏÏÔ×ÅÔÓÔ×ÉÉ Ó ÔÒÁÄÉ ÉÑÍÉ ïïð, . äÏÕÓÔÉÍ, ÍÙ ÒÅÛÉÌÉ ÅÒÅÇÒÕÚÉÔØ ÏÅÒÁÔÏÒÙ (+) É negate ÄÌÑ ÔÉÏ× Int É Float. ÏÇÄÁ ÓÌÅÄÕÅÔ ××ÅÓÔÉ ÎÏ×ÙÊ ËÌÁÓÓ Num:
ad ho
ÍÅÔÏÄÁÍÉ ËÌÁÓÓÁ
lass Num a where (+) :: a -> a -> a negate :: a -> a ðÏÄÏÂÎÏÅ ÏÂßÑ×ÌÅÎÉÅ ÞÉÔÁÅÔÓÑ ÔÁË: ¾É a ÅÓÔØ ÜËÚÅÍÌÑÒ ËÌÁÓ ÓÁ Num, ÅÓÌÉ ÏÎ ÓÏÄÅÒÖÉÔ (ÅÒÅÇÒÕÖÅÎÎÙÅ) ÍÅÔÏÄÙ ËÌÁÓÓÁ (+) É negate, ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÉÈ ÔÉÏ×, ÏÒÅÄÅÌÅÎÎÙÅ × ÎÅÍ.¿ ðÏÓÌÅ ÜÔÏÇÏ ÍÙ ÍÏÖÅÍ ÏÒÅÄÅÌÉÔØ Int É Float ËÁË ÜËÚÅÍÌÑÒÙ ÜÔÏÇÏ ËÌÁÓÓÁ:
instan e Num Int where x + y = addInt x y negate x = negateInt x instan e Num Float where x + y = addFloat x y negate x = negateFloat x æÕÎË ÉÉ addInt, negateInt, addFloat É negateFloat ÅÓÔØ ÒÉ ÍÉÔÉ×Ù, ÎÏ × ÄÒÕÇÉÍ ÓÌÕÞÁÑÈ ÜÔÏ ÍÏÇÕÔ ÂÙÔØ É ÏÒÅÄÅÌÑÅÍÙÅ ÏÌØÚÏ×ÁÔÅÌÅÍ ÆÕÎË ÉÉ. ðÅÒ×ÁÑ ÄÅËÌÁÒÁ ÉÑ × ÒÉ×ÅÄÅÎÎÏÍ ×Ù ÛÅ ÒÉÍÅÒÅ ÞÉÔÁÅÔÓÑ ËÁË: ¾É Int ÅÓÔØ ÜËÚÅÍÌÑÒ ËÌÁÓÓÁ Num Ó
VII. Haskell ËÁË ÑÚÙË ïïð
168
ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÉÍÉ ÏÒÅÄÅÌÅÎÉÑÍÉ (Ô. Å. ÍÅÔÏÄÁÍÉ ËÌÁÓÓÁ) ÄÌÑ + É negate.¿ ðÒÅÖÄÅ ÞÅÍ ÒÉÓÔÕÁÔØ Ë ÒÁÓÓÍÏÔÒÅÎÉÀ ×ÏÒÏÓÁ Ï ÒÅÁÌÉÚÁ ÉÉ ÎÏ×ÙÈ ÁÂÓÔÒÁËÔÎÙÈ ËÌÁÓÓÏ× × ÑÚÙËÅ Haskell, ÒÁÓÓÍÏÔÒÉÍ ÎÅËÏÔÏ ÒÙÅ ÂÁÚÏ×ÙÅ ËÌÁÓÓÙ ÜÔÏÇÏ ÑÚÙËÁ (ÏÉÓÁÎÉÅ ÜÔÉÈ ËÌÁÓÓÏ× ÎÁÈÏÄÉÔÓÑ × ÆÁÊÌÅ Prelude.hs).
2. ÷ÓÔÒÏÅÎÎÙÅ ËÌÁÓÓÙ 2.1. ëÌÁÓÓ Eq ïÂÚÏÒ ËÌÁÓÓÏ× ÎÁÞÎÅÍ Ó ÒÏÓÔÏÇÏ, ÎÏ ÏÞÅÎØ ×ÁÖÎÏÇÏ ËÌÁÓÓÁ Eq, ÉÚ×ÅÓÔÎÏÇÏ ËÁË ( ). äÁÎÎÙÊ ËÌÁÓÓ Ñ×ÌÑÅÔ ÓÑ ËÏÌÌÅË ÉÅÊ ÍÎÏÖÅÓÔ×Á ÔÉÏ×, ÄÏÕÓËÁÀÝÉÈ ÒÏ×ÅÒËÕ ÎÁ ÒÁ×ÅÎ ÓÔ×Ï. äÒÕÇÉÍÉ ÓÌÏ×ÁÍÉ, ÅÓÌÉ ×ÏÚÍÏÖÎÏ ÉÓÏÌØÚÏ×ÁÎÉÅ ÏÅÒÁ ÉÉ ÓÒÁ×ÎÅÎÉÑ ÎÁ ÒÁ×ÅÎÓÔ×Ï (==) Ä×ÕÈ ÜÌÅÍÅÎÔÏ× ÕËÁÚÁÎÎÏÇÏ ÔÉÁ, ÔÏ ÜÔÏÔ ÔÉ ×ÈÏÄÉÔ × ÓÏÓÔÁ× ËÌÁÓÓÁ Eq. îÅ ×ÓÅ ÔÉÙ ÄÏÕÓËÁÀÔ ÒÏ ×ÅÒËÕ ÎÁ ÒÁ×ÅÎÓÔ×Ï. îÁÒÉÍÅÒ, ÒÁÓÓÍÏÔÒÉÍ ÓÉÓÏË ÔÉÁ [Char -> Char℄, Ô. Å. ÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔØ ÆÕÎË ÉÊ ÄÌÑ ÒÁÂÏÔÙ Ó ÓÉÍ×ÏÌÁÍÉ. ðÏÎÑÔÎÏ, ÞÔÏ ÒÏ×ÅÒÉÔØ ÎÁ ÒÁ×ÅÎÓÔ×Ï Ä×Á ÔÁËÉÈ ÓÉÓËÁ ÎÅ×ÏÚÍÏÖ ÎÏ. îÅÓÍÏÔÒÑ ÎÁ ÔÏ, ÞÔÏ ÓÕÝÅÓÔ×ÕÅÔ ÍÁÔÅÍÁÔÉÞÅÓËÁÑ ËÏÎ Å ÉÑ ÒÁ ×ÅÎÓÔ×Á Ä×ÕÈ ÆÕÎË ÉÊ, × ÑÚÙËÅ Haskell ÎÅ ÄÏÕÓÔÉÍÏ ÒÉÍÅÎÅÎÉÅ ÏÅÒÁÔÏÒÁ == Ë ÆÕÎË ÉÑÍ, ÔÁË ËÁË ÎÅ×ÏÚÍÏÖÎÏ ÏÉÓÁÔØ ÒÏ ÅÓÓ ÉÈ ÓÒÁ×ÎÅÎÉÑ ÎÁ ÒÁ×ÅÎÓÔ×Ï.
ËÌÁÓÓ ÒÁ×ÅÎÓÔ×Á equality
÷ ÒÅÌÀÄÉÉ ËÌÁÓÓ Eq ××ÏÄÉÔÓÑ ÓÌÅÄÕÀÝÉÍ ÏÒÅÄÅÌÅÎÉÅÍ:
lass Eq a where (==), (/=) :: a -> a -> Bool ÁËÏÅ ÏÒÅÄÅÌÅÎÉÅ ÍÏÖÅÔ ÂÙÔØ ÒÏÞÉÔÁÎÏ ËÁË ¾ÔÉ a ÅÓÔØ ÜËÚÅÍ ÌÑÒ ËÌÁÓÓÁ Eq, ÅÓÌÉ ÏÎ ÏÄÄÅÒÖÉ×ÁÅÔ ÉÓÏÌØÚÏ×ÁÎÉÅ (ÅÒÅÇÒÕÖÅÎ ÎÏÇÏ) ÏÅÒÁÔÏÒÁ ==, ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÅÇÏ ÔÉÁ, ÏÒÅÄÅÌÅÎÎÏÇÏ × ÎÅÍ¿. óÏÇÌÁÛÅÎÉÅ Ï ÔÏÍ, ÞÔÏ ÔÉ a ÄÏÌÖÅÎ ÂÙÔØ ÜËÚÅÍÌÑÒÏÍ ËÌÁÓÓÁ Eq, ÚÁÉÓÙ×ÁÅÔÓÑ × ×ÉÄÅ Eq a. ÷ÙÒÁÖÅÎÉÅ Eq a ÎÏÓÉÔ ÎÁÚ×ÁÎÉÅ ( ontext). ëÏÎÔÅËÓÔÙ ÒÁÚÍÅÝÁÀÔ ÅÒÅÄ ÔÉÏ×ÙÍÉ ×ÙÒÁ ÖÅÎÉÑÍÉ. îÁÒÉÍÅÒ, × ÓÌÅÄÕÀÝÅÍ ÏÂßÑ×ÌÅÎÉÉ ÔÉÁ ÏÅÒÁÔÏÒÁ ==, ËÏÔÏÒÏÅ ÞÉÔÁÅÔÓÑ ÔÁË: ¾äÌÑ ÌÀÂÏÇÏ ÔÉÁ a, Ñ×ÌÑÀÝÅÇÏÓÑ ÜËÚÅÍ ÌÑÒÏÍ ËÌÁÓÓÁ Eq ÆÕÎË ÉÑ == ÉÍÅÅÔ ÔÉ a -> a -> Bool¿:
ËÏÎÔÅËÓÔ
(==)
:: (Eq a) => a -> a -> Bool
2. ÷ÓÔÒÏÅÎÎÙÅ ËÌÁÓÓÙ
169
I õÒÁÖÎÅÎÉÅ VII.2.1
ïÒÅÄÅÌÉÍ ÆÕÎË ÉÀ elem, ×ÙÑÓÎÑÀÝÕÀ, ×ÈÏÄÉÔ ÌÉ ÔÏÔ ÉÌÉ ÉÎÏÊ ÜÌÅÍÅÎÔ × ÓÉÓÏË. üÔÏ ÏÒÅÄÅÌÅÎÉÅ ÒÅËÕÒÓÉ×ÎÏ: × ÕÓÔÏÊ ÓÉÓÏË ÎÉËÁËÏÊ ÜÌÅÍÅÎÔ ÎÅ ×ÈÏÄÉÔ, Á × ÎÅÕÓÔÏÍ ÓÉÓËÅ ÒÏ×ÅÒÑÅÔÓÑ ÎÁ ÒÁ ×ÅÎÓÔ×Ï ÅÒ×ÙÊ ÜÌÅÍÅÎÔ É, ÅÓÌÉ ÓÒÁ×ÎÅÎÉÅ ÎÅÕÓÅÛÎÏ, ÔÏ ÓÒÁ×ÎÅÎÉÅ ÒÏ×ÏÄÉÔÓÑ ÓÏ ÓÌÅÄÕÀÝÉÍ ÜÌÅÍÅÎÔÏÍ ÓÉÓËÁ. ÁË ËÁË × ÏÒÅÄÅÌÅ ÎÉÉ ÕÞÁÓÔ×ÕÅÔ ÓÒÁ×ÎÅÎÉÅ ÎÁ ÒÁ×ÅÎÓÔ×Ï, ÔÏ ×ÅÌÉÞÉÎÙ, ÕÞÁÓÔ×ÕÀÝÉÅ × ÏÒÅÄÅÌÅÎÉÉ ÆÕÎË ÉÉ ÄÏÌÖÎÙ ÒÉÎÁÄÌÅÖÁÔØ ÔÉÕ, ËÏÔÏÒÙÊ ÅÓÔØ ÜËÚÅÍÌÑÒ ËÌÁÓÓÁ Eq:
elem x `elem` [℄ x `elem` (y:ys)
:: (Eq a) => a -> [a℄ -> Bool = False = x == y || (x `elem` ys)
íÙ ÉÓÏÌØÚÏ×ÁÌÉ ÚÄÅÓØ ÉÎÆÉËÓÎÕÀ ÆÏÒÍÕ ÆÕÎË ÉÉ elem. ðÒÉÍÅÎÉÔÅ ÆÕÎË ÉÀ Ë ÓÉÓËÁÍ ÒÁÚÌÉÞÎÏÇÏ ÔÉÁ. þÔÏ ÒÏÉÚÏÊ ÄÅÔ, ÅÓÌÉ ÕÂÒÁÔØ ÉÚ ÏÂßÑ×ÌÅÎÉÑ ÆÕÎË ÉÉ ËÏÎÔÅËÓÔ?
J
ëÁËÉÍ ÖÅ ÏÂÒÁÚÏÍ ÕËÁÚÁÔØ, ÞÔÏ ÔÏÔ ÉÌÉ ÉÎÏÊ ÔÉ Ñ×ÌÑÅÔÓÑ ÜËÚÅÍÌÑÒÏÍ ËÌÁÓÓÁ Eq? üÔÏ ÏÓÕÝÅÓÔ×ÌÑÅÔÓÑ Ó ÏÍÏÝØÀ ( ). îÁÒÉÍÅÒ,
ÎÉÑ (ÄÅËÌÁÒÁ ÉÉ) ÜËÚÅÍÌÑÒÁ instan e de laration
ÏÂßÑ×ÌÅ
instan e Eq Integer where x == y = x `integerEq` y ðÏÄÏÂÎÁÑ ÚÁÉÓØ ÞÉÔÁÅÔÓÑ ÔÁË ¾É Integer ÅÓÔØ ÜËÚÅÍÌÑÒ ËÌÁÓ ÓÁ Eq, Ó ÏÒÅÄÅÌÅÎÉÅÍ ÍÅÔÏÄÁ, ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÅÇÏ ÏÅÒÁÔÏÒÕ ==¿. æÕÎË ÉÑ integerEq Ñ×ÌÑÅÔÓÑ ÒÉÍÉÔÉ×ÎÏÊ ÆÕÎË ÉÅÊ, ÒÏ×ÅÒÑÀ ÝÅÊ, ÒÁ×ÎÙ ÌÉ Ä×Á ÅÌÙÈ ÞÉÓÌÁ, ÎÏ × ÏÂÝÅÍ ÓÌÕÞÁÅ ÌÀÂÏÅ ×ÙÒÁ ÖÅÎÉÅ ÍÏÖÅÔ ÉÓÏÌØÚÏ×ÁÔØÓÑ × ÒÁ×ÏÓÔÏÒÏÎÎÅÊ ÞÁÓÔÉ ÏÒÅÄÅÌÅÎÉÑ ÍÅÔÏÄÁ, Á ÎÅ ÔÏÌØËÏ ÔÁ ÉÌÉ ÉÎÁÑ ÆÕÎË ÉÑ. áÎÁÌÏÇÉÞÎÏÅ ÏÒÅÄÅÌÅ ÎÉÅ ÏÚ×ÏÌÑÅÔ ÓÒÁ×ÎÉ×ÁÔØ ÞÉÓÌÁ Ó ÌÁ×ÁÀÝÅÊ ÔÏÞËÏÊ.
instan e Eq Float where x == y = x `floatEq` y
I õÒÁÖÎÅÎÉÅ VII.2.2
óÏÚÄÁÄÉÍ ËÌÁÓÓ, ÁÎÁÌÏÇÉÞÎÙÊ Eq Ó ÍÅÔÏÄÏÍ ËÌÁÓÓÁ eq, ÒÏ×ÅÒÑ ÀÝÉÍ ÎÁ ÒÁ×ÅÎÓÔ×Ï, É ÆÕÎË ÉÀ elem, ÏÒÅÄÅÌÅÎÎÕÀ ÎÁ ÔÉÁÈ, ×ÈÏÄÑÝÉÈ × ÜÔÏÔ ËÌÁÓÓ. ÁË ËÁË ÆÕÎË ÉÑ elem ÕÖÅ ÏÒÅÄÅÌÅÎÁ × ÒÅÌÀÄÉÉ, ÔÏ ÅÒ×ÁÑ ÓÔÒÏËÁ ÓËÒÉÔÁ ÄÏÌÖÎÁ ÓËÒÙÔØ ÅÅ ÒÅÖÎÅÅ ÏÒÅÄÅÌÅÎÉÅ:
import Prelude hiding (elem)
VII. Haskell ËÁË ÑÚÙË ïïð
170
éÍÅÎÁ ÂÁÚÏ×ÙÈ ËÌÁÓÓÏ× (ÏÂßÑ×ÌÅÎÎÙÈ × ÒÅÌÀÄÉÉ) ÎÅ ÍÏÇÕÔ ÂÙÔØ ¾ÓËÒÙÔÙ¿, ÏÜÔÏÍÕ ÍÙ ÄÁÄÉÍ ÎÁÛÅÍÕ ËÌÁÓÓÕ ÄÒÕÇÏÅ ÉÍÑ:
lass Eq' a where eq :: a -> a -> Bool ÅÅÒØ ÍÏÖÎÏ ÏÒÅÄÅÌÉÔØ ÆÕÎË ÉÀ elem, ÉÓÏÌØÚÕÑ ÏÂßÑ×ÌÅÎÎÙÊ ×ÙÛÅ ÍÅÔÏÄ eq:
elem :: (Eq' a) => a -> [a℄ -> Bool x `elem` [℄ = False x `elem` (y:ys) = x `eq` y || x `elem` ys þÔÏÂÙ ×ÏÓÏÌØÚÏ×ÁÔØÓÑ ÜÔÏÊ ÆÕÎË ÉÅÊ ÏÒÅÄÅÌÉÍ ÎÅÓËÏÌØËÏ ÜËÚÅÍÌÑÒÏ× ÎÁÛÅÇÏ ËÌÁÓÓÁ Eq':
instan e Eq' Int where x `eq` y = abs (x-y) < 3 -- "ÒÉÂÌÉÚÉÔÅÌØÎÏ ÒÁ×ÎÙ" instan e Eq' Float where x `eq` y = abs (x-y) < 0.1
ïÇÒÁÎÉÞÅÎÉÑ ÎÁ ÏÂßÑ×ÌÅÎÉÑ ÜËÚÅÍÌÑÒÏ× ËÌÁÓÓÁ
ðÒÏÇÒÁÍÍÁ ÎÅ ÍÏÖÅÔ ÓÏÄÅÒÖÁÔØ ÂÏÌÅÅ ÏÄÎÏÇÏ ÏÂßÑ×ÌÅÎÉÑ ÜËÚÅÍÌÑÒÁ ÄÌÑ ÄÁÎÎÏÊ ËÏÍÂÉÎÁ ÉÉ ÔÉÁ É ËÌÁÓÓÁ.
åÓÌÉ ÔÉ ÏÂßÑ×ÌÅÎ ËÁË ÞÌÅÎ ËÌÁÓÓÁ, ÔÏ ÏÎ ÄÏÌÖÅÎ ÂÙÔØ ÏÂßÑ×ÌÅÎ ×Ï ×ÓÅÈ ÓÕÅÒËÌÁÓÓÁÈ ÜÔÏÇÏ ËÌÁÓÓÁ.
ïÂßÑ×ÌÅÎÉÅ ÜËÚÅÍÌÑÒÁ ÎÅ ÔÒÅÂÕÅÔ ÏÂÑÚÁÔÅÌØÎÏÇÏ ÚÁÄÁ
ÎÉÑ ÍÅÔÏÄÏ× ÄÌÑ ×ÓÅÈ ÏÅÒÁÔÏÒÏ× ËÌÁÓÓÁ. ëÏÇÄÁ ÍÅÔÏÄ ÎÅ ÒÅÄÏÓÔÁ×ÌÅÎ ÒÉ ÏÂßÑ×ÌÅÎÉÉ ÜËÚÅÍÌÑÒÁ É ÎÅ ÏÌÕ ÞÅÎ Ï ÕÍÏÌÞÁÎÉÀ × ÏÂßÑ×ÌÅÎÉÉ ËÌÁÓÓÁ, ×ÙÄÁÅÔÓÑ ÏÛÉ ËÁ ×ÒÅÍÅÎÉ ×ÙÏÌÎÅÎÉÑ ÒÉ ×ÙÚÏ×Å ÜÔÏÇÏ ÍÅÔÏÄÁ.
÷Ù ÄÏÌÖÎÙ ÏÂÅÓÅÞÉ×ÁÔØ ËÏÒÒÅËÔÎÙÊ ËÏÎÔÅËÓÔ ÒÉ ÏÂß Ñ×ÌÅÎÉÉ ÜËÚÅÍÌÑÒÁ, ÔÁË ËÁË ËÏÎÔÅËÓÔ ÎÅ ×Ù×ÏÄÉÔÓÑ Ï ÕÍÏÌÞÁÎÉÀ.
óÏÚÄÁÄÉÍ Ä×Á ÓÉÓËÁ, ÜÌÅÍÅÎÔÙ ËÏÔÏÒÙÈ ÒÉÎÁÄÌÅÖÁÔ ÔÏÌØËÏ ÞÔÏ ÏÒÅÄÅÌÅÎÎÙÍ ÔÉÁÍ (Int É Float), ÒÅÄÎÁÚÎÁÞÅÎÎÙÅ ÄÌÑ ÒÏ ×ÅÒËÉ ÒÁÂÏÔÙ ÆÕÎË ÉÉ elem:
list1 :: [Int℄ list1 = [1, 5, 9, 23℄ list2 :: [Float℄ list2 = [0.2, 5.6, 33, 12.34℄
2. ÷ÓÔÒÏÅÎÎÙÅ ËÌÁÓÓÙ
171
ÅÅÒØ ÍÏÖÎÏ ÒÉÍÅÎÉÔØ ÆÕÎË ÉÀ elem, ËÏÔÏÒÁÑ ÒÏ×ÅÒÑÅÔ, ÉÍÅ ÅÔÓÑ ÌÉ × ÓÉÓËÅ ÞÉÓÌÏ, ¾ÒÉÂÌÉÚÉÔÅÌØÎÏ¿ ÒÁ×ÎÏÅ ÚÁÄÁÎÎÏÍÕ:
---> 2 `elem` list1 True ---> 100 `elem` list1 False ---> 0.22 `elem` list2 True
H
÷ÎÉÍÁÎÉÅ! ÉÙ Int É Float ÔÅÅÒØ ÅÒÅÇÒÕÖÅÎÙ ÂÅÚ ÓÉÇÎÁ ÔÕÒÙ ÔÉÁ, ÕËÁÚÙ×ÁÀÝÅÊ, ÎÁÒÉÍÅÒ, ÞÔÏ ÅÌÙÅ ÞÉÓÌÁ Ñ×ÌÑÀÔÓÑ ÜËÚÅÍÌÑÒÁÍÉ ÎÁÛÅÇÏ ÔÉÁ Int, ×ÙÒÁÖÅÎÉÑ, ÁÎÁÌÏÇÉÞÎÙÅ 3 `eq` 3 ÎÅ ÏÒÅÄÅÌÅÎÙ.
J
2.2. ëÌÁÓÓ Ord ëÌÁÓÓ Ord ÓÏÄÅÒÖÉÔ × ÓÅÂÅ ÔÉÙ, ÄÏÕÓËÁÀÝÉÅ ÓÒÁ×ÎÅÎÉÅ Ó×ÏÉÈ ÜÌÅÍÅÎÔÏ× ÒÉ ÏÍÏÝÉ ÏÅÒÁ ÉÊ (<), (6), (>) É (>). üÔÏÔ ËÌÁÓÓ ÏÎÑÔÉÅ ËÌÁÓÓÁ Eq: ÏÎ ( ) ×ÓÅ ÏÅÒÁ ÉÉ ËÌÁÓÓÁ Eq, ÄÏÂÁ×ÌÑÑ ×ÙÛÅÅÒÅÞÉÓÌÅÎÎÏÅ ÍÎÏÖÅÓÔ×Ï ÏÅÒÁÔÏ ÒÏ× ÓÒÁ×ÎÅÎÉÑ, Á ÔÁËÖÅ ÆÕÎË ÉÉ ÎÁÈÏÖÄÅÎÉÑ ÍÁËÓÉÍÁÌØÎÏÇÏ É ÍÉÎÉÍÁÌØÎÏÇÏ ÚÎÁÞÅÎÉÑ:
ÒÁÓÛÉÒÑÅÔ
ÎÁÓÌÅÄÕÅÔ inherits
lass (Eq a) => Ord a where (<), (<=), (>=), (>) :: a -> a -> Bool max, min :: a -> a -> a ïÂÒÁÔÉÔÅ ×ÎÉÍÁÎÉÅ ÎÁ ËÏÎÔÅËÓÔ ÜÔÏÇÏ ÏÒÅÄÅÌÅÎÉÑ. íÙ ÇÏ×ÏÒÉÍ, ÞÔÏ Eq Ñ×ÌÑÅÔÓÑ (ÉÌÉ ÒÏÄÉÔÅÌØÓËÉÍ ËÌÁÓÓÏÍ) ÄÌÑ ËÌÁÓÓÁ Ord (× Ó×ÏÀ ÏÞÅÒÅÄØ Ord ÅÓÔØ ËÌÁÓÓÁ Eq) É ÌÀÂÏÊ ÔÉ, Ñ×ÌÑÀÝÉÊÓÑ ÜËÚÅÍÌÑÒÏÍ ËÌÁÓÓÁ Ord, ÔÁËÖÅ Ñ×ÌÑÅÔÓÑ ÜËÚÅÍ ÌÑÒÏÍ ËÌÁÓÓÁ Eq. åÓÔØ ÏÒÅÄÅÌÅÎÎÏÅ ÒÅÉÍÕÝÅÓÔ×Ï × ÔÏÍ, ÞÔÏ ÒÉ ÏÒÅÄÅÌÅÎÉÉ ÜÔÏÇÏ ËÌÁÓÓÁ ÉÓÏÌØÚÏ×ÁÌÓÑ ËÏÎÔÅËÓÔ: ÒÉ ÏÂßÑ×ÌÅÎÉÉ ÔÉÁ ÆÕÎË ÉÉ, ÉÓÏÌØÚÕÀÝÅÊ ÏÅÒÁ ÉÉ ËÁË ÉÚ ËÌÁÓÓÁ Ord, ÔÁË É ÉÚ ËÌÁÓÓÁ Eq ÍÏÖÎÏ ÕËÁÚÙ×ÁÔØ × ËÁÞÅÓÔ×Å ËÏÎÔÅËÓÔÁ ÔÏÌØËÏ (Ord a), ÔÁË ËÁË Ord ¾ÏÄÒÁÚÕÍÅ×ÁÅÔ ÉÓÏÌØÚÏ×ÁÎÉÅ¿. âÏÌÅÅ ×ÁÖÎÙÍ ÒÅÉÍÕÝÅÓÔ×ÏÍ Ñ×ÌÑÅÔÓÑ ÔÏ, ÞÔÏ × ËÁÞÅÓÔ×Å ÏÅÒÁ ÉÊ ÏÄËÌÁÓÓÁ ×ÙÓÔÕÁÀÔ ÕÖÅ ÓÕÝÅÓÔ×ÕÀÝÉÅ ÍÅÔÏÄÙ ÓÕÅÒËÌÁÓÓÁ. îÁÒÉÍÅÒ, × ÒÅÌÀÄÉÉ ÍÅÔÏÄ (<) ÏÒÅÄÅÌÑÅÔÓÑ ÔÁË:
ÓÕÅÒËÌÁÓÓÏÍ
x < y
= x <= y && x /= y
ÏÄËÌÁÓÓ
172
H
VII. Haskell ËÁË ÑÚÙË ïïð
ðÒÉÍÅÒÏÍ ÉÓÏÌØÚÏ×ÁÎÉÑ ËÌÁÓÓÁ Ord ÓÌÕÖÁÔ ÆÕÎË ÉÉ ÓÏÒÔÉ ÒÏ×ËÉ, ÒÁÓÓÍÏÔÒÅÎÎÙÅ ÎÁ ÓÔÒ. 118 É 163. ðÒÏ×ÅÒÉÍ, ÞÔÏ ÏÎÉ ÒÁÂÏ ÔÁÀÔ Ó ÒÁÚÌÉÞÎÙÍÉ ÔÉÁÍÉ ÄÁÎÎÙÈ, ÄÏÕÓËÁÀÝÉÈ ÓÒÁ×ÎÅÎÉÅ:
---> qui ksort [34, 21, 456, 2, 8,-89℄ [-89,2,8,21,34,456℄ ---> qui ksort [True, False, False, 3<2℄ [False,False,False,True℄ ---> qui ksort "qwerty" "eqrtwy" ---> qui ksort ["qwer", "fght", "ss"℄ ["fght","qwer","ss"℄
I õÒÁÖÎÅÎÉÅ VII.2.3
óÏÚÄÁÄÉÍ ËÌÁÓÓ, ÏÚ×ÏÌÑÀÝÉÊ ÓÒÁ×ÎÉ×ÁÔØ ÍÅÖÄÕ ÓÏÂÏÊ ×ÅÌÉÞÉÎÙ ÄÁÎÎÏÇÏ ËÌÁÓÓÁ É Ñ×ÌÑÀÝÉÊÓÑ ÏÄËÌÁÓÓÏÍ Eq', Ó ÏÅÒÁÔÏÒÁÍÉ lt É le:
lass (Eq' a) => Ord' a where lt, le :: a -> a -> Bool x `le` y = x `eq` y || x `lt` y úÁÍÅÔÉÍ, ÞÔÏ ÔÉ ÏÅÒÁÔÏÒÏ× lt É le ÅÓÔØ
le, lt :: (Ord' a) => a -> a -> Bool ÉÌÉ, ÞÔÏ ÜË×É×ÁÌÅÎÔÎÏ,
le, lt :: (Eq' a, Ord' a) => a -> a -> Bool
H
ïÂßÑ×ÉÍ Int ÜËÚÅÍÌÑÒÏÍ Ord' É ÏÒÅÄÅÌÉÍ ÄÌÑ ÎÅÇÏ ÏÅÒÁÔÏÒ lt (ÏÔÌÉÞÁÀÝÉÊÓÑ ÏÔ ÓÔÁÎÄÁÒÔÎÏÇÏ!):
instan e Ord' Int where x `lt` y = x < y+1 óÒÁ×ÎÉÍ ÍÅÖÄÕ ÓÏÂÏÊ ×ÅÌÉÞÉÎÙ ÏÒÅÄÅÌÅÎÎÏÇÏ ÎÁÍÉ ÔÉÁ Int (ÕËÁÚÙ×ÁÑ ÉÈ ÔÉ ÄÌÑ ÕÓÔÒÁÎÅÎÉÑ ÎÅÏÒÅÄÅÌÅÎÎÏÓÔÉ):
---> (6 :: Int) `lt` (6 :: Int) True ---> (6 :: Int) `le` (5 :: Int) True
J
2. ÷ÓÔÒÏÅÎÎÙÅ ËÌÁÓÓÙ
173
2.3. ëÌÁÓÓÙ Show É Read ÷ ÚÁ×ÉÓÉÍÏÓÔÉ ÏÔ ÔÒÅÂÏ×ÁÎÉÊ, ÒÅÄßÑ×ÌÑÅÍÙÈ Ë ÚÁÄÁÞÅ, ÒÏ ÇÒÁÍÍÉÓÔÕ ÍÏÖÅÔ ÏÎÁÄÏÂÉÔØÓÑ ÒÁÓÅÞÁÔÁÔØ ÞÉÓÌÁ × ×ÉÄÅ ÔÁÂÌÉ Ù, ËÁÒÔÉÎËÉ ÒÁÚÌÉÞÎÏÇÏ ×ÉÄÁ ÉÌÉ ÏÔÆÏÒÍÁÔÉÒÏ×ÁÎÎÙÊ ÔÅËÓÔ. äÌÑ ÄÏ ÓÔÉÖÅÎÉÑ ÜÔÉÈ ÜÆÆÅËÔÏ× Haskell ÉÓÏÌØÚÕÅÔ ÓÅ ÉÁÌØÎÙÊ ËÌÁÓÓ Show, ÍÉÎÉÍÁÌØÎÏÅ ÏÂßÑ×ÌÅÎÉÅ ËÏÔÏÒÏÇÏ ×ÙÇÌÑÄÉÔ ÔÁË
lass Show a where showsPre :: Int -> a -> String -> String æÕÎË ÉÑ showsPre ÒÅÄÎÁÚÎÁÞÅÎÁ ÄÌÑ ×Ù×ÏÄÁ ×ÅÌÉÞÉÎÙ ÔÉÁ a. üÔÁ ÆÕÎË ÉÑ ÒÁÚÒÁÂÏÔÁÎÁ ÇÉÂËÏÊ É ÜÆÆÅËÔÉ×ÎÏÊ, ÞÔÏ ÏÔÒÁÚÉÌÉÓØ ÎÁ ÅÅ ÓÌÏÖÎÏÓÔÉ. íÙ ÎÅ ÂÕÄÅÍ ÓÅÊÞÁÓ ÏÄÒÏÂÎÏ ÏÓÔÁÎÁ×ÌÉ×ÁÔØÓÑ ÎÁ ×ÏÚÍÏÖÎÏÓÔÑÈ ÜÔÏÊ ÆÕÎË ÉÉ, ÏÔÍÅÔÉÍ ÔÏÌØËÏ, ÞÔÏ Ó ÅÅ ÏÍÏÝØÀ ÏÒÅÄÅÌÑÅÔÓÑ ÂÏÌÅÅ ÒÏÓÔÁÑ ÆÕÎË ÉÑ show:
show
:: Show a => a -> String
æÕÎË ÉÑ show ÂÅÒÅÔ ×ÅÌÉÞÉÎÕ ÔÉÁ a É ÒÅÏÂÒÁÚÕÅÔ ÅÅ × ÓÔÒÏËÕ. îÁÒÉÍÅÒ, ÔÉ Bool ÏÂßÑ×ÌÅÎ ËÁË ÜËÚÅÍÌÑÒ ËÌÁÓÓÁ Show É ÆÕÎË ÉÑ show ÄÌÑ ÌÏÇÉÞÅÓËÉÈ ×ÅÌÉÞÉÎ ×ÙÇÌÑÄÉÔ ÔÁË:
show False = "False" show True = "True" úÁÒÏÓ ÎÁ ×ÙÞÉÓÌÅÎÉÅ ÌÏÇÉÞÅÓËÏÇÏ ×ÙÒÁÖÅÎÉÑ É ×Ù×ÏÄÁ ÅÇÏ ÎÁ ÔÅÒÍÉÎÁÌ ÒÉ×ÏÄÉÔ Ë ÍÏÌÞÁÌÉ×ÏÍÕ ÒÉÍÅÎÅÎÉÀ ÆÕÎË ÉÉ putStr.show. ìÏÇÉÞÅÓËÁÑ ×ÅÌÉÞÉÎÁ ÒÅÏÂÒÁÚÕÅÔÓÑ × ÓÔÒÏËÕ ÏÓÒÅÄ ÓÔ×ÏÍ show, Á ÒÅÚÕÌØÔÁÔ ÅÞÁÔÁÅÔÓÑ ÆÕÎË ÉÅÊ putStr. ðÏÓÍÏÔÒÉÍ ËÁË ÜÔÏ ÒÉÍÅÎÑÅÔÓÑ:
---> putStr (show True) True ðÏÄÏÂÎÏÅ ×ÙÞÉÓÌÅÎÉÅ É ÅÞÁÔØ ÌÏÇÉÞÅÓËÏÊ ×ÅÌÉÞÉÎÙ ×ÏÚÍÏÖÎÁ Ï ÔÏÍÕ, ÞÔÏ ÔÉ Bool ÏÂßÑ×ÌÅÎ ËÁË ÜËÚÅÍÌÑÒ ËÌÁÓÓÁ Show. ÉÙ Char É String ÔÁËÖÅ Ñ×ÌÑÀÔÓÑ ÜËÚÅÍÌÑÒÁÍÉ ËÌÁÓÓÁ Show, ÎÁ ÒÉÍÅÒ,
---> show 'a' "'a'" ðÒÉÍÅÎÅÎÉÅ putStr Ë ÏÌÕÞÅÎÎÏÍÕ ÒÅÚÕÌØÔÁÔÕ ÒÉ×ÅÄÅÔ Ë ÕÄÁÌÅ ÎÉÀ ÁÒÙ Ä×ÏÊÎÙÈ ËÁ×ÙÞÅË É ËÏÍÂÉÎÁ ÉÑ ÉÚ ÔÒÅÈ ÓÉÍ×ÏÌÏ× 'a' ÂÕÄÅÔ ÎÁÅÞÁÔÁÎÁ:
---> putStr "'a'" 'a'
H
H H
VII. Haskell ËÁË ÑÚÙË ïïð
174
H
H
îÅËÏÔÏÒÙÅ ÏÄËÌÁÓÓÙ Show ÕÖÅ ÏÂÅÓÅÞÅÎÙ ×ÓÔÒÏÅÎÎÙÍÉ ÒÉ ÍÉÔÉ×ÁÍÉ ÄÌÑ ÅÞÁÔÉ. îÁÒÉÍÅÒ, ÅÌÙÅ ÞÉÓÌÁ ÍÏÖÎÏ ÅÞÁÔÁÔØ É ×ÅÌÉÞÉÎÁ show n ÄÌÑ ÜÌÅÍÅÎÔÁ n ÔÉÁ Integer ÅÓÔØ ÓÉÓÏË ÓÉÍ×Ï ÌÏ×, Ñ×ÌÑÀÝÉÊÓÑ ÄÅÓÑÔÉÞÎÙÍ ÒÅÄÓÔÁ×ÌÅÎÉÅÍ ÞÉÓÌÁ n. ÏÖÅ ÓÁÍÏÅ ×ÅÒÎÏ É ÄÌÑ ÄÒÕÇÉÈ ÔÉÏ× ÞÉÓÅÌ. îÁÒÉÍÅÒ,
---> show 42 "42" ---> show 43.2 "43.2" éÓÏÌØÚÏ×ÁÎÉÅ ÆÕÎË ÉÉ show ÏÚ×ÏÌÑÅÔ ÎÁÍ ËÏÎÔÒÏÌÉÒÏ×ÁÔØ ×ÎÅÛÎÉÊ ×ÉÄ ×Ù×ÏÄÁ:
---> putStr The year is ---> putStr 123 ---> putStr 1 2 3
("The year is " ++ show (2*1001)) 2002 (show 1 ++ show 2 ++ show 3) (show 1 ++ "\n" ++ show 2 ++ "\n" ++ show 3)
åÓÌÉ ËÌÁÓÓ Show ÏÚ×ÏÌÑÅÔ ÏÔÏÂÒÁÚÉÔØ ÏÂßÅËÔ × ×ÉÄÅ ÓÔÒÏËÉ, ÔÏ ËÌÁÓÓ Read ÒÅÛÁÅÔ ÏÂÒÁÔÎÕÀ ÚÁÄÁÞÕ. ïÓÎÏ×ÎÁÑ ÉÄÅÑ ÉÓÏÌØÚÏ×Á ÎÉÑ ÄÁÎÎÏÇÏ ËÌÁÓÓÁ ÓÏÓÔÏÉÔ × ÔÏÍ, ÞÔÏ ÏÒÅÄÅÌÑÅÔÓÑ ÁÒÓÅÒ (ÌÅËÓÉ ÞÅÓËÉÊ ÁÎÁÌÉÚÁÔÏÒ) ÄÌÑ ÔÉÁ a, Ñ×ÌÑÀÝÉÊÓÑ ÆÕÎË ÉÅÊ, ÂÅÒÕÝÅÊ ÓÔÒÏËÕ É ×ÏÚ×ÒÁÝÁÀÝÅÊ ÓÉÓÏË ÁÒ (a, String). ÷ ÒÅÌÀÄÉÉ ÄÌÑ ÔÁËÉÈ ÆÕÎË ÉÊ ××ÅÄÅÎ ÔÉ-ÓÉÎÏÎÉÍ:
type ReadS a = String -> [(a, String)℄ ïÂÙÞÎÏ ÁÒÓÅÒ ×ÏÚ×ÒÁÝÁÅÔ ÓÉÓÏË, ÓÏÓÔÏÑÝÉÊ ÉÚ ÏÄÎÏÇÏ ÜÌÅ ÍÅÎÔÁ É ÓÏÄÅÒÖÁÝÉÊ ×ÅÌÉÞÉÎÕ ÔÉÁ a, ËÏÔÏÒÁÑ ÂÙÌÁ ÒÏÞÉÔÁÎÁ ÉÚ ×ÈÏÄÎÏÊ ÓÔÒÏËÉ, É ÏÓÔÁ×ÛÕÀÓÑ ÞÁÓÔØ ÓÔÒÏËÉ, ÓÎÏ×Á ÅÒÅÄÁ×ÁÅ ÍÕÀ ÚÁÔÅÍ ÁÒÓÅÒÕ. åÓÌÉ ÓÉÎÔÁËÓÉÞÅÓËÉÊ ÁÎÁÌÉÚ ÎÅ×ÏÚÍÏÖÅÎ, ÔÏ ÒÅÚÕÌØÔÁÔÏÍ ÂÕÄÅÔ ÕÓÔÏÊ ÓÉÓÏË, Á ÅÓÌÉ ÄÏÕÓËÁÅÔÓÑ ÂÏÌÅÅ ÏÄÎÏÇÏ ÁÒÓÅÒÁ (ÞÔÏ ÔÅÏÒÅÔÉÞÅÓËÉ ×ÏÚÍÏÖÎÏ), ÔÏ ÒÅÚÕÌØÔÉÒÕÀÝÉÊ ÓÉÓÏË ÂÕÄÅÔ ÓÏÄÅÒÖÁÔØ ÕÖÅ ÎÅÓËÏÌØËÏ ÁÒ. óÔÁÎÄÁÒÔÎÁÑ ÆÕÎË ÉÑ reads Ñ×ÌÑÅÔÓÑ ÁÒÓÅÒÏÍ ÄÌÑ ÌÀÂÏÇÏ ÜËÚÅÍÌÑÒÁ ËÌÁÓÓÁ Read:
reads
:: (Read a) => ReadS a
÷ÓÅ ×ÓÔÒÏÅÎÎÙÅ ËÌÁÓÓÙ ÏÂÅÓÅÞÅÎÙ ÔÁËÖÅ ÂÏÌÅÅ ÒÏÓÔÏÊ ÆÕÎË ÉÅÊ read, ÏÂßÑ×ÌÅÎÎÏÊ ÔÁË:
read
:: Read a => String -> a
2. ÷ÓÔÒÏÅÎÎÙÅ ËÌÁÓÓÙ
175
óÔÒÏËÁ, ÅÒÅÄÁ×ÁÅÍÁÑ × ËÁÞÅÓÔ×Å ÁÒÇÕÍÅÎÔÁ ÆÕÎË ÉÉ read ÄÏÌÖÎÁ ÏÌÎÏÓÔØÀ ÏÂÒÁÂÁÔÙ×ÁÔØÓÑ ÁÒÓÅÒÏÍ:
---> 37 ---> 4 ---> 120 ---> True --->
read "34" +3
H
head (read "[1,2℄") +3 read ("1" ++"2"++"3") - 3 read "True" == True read "34xx" +3
Program error: Prelude.read: no parse ÷ ÑÚÙËÅ Haskell ÄÏÕÓËÁÅÔÓÑ ÍÎÏÖÅÓÔ×ÅÎÎÏÅ ÎÁÓÌÅÄÏ×Á ÎÉÅ ËÌÁÓÓÙ ÍÏÇÕÔ ÉÍÅÔØ ÂÏÌÅÅ ÏÄÎÏÇÏ ÒÏÄÉÔÅÌØÓËÏÇÏ ËÌÁÓÓÁ (ÓÕ ÅÒËÌÁÓÓÁ). óÌÅÄÕÀÝÅÅ ÏÂßÑ×ÌÅÎÉÅ ÓÏÚÄÁÅÔ ËÌÁÓÓ C, ÎÁÓÌÅÄÕÀÝÉÊ ÏÅÒÁ ÉÉ ËÌÁÓÓÏ× Eq É Show:
lass (Eq a, Show a) => C a where ... íÅÔÏÄÙ ËÌÁÓÓÁ ÏÔÎÏÓÑÔÓÑ Ë ×ÅÒÈÎÅÍÕ ÕÒÏ×ÎÀ ÏÂßÑ×ÌÅÎÉÊ × Haskell. ïÎÉ ÒÁÚÄÅÌÑÀÔ ÒÏÓÔÒÁÎÓÔ×Ï ÉÍÅÎ ÁÎÁÌÏÇÉÞÎÏ ÏÂÙÞÎÙÍ ÅÒÅÍÅÎÎÙÍ: ÏÄÎÏ É ÔÏ ÖÅ ÉÍÑ ÎÅ ÍÏÖÅÔ ÉÓÏÌØÚÏ×ÁÔØÓÑ ÄÌÑ ÏÂÏ ÚÎÁÞÅÎÉÑ É ÍÅÔÏÄÁ ËÌÁÓÓÁ É ÅÒÅÍÅÎÎÏÊ ÉÌÉ ÄÌÑ ÍÅÔÏÄÏ×, ÒÉÎÁÄ ÌÅÖÁÝÉÍ ÒÁÚÌÉÞÎÙÍ ËÌÁÓÓÁÍ. ëÒÏÍÅ ÏÇÒÁÎÉÞÅÎÉÊ, ÚÁÄÁÎÎÙÈ ÄÌÑ ÔÅËÕÝÅÇÏ ËÌÁÓÓÁ, ÍÅÔÏÄÙ ËÌÁÓÓÁ ÍÏÇÕÔ ÉÍÅÔØ Ó×ÏÉ ÄÏÏÌÎÉÔÅÌØÎÙÅ ÏÇÒÁÎÉÞÅÎÉÑ ÎÁ ÉÓÏÌØ ÚÕÅÍÙÊ ÔÉ ÅÒÅÍÅÎÎÙÈ. îÁÒÉÍÅÒ, × ËÌÁÓÓÅ
lass C a where m :: Show b => a -> b
ÍÅÔÏÄ m ÔÒÅÂÕÅÔ, ÞÔÏÂÙ ÔÉ b Ñ×ÌÑÌÓÑ ÜËÚÅÍÌÑÒÏÍ ËÌÁÓÓÁ Show.
2.4. ëÌÁÓÓ Enum òÁÓÓÍÏÔÒÉÍ ÅÝÅ ÏÄÉÎ ËÌÁÓÓ, ÎÏÓÑÝÉÊ ÎÁÚ×ÁÎÉÅ Enum (ÏÔ enumerate ÅÒÅÞÉÓÌÑÔØ), ËÏÔÏÒÙÊ ÓÏÄÅÒÖÉÔ ÔÉÙ, ÞØÉ ÜÌÅÍÅÎÔÙ ÍÏÇÕÔ ÂÙÔØ ÅÒÅÞÉÓÌÅÎÙ. åÇÏ ÍÉÎÉÍÁÌØÎÏ ×ÏÚÍÏÖÎÏÅ ÏÒÅÄÅÌÅÎÉÅ ÔÁËÏ×Ï:
lass Enum a where toEnum fromEnum
:: Int -> a :: a -> Int
VII. Haskell ËÁË ÑÚÙË ïïð
176
É, ÏÂßÑ×ÌÅÎÎÙÊ ËÁË ÜËÚÅÍÌÑÒ ËÌÁÓÓÁ Enum, ÉÓÏÌØÚÕÅÔ ÆÕÎË ÉÉ toEnum É fromEnum ÄÌÑ ÒÅÏÂÒÁÚÏ×ÁÎÉÑ ÍÅÖÄÕ ÅÇÏ ÜÌÅÍÅÎÔÁ ÍÉ É ÔÉÏÍ Int. æÕÎË ÉÑ fromEnum ÄÏÌÖÎÁ ÂÙÔØ ÌÅ×ÏÏÂÒÁÔÉÍÏÊ (left-inverse) Ï ÏÔÎÏÛÅÎÉÀ Ë ÆÕÎË ÉÉ toEnum, ÉÎÁÞÅ ÇÏ×ÏÒÑ, ÄÏÌÖ ÎÏ ×ÙÏÌÎÑÔØÓÑ ÓÏÏÔÎÏÛÅÎÉÅ
fromEnum(toEnum x) = x
H
ðÒÏ×ÅÒÉÍ ÜÔÏ Ó×ÏÊÓÔ×Ï ÄÌÑ ÔÉÁ Bool, ËÏÔÏÒÙÊ ÏÂßÑ×ÌÅÎ × ÒÅÌÀ ÄÉÉ ËÁË ÜËÚÅÍÌÑÒ ËÌÁÓÓÁ Enum:
---> fromEnum(toEnum 1 :: Bool) 1 2.5. ëÌÁÓÓÙ ÞÉÓÅÌ
Класы чисел Eq
Num
Ord
Show Fractional
Real Enum Integral
Floating RealFrac
RealFloat
ëÌÁÓÓ Num ÏÂßÅÄÉÎÑÅÔ × ÓÅÂÅ ×ÓÅ ÞÉÓÌÁ. íÙ ÕÖÅ ÒÁÓÓÍÁÔÒÉ×ÁÌÉ ÅÇÏ ÏÒÅÄÅÌÅÎÉÅ ÎÁ ÓÔÒ. 167. ÷ ÒÅÌÀÄÉÉ ÏÎ ÏÂßÑ×ÌÅÎ ËÁË ÏÄËÌÁÓÓ ËÌÁÓÓÏ× Eq É Show:
lass (Eq a, Show (+), (-), (*) negate abs, signum fromInteger fromInt
a) => Num a where :: a -> a -> a :: a -> a :: a -> a :: Integer -> a :: Int -> a
3. áÌÇÅÂÒÁÉÞÅÓËÉÅ ÔÉÙ ÄÁÎÎÙÈ
177
îÁ ÒÉÓÕÎËÅ ÉÚÏÂÒÁÖÅÎÁ ÉÅÒÁÒÈÉÑ ËÌÁÓÓÏ× ÞÉÓÅÌ ÑÚÙËÁ Haskell. ëÌÁÓÓ Real ×ËÌÀÞÁÅÔ × ÓÅÂÑ ÔÉÙ ÄÅÊÓÔ×ÉÔÅÌØÎÙÈ ÞÉÓÅÌ, Fra tional ÄÒÏÂÎÙÅ ÞÉÓÌÁ. ëÌÁÓÓ Integral ÓÏÄÅÒÖÉÔ Ä×Á ÔÉÁ ÅÌÙÈ ÞÉÓÅÌ Int É Integer, Á RealFloat ÔÉÙ Float É Double. äÌÑ ÂÏÌÅÅ ÂÌÉÚËÏÇÏ ÚÎÁËÏÍÓÔ×Á Ó ËÌÁÓÓÏÍ Num ÓÌÅÄÕÅÔ ÏÂÒÁÔÉÔØÓÑ Ë ÆÁÊÌÕ Prelude.hs
3. áÌÇÅÂÒÁÉÞÅÓËÉÅ ÔÉÙ ÄÁÎÎÙÈ 3.1. ïÒÅÄÅÌÅÎÉÅ ÎÏ×ÙÈ ÔÉÏ× ÄÁÎÎÙÈ ÷ ÌÀÂÏÍ ÑÚÙËÅ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÑ, ÒÅÄÎÁÚÎÁÞÅÎÎÏÍ ÄÌÑ ÍÏ ÄÅÌÉÒÏ×ÁÎÉÑ ÒÅÁÌØÎÙÈ ÏÂßÅËÔÏ×, ÏÂÑÚÁÔÅÌØÎÏ ÄÏÌÖÎÁ ÂÙÔØ ×ÏÚ ÍÏÖÎÏÓÔØ , ÞÁÓÔÏ ÎÁÚÙ×ÁÅÍÙÈ ÔÉÁÍÉ ÄÁÎÎÙÈ. óÏ×ÒÅÍÅÎÎÙÅ ÆÕÎË ÉÏÎÁÌØÎÙÅ ÑÚÙËÉ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÑ, É Haskell × ÔÏÍ ÞÉÓÌÅ, ÔÁËÖÅ ÉÍÅÀÔ ÔÁËÕÀ ×ÏÚÍÏÖÎÏÓÔØ. ïÔÍÅÔÉÍ, ÞÔÏ ÔÉÙ-ÓÉÎÏÎÉÍÙ, ÒÁÓÓÍÏÔÒÅÎÎÙÅ ÎÁÍÉ ÒÁÎÅÅ, ÎÅ ÓÏÚÄÁÀÔ ÎÏ×ÙÈ ÔÉÏ×, ÏÎÉ ÌÉÛØ ÄÁÀÔ ÕÖÅ ÓÕÝÅÓÔ×ÕÀÝÉÍ ÔÉÁÍ ÂÏÌÅÅ ÕÄÏÂÎÙÅ, ¾ÇÏ×ÏÒÑÝÉÅ¿ ÉÍÅÎÁ, ËÏÔÏÒÙÅ ÄÅÌÁÀÔ ÏÂßÑ×ÌÅÎÉÑ ÆÕÎË ÉÊ ÂÏÌÅÅ ËÏÒÏÔËÉÍÉ É ÉÎÆÏÒÍÁÔÉ×ÎÙÍÉ. É-ÓÉÎÏÎÉÍ ÓÏ ÈÒÁÎÑÅÔ ×ÓÅ Ó×ÏÊÓÔ×Á ÏÒÏÄÉ×ÛÉÈ ÅÇÏ ÔÉÏ×. îÁÒÉÍÅÒ,
ÏÒÅÄÅÌÅÎÉÑ ÎÏ×ÙÈ, ÓÔÒÕËÔÕÒÉÒÏ×ÁÎÎÙÈ ÔÉÏ× ÄÁÎÎÙÈ ÁÌÇÅÂÒÁÉÞÅÓËÉÍÉ
type Position = (Float, Float) type Angle = Float type Distan e = Float move :: Distan e -> Angle -> Position -> Position move d a (x,y) = (x + d * os a, y + d * sin a) úÎÁÞÅÎÉÅ ÏÅÒÁÔÏÒÁ == ÎÁ Angle ÏÚÎÁÞÁÅÔ ÔÏÖÅ ÓÁÍÏÅ, ÞÔÏ É == ÎÁ Float. îÁ ÒÁËÔÉËÅ ÖÅ, ×ÏÚÍÏÖÎÏ ÎÁÍ ÏÔÒÅÂÕÅÔÓÑ ËÁËÏÅ-ÌÉÂÏ ÄÒÕÇÏÅ ÏÒÅÄÅÌÅÎÉÅ. îÁÒÉÍÅÒ, ËÔÏ-ÔÏ ÚÁÈÏÞÅÔ ÏÂßÑ×ÉÔØ ÒÁ×ÅÎÓÔ×Ï ÎÁ Angle, ËÁË ÒÁ×ÅÎÓÔ×Ï Ï ÍÏÄÕÌÀ 2 . ëÏÎÅÞÎÏ, ÍÏÖÎÏ ÂÙÌÏ ÂÙ ÎÁÉÓÁÔØ ÓÅ ÉÁÌØÎÕÀ ÆÕÎË ÉÀ ÄÌÑ ÓÒÁ×ÎÅÎÉÑ Ä×ÕÈ ×ÅÌÉÞÉÎ ÔÉÁ Angle, ÎÏ ÕÄÏÂÎÅÅ ÂÙÌÏ ÂÙ ÉÓÏÌØÚÏ×ÁÔØ ÉÍÅÎÎÏ ÏÅÒÁÔÏÒ ==, ÞÔÏ ÎÅ×ÏÚÍÏÖÎÏ ÓÄÅÌÁÔØ ÏÓÔÁ×ÁÑÓØ × ÒÁÍËÁÈ ÔÉÁ-ÓÉÎÏÎÉÍÁ.
3.2. ðÅÒÅÞÉÓÌÑÅÍÙÅ ÔÉÙ ÷ ÑÚÙËÅ Haskell ÉÍÅÅÔÓÑ ×ÏÚÍÏÖÎÏÓÔØ ÏÒÅÄÅÌÅÎÉÑ ÎÏ×ÙÈ ÓÔÒÕËÔÕÒÉÒÏ×ÁÎÎÙÈ ÔÉÏ× ÄÁÎÎÙÈ ( ) ÕÔÅÍ ÅÒÅÞÉÓÌÅÎÉÑ
datatype
VII. Haskell ËÁË ÑÚÙË ïïð
178
×ÓÅÈ ÉÈ ×ÏÚÍÏÖÎÙÈ ÚÎÁÞÅÎÉÊ. ÁË ÔÉ Bool ÍÏÖÅÔ ÂÙÔØ ÚÁÄÁÎ Ó ÏÍÏÝØÀ ÓÌÅÄÕÀÝÅÇÏ :
ÏÒÅÄÅÌÅÎÉÑ ÔÉÁ ÄÁÎÎÙÈ
data Bool = False | True üÔÁ ÄÅËÌÁÒÁ ÉÑ ÚÁËÒÅÌÑÅÔ ÉÍÑ Bool ÚÁ ÔÉÏÍ ÄÁÎÎÙÈ, ËÏÔÏ ÒÙÊ ÍÏÖÅÔ ÂÙÔØ ÒÅÄÓÔÁ×ÌÅÎ Ä×ÕÍÑ ×ÅÌÉÞÉÎÁÍÉ True É False. óÔÒÕËÔÕÒÉÒÏ×ÁÎÎÙÅ ×ÅÌÉÞÉÎÙ ¾ÓÔÒÏÑÔÓÑ¿ Ó ÏÍÏÝØÀ ÆÕÎË ÉÊ -ËÏÎÓÔÒÕËÔÏÒÏ×. ÷ ÎÁÛÅÍ ÒÉÍÅÒÅ Ä×Á ËÏÎÓÔÒÕËÔÏÒÁ ËÏÎÓÔÁÎÔ ÎÙÅ ÆÕÎË ÉÉ (Ô. Å. ÉÍÅÀÝÉÅ ÎÕÌÅ×ÏÅ ÞÉÓÌÏ ÁÒÁÍÅÔÒÏ×) True É False. éÈ ÍÏÖÎÏ ÉÓÏÌØÚÏ×ÁÔØ × ËÁÞÅÓÔ×Å ÏÂÒÁÚ Ï× ÓÏÏÔ×ÅÔÓÔ×ÉÑ × ÆÕÎË ÉÑÈ. ðÒÉ ÏÒÅÄÅÌÅÎÉÉ ÆÕÎË ÉÊ Ó ÌÏÇÉÞÅÓËÉÍÉ ÁÒÇÕÍÅÎ ÔÁÍÉ True É False ×ÙÓÔÕÁÀÔ × ËÁÞÅÓÔ×Å ÏÂÒÁÚ Ï× ÓÏÏÓÔÁ×ÌÅÎÉÑ, ÎÁÒÉÍÅÒ, ÆÕÎË ÉÑ ÏÔÒÉ ÁÎÉÑ ÏÒÅÄÅÌÑÅÔÓÑ ÔÁË:
not :: Bool -> Bool not False = True not True = False ä×Á ÕÒÁ×ÎÅÎÉÑ, ÚÁÄÁÀÝÉÅ ÆÕÎË ÉÀ not ÉÓÏÌØÚÕÀÔÓÑ ËÏÍØÀÔÅ ÒÏÍ ËÁË ÒÁ×ÉÌÁ ÅÒÅÉÓÙ×ÁÎÉÑ ÄÌÑ ÕÒÏÝÅÎÉÑ ×ÙÒÁÖÅÎÉÊ ×ÉÄÁ not e. óÎÁÞÁÌÁ ÕÒÏÝÁÅÔÓÑ ×ÙÒÁÖÅÎÉÅ e. åÓÌÉ ÒÅÚÕÌØÔÁÔ ÒÁ×ÅÎ False, ÔÏ ÉÓÏÌØÚÕÅÔÓÑ ÅÒ×ÏÅ ÕÒÁ×ÎÅÎÉÅ, Á ÅÓÌÉ True ÔÏ ×ÔÏÒÏÅ. ðÒÉ ÏÂßÑ×ÌÅÎÉÉ ÎÏ×ÏÇÏ ÔÉÁ ÄÁÎÎÙÈ ÍÙ ÉÓÏÌØÚÏ×ÁÌÉ Bool. ÷ ÜÔÏÍ ÒÉÍÅÒÅ Bool ÅÓÔØ ÎÕÌØÍÅÒÎÙÊ ËÏÎ ÓÔÒÕËÔÏÒ, ÏÎ ÎÅ ÚÁ×ÉÓÉÔ ÏÔ ÁÒÁÍÅÔÒÏ×. ëÏÎÓÔÒÕËÔÏÒ ÔÉÁ Bool ÍÏÖÅÔ ÏÑ×ÌÑÔØÓÑ × ÏÂßÑ×ÌÅÎÉÑÈ ÔÉÁ É ÎÅ ÍÏÖÅÔ ÂÙÔØ ÞÁÓÔØÀ ÔÏÇÏ ÉÌÉ ÉÎÏÇÏ ×ÙÒÁÖÅÎÉÑ. úÁÉÓØ, ÏÄÏÂÎÁÑ x = Bool, ÎÅ ÉÍÅÅÔ ÓÍÙÓÌÁ. ó ÄÒÕÇÏÊ ÓÔÏÒÏÎÙ, True É False Ñ×ÌÑÀÔÓÑ (ÎÕÌØ ÍÅÒÎÙÍÉ) . ïÎÉ ÏÑ×ÌÑÀÔÓÑ × ×ÙÒÁÖÅ ÎÉÑÈ ÉÌÉ × ÛÁÂÌÏÎÁÈ (ÏÂÒÁÚ ÁÈ ÓÏÏÔ×ÅÔÓÔ×ÉÑ). úÁÉÓØ, ÁÎÁÌÏÇÉÞ ÎÁÑ, x :: True ÏÛÉÂÏÞÎÁ. ëÏÎÓÔÒÕËÔÏÒÙ ÄÁÎÎÙÈ ÍÏÇÕÔ ÉÓÏÌØ ÚÏ×ÁÔØÓÑ ÔÏÌØËÏ ÒÉ ÏÒÅÄÅÌÅÎÉÉ ÄÁÎÎÙÈ. ðÏÄÏÂÎÙÍ ÏÂÒÁÚÏÍ ÍÏÖÎÏ ÂÙÌÏ ÂÙ ÏÒÅÄÅÌÉÔØ É ÔÉ Char, Å ÒÅÞÉÓÌÉ× ×ÓÅ ÅÇÏ ÚÎÁÞÅÎÉÑ. ïÄÎÁËÏ ÚÁÄÁÎÉÅ ÆÕÎË ÉÊ, ÉÓÏÌØÚÕÀ ÝÉÈ ÓÏÏÓÔÁ×ÌÅÎÉÅ Ó ÏÂÒÁÚ ÏÍ ÄÌÑ ×ÅÌÉÞÉÎ ÏÌÕÞÅÎÎÏÇÏ ÔÉÁ, ÚÁ ÎÑÌÏ ÂÙ ÚÎÁÞÉÔÅÌØÎÏÅ ×ÒÅÍÑ, ÔÁË ËÁË ËÏÌÉÞÅÓÔ×Ï ×ÏÚÍÏÖÎÙÈ ÚÎÁ ÞÅÎÉÊ ÄÁÎÎÏÇÏ ÔÉÁ ×ÅÌÉËÏ. òÁÓÓÍÏÔÒÉÍ ÄÒÕÇÏÊ ÒÉÍÅÒ. ðÒÅÄÏÌÏÖÉÍ, ÞÔÏ ÒÏÇÒÁÍÍÁ ÄÏÌÖÎÁ ÏÅÒÉÒÏ×ÁÔØ Ó ÄÎÑÍÉ ÎÅÄÅÌÉ. ÷ÏÚÍÏÖÎÙÍ ×ÁÒÉÁÎÔÏÍ ÒÅÛÅ ÎÉÑ ÚÁÄÁÞÉ Ñ×ÌÑÅÔÓÑ ÒÅÄÓÔÁ×ÌÅÎÉÅ ÄÎÅÊ ÎÅÄÅÌÉ ÅÌÙÍÉ ÞÉÓÌÁÍÉ ÏÔ 0 ÄÏ 6 Ó ÄÁÌØÎÅÊÛÉÍ ××ÅÄÅÎÉÅÍ ÔÉÁ-ÓÉÎÏÎÉÍÁ
ËÏÎ
ÓÔÒÕËÔÏÒ ÔÉÁ
ÔÏÌØËÏ
ËÏÎÓÔÒÕËÔÏÒÁÍÉ ÄÁÎÎÙÈ
type Day = Int
3. áÌÇÅÂÒÁÉÞÅÓËÉÅ ÔÉÙ ÄÁÎÎÙÈ
179
äÌÑ ÌÀÂÏÊ ÆÕÎË ÉÉ, ÉÓÏÌØÚÕÀÝÅÊ ÏÒÅÄÅÌÅÎÎÙÊ ÔÁËÉÍ ÏÂÒÁÚÏÍ ÔÉ Day, ÎÁÍ ÒÉÄÅÔÓÑ ×ËÌÀÞÁÔØ ÒÅÄ×ÁÒÉÔÅÌØÎÕÀ ÒÏ×ÅÒËÕ ÁÒÇÕ ÍÅÎÔÁ ÆÕÎË ÉÉ ÎÁ ÒÉÎÁÄÌÅÖÎÏÓÔØ ÕËÁÚÁÎÎÏÍÕ ×ÙÛÅ ÄÉÁÁÚÏÎÕ:
f :: Day -> String -- pre 0 <= d <= 6 ðÏÄÏÂÎÏÅ ÒÅÄÓÔÁ×ÌÅÎÉÅ ÉÍÅÅÔ ÎÅÓËÏÌØËÏ ÏÞÅ×ÉÄÎÙÈ ÎÅÄÏÓÔÁÔËÏ×, Á ÉÍÅÎÎÏ: ×ÅÌÉÞÉÎÁ ÔÉÁ Int, ÉÓÏÌØÚÕÅÍÁÑ × ÜÔÏÍ ÓÌÕÞÁÅ, ÍÏÖÅÔ ÂÙÔØ ÎÅ×ÅÒÎÏ ÉÓÔÏÌËÏ×ÁÎÁ ÒÉ ÏÙÔËÅ ËÅÍ-ÌÉÂÏ ÒÁÚÏÂÒÁÔØÓÑ × ÒÏ ÇÒÁÍÍÅ (ÎÁÒÉÍÅÒ, ÍÏÖÎÏ ÚÁÂÙÔØ, ÞÔÏ d ÒÅÄÓÔÁ×ÌÑÅÔ ×ÅÌÉÞÉ ÎÕ Day, ÉÌÉ ÞÔÏ 4 ÏÚÎÁÞÁÅÔ ÞÅÔ×ÅÒÇ); ÉÎÏÇÄÁ ÒÉ ÉÓÏÌØÚÏ×ÁÎÉÉ f ÍÏÖÎÏ ÚÁÂÙÔØ Ï ÒÅÄÕÓÌÏ×ÉÉ; ÍÏÖÎÏ Ï ÎÅ×ÎÉÍÁÔÅÌØÎÏÓÔÉ ¾ÒÁÚÒÕÛÉÔØ¿ ÄÏÇÏ×ÏÒÅÎÎÏÓÔØ Ï ÉÓÏÌØÚÏ×ÁÎÉÉ ÔÁËÉÈ ×ÅÌÉÞÉÎ (ÎÁÒÉÍÅÒ, ÕÍÎÏÖÉÔØ ×ÅÌÉÞÉÎÕ ÔÉÁ Day ÎÁ 10); ÍÏÖÎÏ ÓÌÕÞÁÊÎÏ ÅÒÅÄÁÔØ ÔÁËÕÀ ×ÅÌÉÞÉÎÕ ×ÍÅÓÔÏ ÞÉÓÌÁ ÔÉÁ Int (ÎÁÒÉÍÅÒ, ÅÓÌÉ × ÆÕÎË ÉÉ, ÇÄÅ Int ÒÅÄÓÔÁ×ÌÑÅÔ ÔÅÍÅ ÒÁÔÕÒÕ ÉÌÉ ÒÁÓÓÔÏÑÎÉÅ).
I õÒÁÖÎÅÎÉÅ VII.3.1
ïÒÅÄÅÌÉÔÅ ÔÉ-ÓÉÎÏÎÉÍ Day É ×ÅÌÉÞÉÎÕ d ÜÔÏÇÏ ÔÉÁ:
type Day = Int d :: Day d = 1 õÓÔÁÎÏ×É× Ó ÏÍÏÝØÀ ËÏÍÁÎÄÙ :set +t ×Ù×ÏÄ ÉÎÔÅÒÒÅÔÁÔÏÒÏÍ Hugs ÉÎÆÏÒÍÁ ÉÉ Ï ÔÉÁÈ ×ÅÌÉÞÉÎ, ×ÙÏÌÎÉÔÅ ÓÌÅÄÕÀÝÉÅ ×ÙÞÉ ÓÌÅÎÉÑ:
---> d 1 :: Day ---> d-10 -9 :: Int ---> d*10 10 :: Int ðÒÉÍÅÒÙ ÏËÁÚÙ×ÁÀÔ, ÞÔÏ ×ÅÌÉÞÉÎÙ ÜÔÏÇÏ ÔÉÁ ÎÉÞÅÍ ÎÅ ÏÔÌÉÞÁ ÀÔÓÑ ÏÔ ÅÌÙÈ ÞÉÓÅÌ.
J
H
VII. Haskell ËÁË ÑÚÙË ïïð
180
Haskell ÒÅÄÏÓÔÁ×ÌÑÅÔ ×ÏÚÍÏÖÎÏÓÔØ ÏÒÅÄÅÌÉÔØ ÔÉ Day ÂÏÌÅÅ ÏÄÈÏÄÑÝÉÍ ÏÂÒÁÚÏÍ ÏÒÅÄÅÌÉÔØ ÓÏ×ÅÒÛÅÎÎÏ ÔÉ Ó ÏÍÏ ÝØÀ ÄÅËÌÁÒÁ ÉÉ data:
ÎÏ×ÙÊ
data Day = Sun | Mon | Tue | Wed | Thu | Fri | Sat ÷ ÒÅÚÕÌØÔÁÔÅ ÔÁËÏÇÏ ÏÒÅÄÅÌÅÎÉÑ ÂÕÄÅÔ ÓÏÚÄÁÎ ÎÏ×ÙÊ ÔÉ ÄÁÎÎÙÈ Day. óÅÍØ ËÏÎÓÔÁÎÔÎÙÈ ÆÕÎË ÉÊ (ÏÓÔÏÑÎÎÙÈ ÚÎÁÞÅÎÉÊ) Ñ×ÌÑÀÔ ÓÑ ÔÉÁ ÄÁÎÎÙÈ Day. ïÂÙÞÎÏ ÉÍÅÎÁ ËÏÎ ÓÔÒÕËÔÏÒÏ× ÏÔÌÉÞÁÀÔÓÑ ÔÅÍ, ÞÔÏ ÎÁÞÉÎÁÀÔÓÑ Ó ÚÁÇÌÁ×ÎÏÊ ÂÕË×Ù, ÔÁË ÖÅ ËÁË É ÉÍÑ ÓÏÚÄÁ×ÁÅÍÏÇÏ ÔÉÁ ÄÁÎÎÙÈ. ëÏÎÓÔÒÕËÔÏÒÙ ÓÌÕ ÖÁÔ ÌÉÛØ ÄÌÑ ÓÏÚÄÁÎÉÑ ×ÅÌÉÞÉÎ ÎÏ×ÏÇÏ ÔÉÁ ÄÁÎÎÙÈ. ïÎÉ ÎÅÑ×ÎÏ ÏÒÅÄÅÌÑÀÔÓÑ ÒÉ ÏÑ×ÌÅÎÉÉ × ×ÙÒÁÖÅÎÉÑÈ data. ëÏÎÓÔÒÕËÔÏÒÙ ÞÁÓÔÏ ÎÁÚÙ×ÁÀÔÓÑ , Á ËÏÎÓÔÒÕËÔÏ ÒÙ ÂÅÚ ÁÒÇÕÍÅÎÔÏ× .
ËÏÎÓÔÒÕËÔÏÒÁÍÉ ÄÁÎÎÙÈ
ËÏÎÓÔÒÕÉÒÕÀÝÉÍÉ ÆÕÎË ÉÑÍÉ ËÏÎÓÔÁÎÔÁÍÉ ÄÁÎÎÙÈ
I õÒÁÖÎÅÎÉÅ VII.3.2
ðÕÓÔØ ÎÁÍ ÔÒÅÂÕÅÔÓÑ ÎÁÉÓÁÔØ ÆÕÎË ÉÀ analyse, ÂÅÒÕÝÕÀ ÔÒÉ ÏÌÏÖÉÔÅÌØÎÙÈ ÅÌÙÈ ÞÉÓÌÁ a b É , ÒÁÓÏÌÏÖÅÎÎÙÅ × ÎÅÕÂÙ×Á ÀÝÅÍ ÏÒÑÄËÅ. üÔÉ ÔÒÉ ÞÉÓÌÁ ÒÅÄÓÔÁ×ÌÑÀÔ ÓÏÂÏÊ ÄÌÉÎÙ ÓÔÏÒÏÎ ÎÅËÏÔÏÒÏÇÏ ÔÒÅÕÇÏÌØÎÉËÁ. æÕÎË ÉÑ analyse ÏÒÅÄÅÌÑÅÔ, ×ÏÚÍÏÖÎÏ ÌÉ ÓÕÝÅÓÔ×Ï×ÁÎÉÅ ÔÒÅÕÇÏÌØÎÉËÁ Ó ÔÁËÉÍÉ ÓÔÏÒÏÎÁÍÉ É ÅÓÌÉ ÄÁ, ÔÏ Ñ×ÌÑÅÔÓÑ ÌÉ ÏÌÕÞÅÎÎÙÊ ÔÒÅÕÇÏÌØÎÉË ÔÒÅÕÇÏÌØÎÉËÏÍ ÏÂÝÅÇÏ ÔÉÁ (Ô. Å. Ó ÔÒÅÍÑ ÒÁÚÌÉÞÎÙÍÉ ÓÔÏÒÏÎÁÍÉ), ÒÁ×ÎÏÂÅÄÒÅÎÎÙÍ ÉÌÉ ÒÁ× ÎÏÓÔÏÒÏÎÎÉÍ. îÁÏÍÎÉÍ, ÞÔÏ ÔÒÉ ÏÔÒÅÚËÁ ÏÂÒÁÚÕÀÔ ÔÒÅÕÇÏÌØÎÉË, ÔÏÇÄÁ É ÔÏÌØËÏ ÔÏÇÄÁ, ËÏÇÄÁ ÄÌÉÎÁ ÎÁÉÂÏÌØÛÅÊ ÓÔÏÒÏÎÙ ÎÅ ÒÅ×ÏÓ ÈÏÄÉÔ ÓÕÍÍÕ Ä×ÕÈ ÄÒÕÇÉÈ (ÎÅÒÁ×ÅÎÓÔ×Ï ÔÒÅÕÇÏÌØÎÉËÁ). ÁËÉÍ ÏÂÒÁÚÏÍ analyse ÄÏÌÖÎÁ ×ÏÚ×ÒÁÝÁÔØ ÏÄÎÏ ÉÚ ÞÅÔÙÒÅÈ ×ÏÚÍÏÖÎÙÈ ÚÎÁÞÅÎÉÊ. íÏÖÎÏ ÂÙÌÏ ÂÙ ÉÓÏÌØÚÏ×ÁÔØ ÞÅÔÙÒÅ ÒÁÚ ÌÉÞÎÙÈ ÞÉÓÌÁ ÄÌÑ ËÏÄÉÒÏ×ÁÎÉÑ ÜÔÉÈ ÓÌÕÞÁÅ×, ÎÏ ÇÏÒÁÚÄÏ ÌÕÞÛÅ ××ÅÓÔÉ ÓÅ ÉÁÌØÎÙÊ ÔÉ ÄÁÎÎÙÈ, ÎÅÏÂÈÏÄÉÍÙÊ ÄÌÑ ÜÔÏÊ ÚÁÄÁÞÉ:
data Triangle = | | |
Failure Isos eles Equilateral S alene
-----
ÆÉËÔÉ×ÎÙÊ ÒÁ×ÎÏÂÅÄÒÅÎÎÙÊ ÒÁ×ÎÏÓÔÏÒÏÎÎÉÊ ÏÂÝÅÇÏ ×ÉÄÁ
üÔÏ ÏÒÅÄÅÌÅÎÉÅ ××ÏÄÉÔ ÎÏ×ÙÊ ÔÉ ÄÁÎÎÙÈ Triangle, ÉÍÅÀÝÉÊ ÞÅÔÙÒÅ ÚÎÁÞÅÎÉÑ. ÅÅÒØ ÒÏÇÒÁÍÍÁ ÍÏÖÅÔ ×ÙÇÌÑÄÅÔØ ÔÁË:
analyse :: (Int, Int, Int) -> Triangle analyse (a, b, ) | a + b <= = Failure | a == = Equilateral
3. áÌÇÅÂÒÁÉÞÅÓËÉÅ ÔÉÙ ÄÁÎÎÙÈ
181
| (a == b) || (b == ) = Isos eles | otherwise = S alene ÷ÅÔËÁ otherwise ÒÉÎÉÍÁÅÔ ÚÎÁÞÅÎÉÅ True, ÅÓÌÉ ×ÓÅ ÒÅÄÙÄÕÝÉÅ ÕÓÌÏ×ÉÑ ×ÏÚ×ÒÁÔÉÌÉ ÚÎÁÞÅÎÉÑ False (ÏÔÍÅÔÉÍ, ÞÔÏ ÔÁËÏÅ ÏÒÅÄÅ ÌÅÎÉÅ ÆÕÎË ÉÉ alalyse ËÏÒÒÅËÔÎÏ ÔÏÌØËÏ ÒÉ ÒÅÄÏÌÏÖÅÎÉÉ 0 6 a 6 b 6 ). ïÂÒÁÔÉÔÅ ×ÎÉÍÁÎÉÅ, ÞÔÏ ÏÅÒÁÔÏÒÙ == É <= (ÍÅÎØÛÅ ÉÌÉ ÒÁ×ÎÏ) ÉÓÏÌØÚÕÀÔÓÑ ÚÄÅÓØ ÄÌÑ ÏÅÒÁ ÉÊ ÓÒÁ×ÎÅÎÉÑ ÅÒÅÍÅÎ ÎÙÈ ÔÉÁ Int.
---> analyse Equilateral ---> analyse Failure ---> analyse Isos eles ---> analyse S alene
(2,2,2)
H
(2,2,9) (12,12,19) (3,4,5)
J
ïÄÎÏÊ ÉÚ ÍÏÝÎÙÈ ËÏÎ Å ÉÊ ÏÂßÅËÔÎÏ-ÏÒÉÅÎÔÉÒÏ×ÁÎÎÏÇÏ ÒÏ ÇÒÁÍÍÉÒÏ×ÁÎÉÑ Ñ×ÌÑÅÔÓÑ ÒÅÁÌÉÚÁ ÉÑ ÍÅÈÁÎÉÚÍÁ ÎÁÓÌÅÄÏ×ÁÎÉÑ. É ÄÁÎÎÙÈ, ÏÒÅÄÅÌÅÎÎÙÊ Ó ÏÍÏÝØÀ ÄÅËÌÁÒÁ ÉÉ data, ÔÁËÖÅ ÍÏÖÅÔ ÎÁÓÌÅÄÏ×ÁÔØ Ó×ÏÊÓÔ×Á ÔÏÇÏ ÉÌÉ ÉÎÏÇÏ ËÌÁÓÓÁ. äÌÑ Á×ÔÏÍÁ ÔÉÞÅÓËÏÇÏ ÎÁÓÌÅÄÏ×ÁÎÉÑ ÓÌÅÄÕÅÔ ÕËÁÚÁÔØ ÏÓÌÅ ÅÒÅÞÉÓÌÅÎÉÑ ËÏÎ ÓÔÒÕËÔÏÒÏ× ÄÁÎÎÙÈ ËÌÀÞÅ×ÏÅ ÓÌÏ×Ï deriving (ÄÏÓÌÏ×ÎÏ: ×ÓÁÓÙ×Á ÎÉÅ) É × ËÒÕÇÌÙÈ ÓËÏÂËÁÈ ÅÒÅÞÉÓÌÉÔØ ÉÍÅÎÁ ÔÒÅÂÕÅÍÙÈ ËÌÁÓÓÏ×. ðÒÉ ÎÁÓÌÅÄÏ×ÁÎÉÉ ÍÅÔÏÄÏ× ËÌÁÓÓÁ Eq ×ÅÌÉÞÉÎÙ, ÚÁÄÁ×ÁÅÍÙÅ ÒÁÚÌÉÞÎÙÍÉ ËÏÎÓÔÒÕËÔÏÒÁÍÉ ÄÁÎÎÙÈ, ÎÅ ÒÁ×ÎÙ ÍÅÖÄÕ ÓÏÂÏÊ. ðÒÉ ÎÁÓÌÅÄÏ×ÁÎÉÉ Ó×ÏÊÓÔ× ËÌÁÓÓÁ Ord ÕÓÔÁÎÁ×ÌÉ×ÁÅÔÓÑ ÌÅËÓÉËÏÇÒÁÆÉ ÞÅÓËÉÊ ÏÒÑÄÏË ÎÁ ×ÅÌÉÞÉÎÁÈ ÄÁÎÎÏÇÏ ËÌÁÓÓÁ: ÅÓÌÉ ÏÄÉÎ ËÏÎÓÔÒÕË ÔÏÒ ÄÁÎÎÙÈ ÕËÁÚÁÎ × ÄÅËÌÁÒÁ ÉÉ data ÒÁÎÅÅ ÄÒÕÇÏÇÏ, ÔÏ ×ÅÌÉÞÉÎÁ, ÚÁÄÁ×ÁÅÍÁÑ ÉÍ ÂÕÄÅÔ ÓÞÉÔÁÔØÓÑ ÍÅÎØÛÅÊ, ÞÅÍ ÄÒÕÇÁÑ. ìÀÂÏÊ ÅÒÅ ÞÉÓÌÑÅÍÙÊ ÔÉ ÄÁÎÎÙÈ, ÚÁÄÁ×ÁÅÍÙÊ Ó ÏÍÏÝØÀ ÄÅËÌÁÒÁ ÉÉ data, ÍÏÖÎÏ ÔÁËÖÅ ÏÂßÑ×ÉÔØ ËÁË ÜËÚÅÍÌÑÒ ËÌÁÓÓÁ Enum, ÎÁÒÉÍÅÒ,
data Car = Ford | Jag | Mer | Pors he deriving (Show, Read, Ord, Eq, Enum) ---> Mer == Jag False ---> Jag > Ford True
H
VII. Haskell ËÁË ÑÚÙË ïïð
182
---> Jag > Mer False ---> [Jag .. ℄ [Jag,Mer ,Pors he℄ åÓÌÉ Ï ËÁËÉÍ-ÌÉÂÏ ÒÉÞÉÎÁÈ ÒÁÚÒÁÂÏÔÞÉËÁ ÎÅ ÕÓÔÒÁÉ×ÁÅÔ ÎÁ ÓÌÅÄÕÅÍÙÊ ÍÅÔÏÄ, ÔÏ Ó ÏÍÏÝØÀ ÄÅËÌÁÒÁ ÉÉ instan e ÅÇÏ ÍÏÖÎÏ ÅÒÅÏÒÅÄÅÌÉÔØ.
I õÒÁÖÎÅÎÉÅ VII.3.3
÷ÅÌÉÞÉÎÙ ÔÉÁ Bool, ÚÁÄÁÎÎÏÇÏ × ÒÅÌÀÄÉÉ, ÍÏÇÕÔ ÓÒÁ×ÎÉ×ÁÔØÓÑ ÍÅÖÄÕ ÓÏÂÏÊ É ×Ù×ÏÄÉÔØÓÑ ÎÁ ÅÞÁÔØ. ïÒÅÄÅÌÉÍ ÔÉ Bool', Ï ÄÏÂÎÙÊ Bool, ÏÒÅÄÅÌÉ× ÅÇÏ Ó ÏÍÏÝØÀ ÄÅËÌÁÒÁ ÉÊ instan e ËÁË ÜËÚÅÍÌÑÒ ËÌÁÓÓÏ× Eq, Ord É Show. äÌÑ ÜÔÏÇÏ ÓÌÅÄÕÅÔ ÅÒÅÇÒÕÚÉÔØ ÍÅÔÏÄÙ ÜÔÉÈ ËÌÁÓÓÏ×:
data Bool' = True' | False' instan e True' True' False' False' x /= y
Eq == == == ==
Bool' where True' = True False' = False True' = False False' = True = not (x == y)
instan e True' True' False' False' x <= y x > y x >= y
Ord Bool' where < True' = False < False' = True < True' = False < False' = False = x < y || x == y = not (x <= y) = x > y || x == y
instan e Show Bool' where show True' = "éÓÔÉÎÁ" show False' = "ìÏÖØ"
H
ÅÅÒØ ×ÅÌÉÞÉÎÁÍÉ ÔÉÁ Bool' ÍÏÖÎÏ ÓÒÁ×ÎÉ×ÁÔØ ÍÅÖÄÕ ÓÏÂÏÊ, ÁÎÁÌÏÇÉÞÎÏ ÓÔÁÎÄÁÒÔÎÙÍ ÌÏÇÉÞÅÓËÉÍ ÚÎÁÞÅÎÉÑÍ, ÎÏ ÉÈ ÏÔÏÂÒÁÖÅ ÎÉÅ ÒÉ ×Ù×ÏÄÅ ÎÁ ÅÞÁÔØ ÂÕÄÅÔ ÏÔÌÉÞÁÔØÓÑ ÏÔ ÓÔÁÎÄÁÒÔÎÏÇÏ:
---> True' < False'
3. áÌÇÅÂÒÁÉÞÅÓËÉÅ ÔÉÙ ÄÁÎÎÙÈ
183
True ---> True' > False' False ---> True' == False' False ---> True' /= False' True ---> putStr (show True') éÓÔÉÎÁ ïÔÍÅÔÉÍ, ÞÔÏ ÍÏÖÎÏ ÂÙÌÏ ÂÙ ÓÄÅÌÁÔØ ÄÏÓÔÕÎÙÍÉ ×ÓÅ, ÏÒÅÄÅÌÅÎ ÎÙÅ ÎÁ ËÌÁÓÓÁÈ Eq, Ord É Show ÏÅÒÁÔÏÒÙ É ÆÕÎË ÉÉ, ÕËÁÚÁ×, ÞÔÏ ÄÁÎÎÙÊ ÔÉ ÄÁÎÎÙÈ ÎÁÓÌÅÄÕÅÔ Ó×ÏÊÓÔ×Á ÅÒÅÞÉÓÌÅÎÎÙÈ ËÌÁÓÓÏ×:
data Bool' = True' | False' deriving (Eq, Ord, Show)
J
3.3. ðÏÌÉÍÏÒÆÎÙÅ ÔÉÙ ÄÁÎÎÙÈ ëÒÏÍÅ ÏÂßÑ×ÌÅÎÉÑ ÔÉÁ ÒÉ ÏÍÏÝÉ ÅÒÅÞÉÓÌÅÎÉÑ ËÏÎÓÔÁÎÔ, ×ÈÏÄÑÝÉÈ × ÎÅÇÏ, ÍÙ ÍÏÖÅÍ ÏÂßÑ×ÌÑÔØ ÔÉÙ, ÞØÉ ×ÅÌÉÞÉÎÙ ÚÁ×É ÓÑÔ ÏÔ ÄÒÕÇÉÈ ÔÉÏ×. îÁÒÉÍÅÒ,
data Either = Left Bool | Right Char üÔÏ ÏÂßÑ×ÌÅÎÉÅ ÔÉÁ ÄÁÎÎÙÈ Either (ÏÔ ÁÎÇ. either ÏÄÉÎ ÉÚ Ä×ÕÈ, ÔÏÔ ÉÌÉ ÄÒÕÇÏÊ), ÞØÉ ÚÎÁÞÅÎÉÑ ÏÒÅÄÅÌÑÀÔÓÑ × ÆÏÒÍÅ Left b, ÇÄÅ b ÌÏÇÉÞÅÓËÁÑ ×ÅÌÉÞÉÎÁ, É Right , ÇÄÅ ÓÉÍ×ÏÌ. É Either ËÏÍÂÉÎÉÒÕÅÔ ÌÏÇÉÞÅÓËÉÅ É ÓÉÍ×ÏÌØÎÙÅ ×ÅÌÉÞÉÎÙ × ÏÄÉÎ ÏÂÝÉÊ ÔÉ. íÙ ÍÏÖÅÍ ÏÂÏÂÝÉÔØ ÜÔÕ ÉÄÅÀ, ÏÒÅÄÅÌÉ× ÔÉ:
ÏÌÉÍÏÒÆÎÙÊ
data Either a b = Left a | Right b ó ÜÔÉÍ ÏÂÏÂÝÅÎÉÅÍ ÒÅÄÙÄÕÝÉÊ ÔÉ ÍÏÖÎÏ ÚÁÄÁÔØ ËÁË Either Bool Char. ðÏÌÉÍÏÒÆÉÚÍ ÏÚ×ÏÌÑÅÔ ÁÒÁÍÅÔÒÉÚÏ×ÁÔØ ÏÒÅÄÅÌÅ ÎÉÅ ÔÉÁ ÄÁÎÎÙÈ, Ô. Å. ××ÏÄÉÔØ × ÎÅÇÏ ÔÉ ÈÒÁÎÉÍÙÈ ÏÂßÅËÔÏ× × ËÁÞÅÓÔ×Å ÁÒÁÍÅÔÒÁ. îÁÏÍÎÉÍ, ÞÔÏ a É b ÎÁÚÙ×ÁÀÔÓÑ , Ñ×ÌÑÑÓØ ÎÅËÏÔÏÒÙÍÉ ÉÄÅÎÔÉÆÉËÁÔÏÒÁÍÉ, ÏÂÏÚÎÁÞÁÀÝÉ ÍÉ ÔÉ. éÍÅÎÁ Left É Right ÚÁÄÁÀÔ ËÏÎÓÔÒÕËÔÏÒÙ ÄÌÑ ÏÓÔÒÏÅÎÉÑ ×Å ÌÉÞÉÎ ÔÉÁ Either, Ñ×ÌÑÀÝÉÅÓÑ ÎÅÓÔÒÏÇÉÍÉ ÆÕÎË ÉÑÍÉ:
ÍÉ ÔÉÁ
Left :: a -> Either a b Right :: b -> Either a b
ÅÒÅÍÅÎÎÙ
184
VII. Haskell ËÁË ÑÚÙË ïïð
îÅ ÓÌÅÄÕÅÔ ÏÂßÑ×ÌÑÔØ ÔÉ ÆÕÎË ÉÉ-ËÏÎÓÔÒÕËÔÏÒÁ, ÔÁË ËÁË ÏÎ Á×ÔÏÍÁÔÉÞÅÓËÉ ×Ù×ÏÄÉÔÓÑ ÉÚ ÄÅËÌÁÒÁ ÉÉ ÔÉÁ, ÉÓÏÌØÚÕÀÝÅÇÏ ÄÁÎÎÙÊ ËÏÎÓÔÒÕËÔÏÒ. I õÒÁÖÎÅÎÉÅ VII.3.4
óÏÚÄÁÊÔÅ ÓËÒÉÔ, ÓÏÄÅÒÖÁÝÉÊ ÏÂßÑ×ÌÅÎÉÅ ÒÁÓÓÍÏÔÒÅÎÎÏÇÏ ×ÙÛÅ ÏÌÉÍÏÒÆÎÏÇÏ ÔÉÁ. ÁË ËÁË ÔÉ Either ÕÖÅ ××ÅÄÅÎ × ÒÅÁÍÂÕ ÌÅ, Á ¾ÓËÒÙÔØ¿ ÏÒÅÄÅÌÅÎÎÙÅ ÔÁÍ ÔÉÙ ÎÅ×ÏÚÍÏÖÎÏ, ÔÏ ÉÓÏÌØÚÕÊ ÔÅ ÉÍÑ Either' ÄÌÑ ÓÏÚÄÁ×ÁÅÍÏÇÏ ÔÉÁ ÄÁÎÎÙÈ É ÉÍÅÎÁ Left' É Right' ÄÌÑ ÅÇÏ ËÏÎÓÔÒÕËÔÏÒÏ×.
J
H
ëÏÎÓÔÒÕËÔÏÒÙ ÄÁÎÎÙÈ ÌÉÛØ ÓÏÚÄÁÀÔ ×ÅÌÉÞÉÎÕ ÕËÁÚÁÎÎÏÇÏ ÔÉ Á, ÔÁË Left 3 ÅÓÔØ ×ÙÒÁÖÅÎÉÅ × ÅÇÏ ÒÏÓÔÅÊÛÅÊ ×ÏÚÍÏÖÎÏÊ ÆÏÒ ÍÅ ÅÇÏ ÎÅ×ÏÚÍÏÖÎÏ ÕÒÏÓÔÉÔØ. ÷ÙÒÁÖÅÎÉÑ, ×ËÌÀÞÁÀÝÉÅ ËÏÎ ÓÔÒÕËÔÏÒÙ ÄÁÎÎÙÈ ÍÏÇÕÔ ÏÑ×ÌÑÔØÓÑ × ÏÂÒÁÚ ÁÈ ÓÏÏÔ×ÅÔÓÔ×ÉÑ ÌÅ ×ÏÓÔÏÒÏÎÎÅÊ ÞÁÓÔÉ ÏÒÅÄÅÌÅÎÉÑ ÆÕÎË ÉÉ. îÁÒÉÍÅÒ,
ase' :: (a -> , b -> ) -> Either a b ->
ase' (f, g) (Left x) = f x
ase' (f, g) (Right y) = g y æÕÎË ÉÑ ase' ÏÌÕÞÁÅÔ Ä×Á ÁÒÇÕÍÅÎÔÁ: ÁÒÕ ÆÕÎË ÉÊ É ×ÅÌÉÞÉ ÎÕ ÔÉÁ Either. åÓÌÉ ÜÔÁ ×ÅÌÉÞÉÎÁ ÓÏÚÄÁÎÁ ÒÉ ÏÍÏÝÉ ËÏÎÓÔÒÕË ÔÏÒÁ Left, ÔÏ ÒÉÍÅÎÑÅÔÓÑ ÅÒ×ÁÑ ÆÕÎË ÉÑ ÉÚ ÁÒÙ, Á ÅÓÌÉ ÒÉ ÏÍÏÝÉ ËÏÎÓÔÒÕËÔÏÒÁ Right, ÔÏ ×ÔÏÒÁÑ. ðÏÓÍÏÔÒÉÔÅ ÎÁ ÒÉÍÅÒÙ ÉÓÏÌØÚÏ×ÁÎÉÑ ÜÔÏÊ ÆÕÎË ÉÉ:
---> ase' ((>2), not) (Left 2.3) True ---> ase' ((>2), not) (Right True) False
I õÒÁÖÎÅÎÉÅ VII.3.5
H
÷ ÓËÒÉÔ Ó ÏÒÅÄÅÌÅÎÉÅÍ ÔÉÁ ÄÁÎÎÙÈ Either' ÄÏÂÁ×ØÔÅ ÆÕÎË ÉÀ
ase'. ÷ÙÏÌÎÉÔÅ ÒÉ×ÅÄÅÎÎÙÅ ×ÙÛÅ ÒÉÍÅÒÙ. ðÁÒÁÍÅÔÒÉÚÕÊÔÅ ÔÉ Either' ÔÁËÉÍÉ ÚÎÁÞÅÎÉÑÍÉ, ÞÔÏÂÙ ÒÅÚÕÌØÔÁÔÏÍ ×ÙÚÏ×Á ÆÕÎË ÉÉ ase' Ñ×ÌÑÌÏÓØ ÂÙ ÞÉÓÌÏ ÔÉÁ Float:
--> ase' ((/2) . fromInt , (*3)) (Left' 2) 1.0 --> ase' ((/2) . fromInt , (*3)) (Right' 1.5) 4.5
3. áÌÇÅÂÒÁÉÞÅÓËÉÅ ÔÉÙ ÄÁÎÎÙÈ
185
ó ÏÍÏÝØÀ ÆÕÎË ÉÉ ase', ÏÒÅÄÅÌÉÍ ÆÕÎË ÉÀ plus':
J
plus' :: (a -> b, -> d) -> Either a b -> Either d plus' (f, g) = ase' (Left.f, Right.g)
äÌÑ ÆÕÎË ÉÊ ase' É plus' ×ÅÒÎÙ ÓÌÅÄÕÀÝÉÅ ÓÏÏÔÎÏÛÅÎÉÑ:
ase' (f,
ase' (f, h . ase'
ase' (f,
g) . Left = f g) . Right = g (f, g) = ase' (h.f, h.g) g) . plus' (h, k) = ase' (f.h. g.k)
ðÒÅÄÏÌÏÖÉ×, ÞÔÏ ×ÅÌÉÞÉÎÙ ÔÉÏ× a É b ÍÏÇÕÔ ÂÙÔØ ÓÒÁ×ÎÉ×Á ÅÍÙ ÍÅÖÄÕ ÓÏÂÏÊ (Ô. Å. Ñ×ÌÑÀÔÓÑ ÜËÚÅÍÌÑÒÁÍÉ ËÌÁÓÓÏ× Eq É Ord), ÍÏÖÎÏ ÏÒÅÄÅÌÉÔØ ÏÅÒÁÔÏÒÙ ÓÒÁ×ÎÅÎÉÑ ÄÌÑ ×ÅÌÉÞÉÎ ÔÉÁ Either a b. óÉÎÔÁËÓÉÓ ÏÄÏÂÎÏÇÏ ÒÏÄÁ ÏÒÅÄÅÌÅÎÉÊ ÓÌÅÄÕÀÝÉÊ:
instan e Left Left Right Right instan e Left Left Right Right
(Eq a , Eq b) => Eq (Either a b) where x == Left y = (x == y) x == Right y = False x == Left y = False x == Right y = (x == y) (Ord a, Ord b) => Ord (Either a b) where x < Left y = (x < y) x < Right y = True x < Left y = False x < Right y = (x < y)
õËÁÚÁÎÎÙÅ ÏÒÅÄÅÌÅÎÉÑ ÏÚ×ÏÌÑÀÔ ÒÁÓÛÉÒÉÔØ ÏÂÌÁÓÔØ ÒÉÍÅÎÅ ÎÉÑ ÏÅÒÁÔÏÒÏ× == É < ÎÁ ×ÅÌÉÞÉÎÙ ÔÉÁ Either. üÔÏÇÏ ÖÅ ÜÆÆÅË ÔÁ ÍÏÖÎÏ ÄÏÂÉÔØÓÑ, ÕËÁÚÁ× Ó ÏÍÏÝØÀ ËÌÀÞÅ×ÏÇÏ ÓÌÏ×Á deriving, ÞÔÏ ÏÒÅÄÅÌÑÅÍÙÊ ÔÉ ÄÁÎÎÙÈ ÎÁÓÌÅÄÕÅÔ Ó×ÏÊÓÔ×Á ËÌÁÓÓÏ× Eq É Ord:
data Either a b = Left a | Right b deriving (Eq, Ord) 3.4. ïÂßÑ×ÌÅÎÉÅ ÒÅËÕÒÓÉ×ÎÙÈ ÔÉÏ× ÄÁÎÎÙÈ éÔÁË, ÍÙ ÎÁÕÞÉÌÉÓØ ÏÂßÑ×ÌÑÔØ ÎÏ×ÙÅ ÔÉÙ ÄÁÎÎÙÈ. ïÄÎÁËÏ ÏÄÏÂÎÙÍ ÏÂÒÁÚÏÍ ÍÏÖÎÏ ÏÂßÑ×ÌÑÔØ É ÔÉÙ ÄÁÎÎÙÈ. ìÀÂÏÊ ÔÉ ÄÁÎÎÙÈ ×ÓÅÇÄÁ ÚÁÄÁÅÔ ÓÏÓÏ ÓÏÚÄÁÎÉÑ (ËÏÎÓÔÒÕÉÒÏ ×ÁÎÉÑ) ×ÅÌÉÞÉÎ ÄÁÎÎÏÇÏ ÔÉÁ. îÁÒÉÍÅÒ, ÓÉÓÏË Ñ×ÌÑÅÔÓÑ ÔÉÏÍ ÄÁÎÎÙÈ É, ËÁË ÎÁÍ ÕÖÅ ÉÚ×ÅÓÔÎÏ, ×ÅÌÉÞÉÎÙ ÔÉÁ ÓÉÓÏË ÍÏÇÕÔ ÂÙÔØ ÏÓÔÒÏÅÎÙ Ä×ÕÍÑ ÓÏÓÏÂÁÍÉ:
ÒÅËÕÒÓÉ×ÎÙÅ
VII. Haskell ËÁË ÑÚÙË ïïð
186
ÌÉÂÏ ÓÏÚÄÁÅÔÓÑ ÕÓÔÏÊ ÓÉÓÏË; ÌÉÂÏ Ó ÏÍÏÝØÀ ÏÅÒÁÔÏÒÁ : ÎÏ×ÙÊ ÜÌÅÍÅÎÔ ÄÏÂÁ×ÌÑÅÔÓÑ Ë ÕÖÅ ÓÕÝÅÓÔ×ÕÀÝÅÍÕ ÂÏÌÅÅ ËÏÒÏÔËÏÍÕ ÓÉÓËÕ.
ÁËÉÍ ÏÂÒÁÚÏÍ, ÉÍÅÅÔÓÑ Ä×Á ËÏÎÓÔÒÕËÔÏÒÁ ÄÌÑ ÓÏÚÄÁÎÉÑ ÓÉÓËÁ. åÓÌÉ ÆÕÎË ÉÑ ÄÌÑ ÒÁÂÏÔÙ ÓÏ ÓÉÓËÁÍÉ ÏÒÅÄÅÌÑÅÔÓÑ Ó ÏÍÏÝØÀ ÛÁÂÌÏÎÏ× ÓÏÏÔ×ÅÔÓÔ×ÉÑ, ÔÏ ÎÕÖÎÏ ÚÁÄÁÔØ Ä×Á ÕÒÁ×ÎÅÎÉÑ: Ï ÏÄÎÏ ÍÕ ÎÁ ËÁÖÄÙÊ ÓÏÓÏ ÓÏÚÄÁÎÉÑ ÓÉÓËÁ, ÎÁÒÉÍÅÒ,
length [℄ = 0 length (x:xs) = 1 + length xs úÁÄÁ×ÁÑ ÆÕÎË ÉÀ ÒÉ ÏÍÏÝÉ ÒÁ×ÉÌ ÄÌÑ ÕÓÔÏÇÏ ÓÉÓËÁ É ÏÅ ÒÁÔÏÒÁ :, ÒÉÍÅÎÅÎÎÏÇÏ Ë ÜÌÅÍÅÎÔÕ É ÓÉÓËÕ, ÍÙ ÔÅÍ ÓÁÍÙÍ ÏÌ ÎÏÓÔØÀ ÏÒÅÄÅÌÑÅÍ ÅÅ. 1
4
:
Node
2
2
6
:
Node
Node
3
1
3
5
7
:
Node
Node
Node
Node
[] Список
Leaf
Leaf
Leaf
Leaf
Leaf
Leaf
Leaf
Leaf
Древоидная струка
óÉÓÏË Ñ×ÌÑÅÔÓÑ ÌÉÎÅÊÎÏÊ ÓÔÒÕËÔÕÒÏÊ: ÞÅÍ ÂÏÌØÛÅ ÜÌÅÍÅÎÔÏ× × ÎÅÇÏ ÄÏÂÁ×ÌÑÀÔ, ÔÅÍ ÄÌÉÎÎÅÅ ÏÎ ÓÔÁÎÏ×ÉÔÓÑ. ÷ ÎÅËÏÔÏÒÙÈ ÓÌÕÞÁ ÑÈ ÔÁËÏÇÏ ÒÏÄÁ ÌÉÎÅÊÎÁÑ ÓÔÒÕËÔÕÒÁ ÎÅÒÉÍÅÎÉÍÁ É ËÕÄÁ ÂÏÌØÛÅ ÏÄÈÏÄÉÔ . óÕÝÅÓÔ×ÕÀÔ ÒÁÚÌÉÞÎÙÅ ×ÉÄÙ ÄÒÅ×Ï×ÉÄÎÙÈ ÓÔÒÕËÔÕÒ. îÁ ÒÉÓÕÎËÅ ÓÉÓÏË ÓÒÁ×ÎÉ×ÁÅÔÓÑ Ó ÄÒÅ×Ï ×ÉÄÎÏÊ ÓÔÒÕËÔÕÒÏÊ, ÉÍÅÀÝÅÊ ÒÏ×ÎÏ Ï Ä×Å ×ÅÔ×É × ËÁÖÄÏÍ ×ÎÕ ÔÒÅÎÎÅÍ ÕÚÌÅ. ÷ ÍÁÌÅÎØËÉÈ Ë×ÁÄÒÁÔÁÈ ÏËÁÚÁÎÏ ÒÉ ÏÍÏÝÉ ËÁ ËÏÇÏ ËÏÎÓÔÒÕËÔÏÒÁ ÏÓÔÒÏÅÎÁ ÓÔÒÕËÔÕÒÁ. ÷ ÓÌÕÞÁÅ ÓÏ ÓÉÓËÏÍ ÍÙ
ÄÒÅ×Ï×ÉÄÎÁÑ ÓÔÒÕËÔÕÒÁ
3. áÌÇÅÂÒÁÉÞÅÓËÉÅ ÔÉÙ ÄÁÎÎÙÈ
187
ÉÓÏÌØÚÕÅÍ ÏÅÒÁÔÏÒ : Ó Ä×ÕÍÑ ÁÒÇÕÍÅÎÔÁÍÉ (ÕËÁÚÁÎÎÙÍÉ Ï ÏÂÅ ÓÔÏÒÏÎÙ ÏÅÒÁÔÏÒÁ) ÉÌÉ [ ℄ ÂÅÚ ÁÒÁÍÅÔÒÏ×. ÷ ËÁÞÅÓÔ×Å ÉÍÅÎ ÄÒÅ×Ï×ÉÄÎÙÈ ÔÉÏ× ÄÁÎÎÙÈ É ÉÈ ËÏÎÓÔÒÕËÔÏ ÒÏ× ÞÁÓÔÏ ÕÏÔÒÅÂÌÑÀÔ ÓÌÏ×Á: Tree ÄÅÒÅ×Ï, Node ÕÚÅÌ, Fork ÒÁÚ×ÉÌËÁ, Bran h ×ÅÔ×Ø, Leaf ÌÉÓÔ. ðÒÉ ËÏÎÓÔÒÕÉÒÏ×ÁÎÉÉ ÄÅÒÅ×Á, ÉÚÏÂÒÁÖÅÎÎÏÇÏ ÎÁ ÒÉÓÕÎËÅ, ÉÓÏÌØÚÏ×ÁÌÉÓØ ÆÕÎË ÉÉ (×ÍÅ ÓÔÏ ÏÅÒÁÔÏÒÏ×) Node (Ó ÔÒÅÍÑ ÁÒÁÍÅÔÒÁÍÉ) ÉÌÉ Leaf (ÂÅÚ ÁÒÇÕ ÍÅÎÔÏ×). æÕÎË ÉÉ, ÒÉÍÅÎÑÅÍÙÅ ÄÌÑ ÏÓÔÒÏÅÎÉÑ ÓÔÒÕËÔÕÒÙ ÄÁÎÎÙÈ, ÎÁ ÚÙ×ÁÀÔÓÑ ËÏÎÓÔÒÕËÔÏÒÁÍÉ. Node É Leaf Ñ×ÌÑÀÔÓÑ ËÏÎÓÔÒÕËÔÏÒÁÍÉ ÄÁÎÎÙÈ ÄÒÅ×Ï×ÉÄÎÏÊ ÓÔÒÕËÔÕÒÙ. ëÁË ÏÂÙÞÎÏ, ÉÍÅÎÁ ËÏÎÓÔÒÕËÔÏ ÒÏ× ÎÁÞÉÎÁÀÔÓÑ Ó ÚÁÇÌÁ×ÎÏÊ ÂÕË×Ù ÄÌÑ ÔÏÇÏ, ÞÔÏÂÙ ×ÙÄÅÌÉÔØ ÉÈ ÉÚ ÒÑÄÁ ÏÂÙÞÎÙÈ ÆÕÎË ÉÊ.
éÍÅÎÁ ÆÕÎË ÉÊ-ËÏÎÓÔÒÕËÔÏÒÏ×, ÒÅÁÌÉÚÏ×ÁÎÎÙÈ × ×ÉÄÅ ÏÅÒÁ ÔÏÒÏ×, ÄÏÌÖÎÙ ÎÁÞÉÎÁÔØÓÑ Ó Ä×ÏÅÔÏÞÉÑ. ëÏÎÓÔÒÕËÔÏÒ (:) Ñ×ÌÑ
ÅÔÓÑ ÒÉÍÅÒÏÍ ËÏÎÓÔÒÕÉÒÕÀÝÅÊ ÆÕÎË ÉÉ ÄÌÑ ÓÉÓËÁ; ÅÄÉÎÓÔ×ÅÎ ÎÙÍ ÉÓËÌÀÞÅÎÉÅÍ ÉÚ ÜÔÏÇÏ ÒÁ×ÉÌÁ Ñ×ÌÑÅÔÓÑ ËÏÎÓÔÒÕËÔÏÒ [ ℄. Ï, ËÁËÉÅ ËÏÎÓÔÒÕÉÒÕÀÝÉÅ ÆÕÎË ÉÉ ÍÏÖÎÏ ÉÓÏÌØÚÏ×ÁÔØ ÄÌÑ ÎÏ×ÏÇÏ ÔÉÁ, ÚÁÄÁÅÔÓÑ × ÏÒÅÄÅÌÅÎÉÉ ÔÉÁ ÄÁÎÎÙÈ. ÷ ÎÅÍ ÖÅ ÚÁÄÁÀÔÓÑ ÔÉÙ ÁÒÁÍÅÔÒÏ× ËÏÎÓÔÒÕËÔÏÒÏ× ÆÕÎË ÉÊ É ÏÌÉÍÏÒÆÉÞÎÏÓÔØ ÎÏ ×ÏÇÏ ÔÉÁ. ÁË, ÏÒÅÄÅÌÅÎÉÅ ÒÉ×ÅÄÅÎÎÏÊ ÎÁ ÒÉÓÕÎËÅ ÄÒÅ×Ï×ÉÄÎÏÊ ÓÔÒÕËÔÕÒÙ ÄÁÎÎÙÈ ÚÁÄÁÅÔÓÑ ÓÌÅÄÕÀÝÉÍ ÏÂßÑ×ÌÅÎÉÅÍ ÔÉÁ:
data Tree a = Node a (Tree a) (Tree a) | Leaf ÁËÏÅ ÏÒÅÄÅÌÅÎÉÅ ÞÉÔÁÅÔÓÑ ÓÌÅÄÕÀÝÉÍ ÏÂÒÁÚÏÍ: ¾äÒÅ×Ï×ÉÄÎÁÑ ÓÔÒÕËÔÕÒÁ Tree Ó ÜÌÅÍÅÎÔÁÍÉ ÔÉÁ a ÍÏÖÅÔ ÂÙÔØ ÏÓÔÒÏÅÎÁ Ä×ÕÍÑ ÕÔÑÍÉ:
(1) Ó ÏÍÏÝØÀ ÆÕÎË ÉÉ Node É ÔÒÅÈ ÅÅ ÁÒÁÍÅÔÒÏ× (ÏÄÉÎ ÔÉÁ a É Ä×Á ÔÉÁ Tree); (2) Ó ÏÍÏÝØÀ ËÏÎÓÔÁÎÔÙ Leaf¿. ðÒÉ ÚÁÄÁÎÉÉ ÔÁË ÏÒÅÄÅÌÅÎÎÏÇÏ ÄÒÅ×Ï×ÉÄÎÏÇÏ ÔÉÁ ÓÔÒÕËÔÕÒÙ ÉÓÏÌØÚÕÀÔÓÑ ËÏÎÓÔÒÕËÔÏÒÙ ÄÁÎÎÙÈ Node É Leaf. äÒÅ×Ï×ÉÄÎÁÑ ÓÔÒÕËÔÕÒÁ, ÉÚÏÂÒÁÖÅÎÎÁÑ ÎÁ ÒÉÓÕÎËÅ, ÏÉÓÙ×ÁÅÔÓÑ ÓÌÅÄÕÀÝÉÍ ×Ù ÒÁÖÅÎÉÅÍ:
Node 4 ( Node 2 ( Node 1 Leaf Leaf) ( Node 3 Leaf Leaf) ) ( Node 6 ( Node 5 Leaf Leaf) ( Node 7 Leaf Leaf) )
188
VII. Haskell ËÁË ÑÚÙË ïïð
íÏÖÎÏ ÎÅ ÒÁÚÎÏÓÉÔØ ×ÙÒÁÖÅÎÉÑ, ÏÒÅÄÅÌÑÀÝÉÅ ÄÅÒÅ×Ï, Ï ÓÔÒÏËÁÍ. ÁË, ÄÏÕÓÔÉÍÁ ÓÌÅÄÕÀÝÁÑ ÆÏÒÍÁ ÚÁÉÓÉ:
Node 4 ( Node 2 ( Node 1 Leaf Leaf) ( Node 3 Leaf Leaf)) ( Node 6 ( Node 5 Leaf Leaf) ( Node 7 Leaf Leaf)) ïÄÎÁËÏ ÅÒ×ÏÅ ÉÚ ÒÉ×ÅÄÅÎÎÙÈ ÏÒÅÄÅÌÅÎÉÊ ÒÅÄÓÔÁ×ÌÑÅÔÓÑ ÂÏ ÌÅÅ ¾ÒÏÚÒÁÞÎÙÍ¿. îÅ ÚÁÂÙ×ÁÊÔÅ Ï Ä×ÕÍÅÒÎÏÍ ÓÉÎÔÁËÓÉÓÅ ÑÚÙËÁ Haskell: ÄÏÂÁ×ÌÑÊÔÅ ÏÔÓÔÕÙ × ÔÅÈ ÓÔÒÏËÁÈ, ËÏÔÏÒÙÅ Ñ×ÌÑÀÔÓÑ ÒÏ ÄÏÌÖÅÎÉÅÍ ÏÒÅÄÅÌÅÎÉÑ, ÎÁÞÁÔÏÇÏ ÒÁÎÅÅ. æÕÎË ÉÉ Ó ÁÒÇÕÍÅÎÔÁÍÉ, Ñ×ÌÑÀÝÉÍÉÓÑ ÄÒÅ×Ï×ÉÄÎÏÊ ÓÔÒÕËÔÕ ÒÏÊ, ÏÒÅÄÅÌÑÀÔÓÑ ÕÔÅÍ ÕËÁÚÁÎÉÑ ÛÁÂÌÏÎÏ× ÄÌÑ ËÁÖÄÏÇÏ ËÏÎ ÓÔÒÕËÔÏÒÁ ÜÔÏÇÏ ÔÉÁ ÄÁÎÎÙÈ. óÌÅÄÕÀÝÁÑ ÆÕÎË ÉÑ, ÎÁÒÉÍÅÒ, ÏÄÓÞÉÔÙ×ÁÅÔ ÞÉÓÌÏ ÜÌÅÍÅÎÔÏ× Node × ÄÒÅ×Ï×ÉÄÎÏÊ ÓÔÒÕËÔÕÒÅ:
size :: Tree a -> Int size Leaf = 0 size (Node x p q) = 1 + size p + size q óÒÁ×ÎÉÔÅ ÜÔÕ ÆÕÎË ÉÀ Ó length, ×ÙÞÉÓÌÑÀÝÅÊ ÄÌÉÎÕ ÓÉÓËÁ. íÏÖÎÏ ÏÒÅÄÅÌÉÔØ ÏÇÒÏÍÎÏÅ ËÏÌÉÞÅÓÔ×Ï ÒÁÚÌÉÞÎÙÈ ÔÉÏ× ÄÒÅ ×Ï×ÉÄÎÙÈ ÓÔÒÕËÔÕÒ. òÁÓÓÍÏÔÒÉÍ ÌÉÛØ ÎÅÓËÏÌØËÏ ÒÉÍÅÒÏ×: äÅÒÅ×ØÑ, ÓÏÄÅÒÖÁÝÉÅ ÉÎÆÏÒÍÁ ÉÀ × ÌÉÓÔØÑÈ, Á ÎÅ × ÕÚÌÁÈ:
data Tree2 a = Node 2 (Tree2 a) (Tree2 a) | Leaf2 Á
äÅÒÅ×ØÑ, × ËÏÔÏÒÙÈ ÉÎÆÏÒÍÁ ÉÑ ÔÉÁ a ÒÁÚÍÅÝÅÎÁ × ÕÚÌÁÈ, Á ÉÎÆÏÒÍÁ ÉÑ ÔÉÁ b ÌÉÓÔØÑÈ:
data Tree3 a b = Node3 (Tree3 a b) (Tree3 a b) | Leaf3 b
äÅÒÅ×ØÑ, × ËÏÔÏÒÙÈ ÉÚ ËÁÖÄÏÇÏ ÕÚÌÁ ×ÙÈÏÄÉÔ ÔÒÉ ×ÅÔ×É:
data Tree4 a = Node4 (Tree4 a) (Tree4 a) (Tree4 a) | Leaf4
äÅÒÅ×ØÑ, × ËÏÔÏÒÙÈ ÞÉÓÌÏ ×ÅÔ×ÅÊ, ÉÓÈÏÄÑÝÉÈ ÉÚ ÕÚÌÁ Ñ×ÌÑÅÔÓÑ ÅÒÅÍÅÎÎÏÊ ×ÅÌÉÞÉÎÏÊ:
data Tree5 a = Node5 a [Tree5 a℄ ÷ ÄÁÎÎÏÍ ÒÉÍÅÒÅ ÄÅÒÅ×Á ÎÅÔ ÎÅÏÂÈÏÄÉÍÏÓÔÉ ÏÔÄÅÌØÎÏ ÏÒÅÄÅÌÑÔØ ÌÉÓÔØÑ, ÏÓËÏÌØËÕ × ËÁÞÅÓÔ×Å ÔÁËÏ×ÙÈ ÍÏÇÕÔ ÂÙÔØ ÉÓÏÌØÚÏ×ÁÎÙ ÕÚÌÙ, ÎÅ ÓÏÄÅÒÖÁÝÉÅ ÉÓÈÏÄÑÝÉÈ ×ÅÔ×ÅÊ. äÅÒÅ×ØÑ, × ËÏÔÏÒÙÈ ËÁÖÄÙÊ ÕÚÅÌ ÉÍÅÅÔ ÔÏÌØËÏ ÏÄÎÕ ×ÅÔ×Ø:
data Tree6 a = Node6 a (Tree6 a) | Leaf6
3. áÌÇÅÂÒÁÉÞÅÓËÉÅ ÔÉÙ ÄÁÎÎÙÈ
189
ÁËÏÊ ÒÉÍÅÒ ÄÅÒÅ×Á Ï ÓÕÔÉ Ñ×ÌÑÅÔÓÑ ÓÉÓËÏÍ, ÏÓËÏÌØËÕ ÉÍÅÅÔ ÌÉÎÅÊÎÕÀ ÓÔÒÕËÔÕÒÕ.
äÅÒÅ×ØÑ, Ó ÒÁÚÌÉÞÎÙÍÉ ×ÉÄÁÍÉ ÕÚÌÏ×: data Tree7 a b = | | |
Node7a Node7b Leaf7a Leaf7b
Int a (Tree7 a b) (Tree7 a b) Char (Tree7 a b) b Int
äÅÒÅ×ØÑ ÏÉÓËÁ
èÏÒÏÛÉÍ ÒÉÍÅÒÏÍ ÓÉÔÕÁ ÉÉ, × ËÏÔÏÒÏÊ ÄÅÒÅ×ØÑ ÒÅÄÏÞÔÉ ÔÅÌØÎÅÅ, ÞÅÍ ÓÉÓËÉ, ÅÓÔØ ÏÉÓË (ÒÉÓÕÔÓÔ×ÕÀÝÉÈ) ÜÌÅÍÅÎÔÏ× × ÂÏÌØÛÏÊ ËÏÌÌÅË ÉÉ. ó ÜÔÏÊ ÅÌØÀ ÉÓÏÌØÚÕÀÔÓÑ .
ÄÅÒÅ×ØÑ ÏÉÓËÁ
îÁ ÓÔÒÁÎÉ Å 117 ÂÙÌÁ ÒÁÓÓÍÏÔÒÅÎÁ ÆÕÎË ÉÑ elem, ËÏÔÏÒÁÑ ×ÏÚ ×ÒÁÝÁÌÁ True, ÅÓÌÉ ÜÌÅÍÅÎÔ ×ÓÔÒÅÞÁÌÓÑ × ÓÉÓËÅ. üÔÁ ÆÕÎË ÉÑ ÏÒÅÄÅÌÑÌÁÓØ Ó ÏÍÏÝØÀ ÆÕÎË ÉÊ map É or:
elem :: Eq a => a -> [a℄ -> Bool elem e xs = or (map (== e) xs) äÒÕÇÏÅ ÅÅ ÏÒÅÄÅÌÅÎÉÅ ÉÓÏÌØÚÕÅÔ ÒÅËÕÒÓÉÀ:
elem e [℄ = False elem e (x:xs) = x == e || elem e xs
÷ ÏÂÏÉÈ ÓÌÕÞÁÑÈ ×ÓÅ ÜÌÅÍÅÎÔÙ ÓÉÓËÁ ÒÏÓÍÁÔÒÉ×ÁÀÔÓÑ ÏÄÉÎ ÚÁ ÏÄÎÉÍ. ëÁË ÔÏÌØËÏ ÜÌÅÍÅÎÔ ÂÕÄÅÔ ÎÁÊÄÅÎ, ÆÕÎË ÉÑ ÎÅÍÅÄÌÅÎÎÏ ×ÏÚ×ÒÁÔÉÔ True (ÂÌÁÇÏÄÁÒÑ ÌÅÎÉ×ÏÓÔÉ ×ÙÞÉÓÌÅÎÉÊ), ÎÏ ÅÓÌÉ ÜÌÅ ÍÅÎÔ ÎÅ ÓÏÄÅÒÖÉÔÓÑ × ÓÉÓËÅ, ÔÏ ÆÕÎË ÉÑ ×ÓÅ ÒÁ×ÎÏ ÒÏ×ÅÒÉÔ ÉÈ ×ÓÅ ÏÄÉÎ ÚÁ ÄÒÕÇÉÍ. õÄÏÂÎÅÅ ÂÙÌÏ ÂÙ ÒÁÂÏÔÁÔØ Ó ÏÔÓÏÒÔÉÒÏ×ÁÎÎÙÍ ÓÉÓËÏÍ, Ô. Å. ÔÁËÉÍ, ×ÓÅ ÅÇÏ ÜÌÅÍÅÎÔÙ ËÏÔÏÒÏÇÏ ÒÁÓÏÌÁÇÁÀÔÓÑ × ÎÅÕÂÙ×ÁÀÝÅÍ ÏÒÑÄËÅ. ðÏÉÓË ÍÏÖÎÏ ÒÅËÒÁÝÁÔØ, ÅÓÌÉ ÏÖÉÄÁÅÍÙÊ ÜÌÅÍÅÎÔ ÕÖÅ ÒÏÊÄÅÎ. äÌÑ ÒÅÁÌÉÚÁ ÉÉ ÔÁËÏÇÏ ÁÌÇÏÒÉÔÍÁ ÔÒÅÂÕÅÔÓÑ, ÞÔÏÂÙ ÜÌÅ ÍÅÎÔÙ ÓÉÓËÁ ÄÏÕÓËÁÌÉ ÎÅ ÔÏÌØËÏ ÒÏ×ÅÒËÕ ÎÁ ÒÁ×ÅÎÓÔ×Ï, ÎÏ É ÓÒÁ×ÎÅÎÉÅ (Ô. Å. Ñ×ÌÑÌÉÓØ ÂÙ ×ÅÌÉÞÉÎÁÍÉ ËÌÁÓÓÁ Ord):
elem' :: Ord a => a -> [a℄ -> Bool elem' e [℄ = False elem' e (x:xs) | e < x = False | e == x = True | e > x = elem' e xs
VII. Haskell ËÁË ÑÚÙË ïïð
190
úÎÁÞÉÔÅÌØÎÙÍ ÕÌÕÞÛÅÎÉÅÍ ÒÏÇÒÁÍÍÙ Ñ×ÌÑÅÔÓÑ ÉÓÏÌØÚÏ×Á ÎÉÅ ÎÅ ÓÉÓËÁ, Á . äÅÒÅ×Ï ÏÉÓËÁ ÅÓÔØ ÒÏÄ ÏÔÓÏÒÔÉ ÒÏ×ÁÎÎÏÇÏ ÄÅÒÅ×Á. üÔÏ ÄÅÒÅ×Ï ÍÏÖÅÔ ÂÙÔØ ÏÒÅÄÅÌÅÎÏ Ó ÏÍÏÝØÀ ÏÂßÑ×ÌÅÎÉÑ, ÒÁÓÓÍÏÔÒÅÎÎÏÇÏ ÎÁÍÉ ÒÁÎÅÅ:
ÄÅÒÅ×Á ÏÉÓËÁ
data Tree a = Node a (Tree a) (Tree a) | Leaf ÷ ÔÁËÏÍ ÄÅÒÅ×Å × ËÁÖÄÏÍ ÕÚÌÅ ÓÏÄÅÒÖÉÔÓÑ ÜÌÅÍÅÎÔ É Ä×Á (ÍÅÎØ ÛÉÈ) ÏÄÄÅÒÅ×Á: ÌÅ×ÏÅ É ÒÁ×ÏÅ (ÓÍ. ÒÉÓÕÎÏË ÎÁ ÓÔÒ. 186). ïÓÎÏ× ÎÙÍ ÔÒÅÂÏ×ÁÎÉÅÍ, ÒÅÄßÑ×ÌÑÅÍÙÍ Ë ÄÅÒÅ×Õ ÏÉÓËÁ, Ñ×ÌÑÅÔÓÑ ÒÁÓ ÏÌÏÖÅÎÉÅ × ÌÅ×ÏÍ ÏÄÄÅÒÅ×Å ×ÅÌÉÞÉÎ ÍÅÎØÛÉÈ, ÞÅÍ × ÕÚÌÅ, Á × ÒÁ×ÏÍ ÂÏÌØÛÉÈ. úÎÁÞÅÎÉÑ × ÕÚÌÁÈ ÄÅÒÅ×Á, ÒÉ×ÅÄÅÎÎÏÇÏ ÎÁ ÒÉ ÓÕÎËÅ, ×ÙÂÒÁÎÙ ÔÁËÉÍ ÏÂÒÁÚÏÍ, ÞÔÏ ÏÎÏ Ñ×ÌÑÅÔÓÑ ÄÅÒÅ×ÏÍ ÏÉÓËÁ.
ðÏÉÓË ÜÌÅÍÅÎÔÏ× × ÄÅÒÅ×Å ÏÉÓËÁ ÏÞÅÎØ ÒÏÓÔ. åÓÌÉ ×ÅÌÉÞÉÎÁ ÒÁ×ÎÁ ÚÎÁÞÅÎÉÀ, ÈÒÁÎÑÝÅÍÕÓÑ × ÕÚÌÅ, ÔÏ ÜÌÅÍÅÎÔ ÏÂÎÁÒÕÖÅÎ. åÓ ÌÉ ÏÎ ÍÅÎØÛÅ, ÔÏ ÏÉÓË ÒÏÄÏÌÖÁÅÔÓÑ × ÌÅ×ÏÍ ÏÄÄÅÒÅ×Å (ÒÁ×ÏÅ ÏÄÄÅÒÅ×Ï ÓÏÄÅÒÖÉÔ ÜÌÅÍÅÎÔÙ Ó ÂÏÌØÛÉÍ ÚÎÁÞÅÎÉÅÍ). ó ÄÒÕÇÏÊ ÓÔÏÒÏÎÙ, ÅÓÌÉ ×ÅÌÉÞÉÎÁ ÂÏÌØÛÅ, ÞÅÍ ÈÒÁÎÑÝÁÑÓÑ × ÕÚÌÅ, ÔÏ ÏÉÓË ÒÏÄÏÌÖÁÅÔÓÑ × ÒÁ×ÏÍ ÏÄÄÅÒÅ×Å. ðÏÜÔÏÍÕ ÆÕÎË ÉÑ elemTree ×Ù ÇÌÑÄÉÔ ÔÁË:
elemTreÅ :: Ord a => a -> elemTreÅ e Leaf elemTreÅ e (Node x l r) | e | e | e
Tree a = == x = < x = > x =
-> Bool False True elemTree e l elemTree e r
åÓÌÉ ÄÅÒÅ×Ï ÈÏÒÏÛÏ ÓÂÁÌÁÎÓÉÒÏ×ÁÎÏ, Ô. Å. ÎÅ ÓÏÄÅÒÖÉÔ ÂÏÌØÛÉÈ ¾ÄÙÒ¿, ÔÏ ÞÉÓÌÏ ÜÌÅÍÅÎÔÏ×, ÒÅÄÎÁÚÎÁÞÅÎÎÙÈ ÄÌÑ ÏÉÓËÁ, ÕÍÅÎØ ÛÁÅÔÓÑ ÒÉÂÌÉÚÉÔÅÌØÎÏ × Ä×Á ÒÁÚÁ ÎÁ ËÁÖÄÏÍ ÛÁÇÅ. ðÏÜÔÏÍÕ ÔÒÅ ÂÕÅÍÙÊ ÜÌÅÍÅÎÔ ÂÕÄÅÔ ÎÁÊÄÅÎ ÄÏÓÔÁÔÏÞÎÏ ÂÙÓÔÒÏ: ÔÁË × ËÏÌÌÅË ÉÉ ÉÚ 1000 ÜÌÅÍÅÎÔÏ× ÏÔÒÅÂÕÅÔÓÑ ÓÄÅÌÁÔØ ÏËÏÌÏ ÄÅÓÑÔÉ ÛÁÇÏ×, Á × ËÏÌÌÅË ÉÉ ÉÚ ÍÉÌÌÉÏÎÁ ÜÌÅÍÅÎÔÏ× ÏËÏÌÏ Ä×ÁÄ ÁÔÉ. ÷ ÏÂÝÅÍ, ÍÏÖ ÎÏ ÓËÁÚÁÔØ, ÞÔÏ ÏÉÓË × ËÏÌÌÅË ÉÉ ÉÚ n ÜÌÅÍÅÎÔÏ× ÒÉ ÏÍÏÝÉ ÆÕÎË ÉÉ elem ÏÔÒÅÂÕÅÔ ÏËÏÌÏ n ÛÁÇÏ×, Á ÒÉ ÏÍÏÝÉ ÆÕÎË ÉÉ elemTree ÔÏÌØËÏ log2 n ÛÁÇÏ×. óÔÒÕËÔÕÒÁ ÄÅÒÅ×Á ÏÉÓËÁ
æÏÒÍÁ ÄÅÒÅ×Á ÏÉÓËÁ ÄÌÑ ÎÅËÏÔÏÒÏÊ ËÏÌÌÅË ÉÉ ÜÌÅÍÅÎÔÏ× ÍÏ ÖÅÔ ÂÙÔØ ÏÒÅÄÅÌÅÎÁ ¾×ÒÕÞÎÕÀ¿. úÁÔÅÍ ÄÅÒÅ×Ï ÏÉÓËÁ ÍÏÖÎÏ Ó ÏÍÏÝØÀ ËÌÁ×ÉÁÔÕÒÙ ××ÅÓÔÉ ËÁË ÏÄÎÏ ÂÏÌØÛÏÅ ×ÙÒÁÖÅÎÉÅ Ó ÍÎÏ ÖÅÓÔ×ÏÍ ËÏÎÓÔÒÕÉÒÕÀÝÉÈ ÆÕÎË ÉÊ. ÅÍ ÎÅ ÍÅÎÅÅ ÍÏÖÅÔ ×ÏÚÎÉË ÎÕÔØ ÏÔÒÅÂÎÏÓÔØ × Á×ÔÏÍÁÔÉÚÁ ÉÉ ÜÔÏÇÏ ÒÏ ÅÓÓÁ.
3. áÌÇÅÂÒÁÉÞÅÓËÉÅ ÔÉÙ ÄÁÎÎÙÈ
191
áÎÁÌÏÇÉÞÎÏ ÆÕÎË ÉÉ insert, ÄÏÂÁ×ÌÑÀÝÅÊ ÜÌÅÍÅÎÔÙ × ÏÔÓÏÒ ÔÉÒÏ×ÁÎÎÙÊ ÓÉÓÏË (ÓÔÒ. 118), ÆÕÎË ÉÑ insertTree ÄÏÂÁ×ÌÑÅÔ ÜÌÅ ÍÅÎÔ Ë ÄÅÒÅ×Õ ÏÉÓËÁ ÔÁËÉÍ ÏÂÒÁÚÏÍ, ÞÔÏ ÒÅÚÕÌØÔÁÔ ÄÏÂÁ×ÌÅÎÉÑ ÏÓÔÁÅÔÓÑ ÄÅÒÅ×ÏÍ ÏÉÓËÁ, Ô. Å. ×ÓÔÁ×ËÁ ÜÌÅÍÅÎÔÁ ÒÏÉÚ×ÏÄÉÔÓÑ × ÎÕÖÎÏÅ ÍÅÓÔÏ:
insertTreÅ :: Ord insertTreÅ e Leaf insertTreÅ e (Node | e | e
a => a -> Tree = Node e x l r) <= x = Node x > x = Node x
a -> Tree a Leaf Leaf (insertTree e l) r l (insertTree e r)
åÓÌÉ ÜÌÅÍÅÎÔ ÄÏÂÁ×ÌÑÅÔÓÑ Ë ÌÉÓÔÕ (Ô. Å. Ë ÕÓÔÏÍÕ ÄÅÒÅ×Õ), ÔÏ ÓÔÒÏÉÔÓÑ ÎÅÂÏÌØÛÏÅ ÄÅÒÅ×Ï, ÓÏÓÔÏÑÝÅÅ ÉÚ ÏÄÎÏÇÏ ÕÚÌÁ, × ËÏÔÏÒÏÍ ÈÒÁÎÉÔÓÑ ÜÌÅÍÅÎÔ e, É Ä×ÕÈ ÕÓÔÙÈ ÄÅÒÅ×ØÅ×. ÷ ÒÏÔÉ×ÎÏÍ ÓÌÕÞÁÅ ÄÅÒÅ×Ï ÎÅ ÕÓÔÏ É ÏÎÏ ÓÏÄÅÒÖÉÔ × ËÏÒÎÅ×ÏÍ ÕÚÌÅ ÜÌÅÍÅÎÔ x. üÔÏ ÚÎÁÞÅÎÉÅ É ÉÓÏÌØÚÕÅÔÓÑ ÄÌÑ ÏÒÅÄÅÌÅÎÉÑ, × ËÁËÏÅ ÏÄÄÅÒÅ×Ï ÏÍÅ ÝÁÔØ ÎÏ×ÙÊ ÜÌÅÍÅÎÔ. ó ÏÍÏÝØÀ ÆÕÎË ÉÉ insertTreÅ ×ÓÅ ÜÌÅÍÅÎÔÙ ÓÉÓËÁ ÍÏÖÎÏ ÏÍÅÓÔÉÔØ × ÄÅÒÅ×Ï ÏÉÓËÁ:
listToTree :: Ord a => [a℄ -> Tree a listToTree = foldr insertTree Leaf óÒÁ×ÎÉÔÅ ÏÌÕÞÅÎÎÕÀ ÆÕÎË ÉÀ Ó ÆÕÎË ÉÅÊ isort (ÓÔÒ. 119). îÅÄÏÓÔÁÔËÏÍ ÉÓÏÌØÚÏ×ÁÎÉÑ ÆÕÎË ÉÉ listToTree Ñ×ÌÑÅÔÓÑ ÔÏ, ÞÔÏ × ÒÅÚÕÌØÔÁÔÅ ÅÅ ÒÉÍÅÎÅÎÉÑ ÎÅ ×ÓÅÇÄÁ ÏÌÕÞÁÅÔÓÑ ÈÏÒÏÛÏ ÓÂÁ ÌÁÎÓÉÒÏ×ÁÎÎÏÅ ÄÅÒÅ×Ï. üÔÁ ÒÏÂÌÅÍÁ ÎÅ ÓÔÏÉÔ ÔÁË ÏÓÔÒÏ, ËÏÇÄÁ ÉÎÆÏÒÍÁ ÉÑ ÄÏÂÁ×ÌÑÅÔÓÑ × ÓÌÕÞÁÊÎÏÍ ÏÒÑÄËÅ. åÓÌÉ ÖÅ ÓÉÓÏË, ËÏÔÏÒÙÊ ÒÅÏÂÒÁÚÕÀÔ × ÄÅÒÅ×Ï ÕÖÅ ÏÔÓÏÒÔÉÒÏ×ÁÎ, ÔÏ ÏÌÕÞÅÎÎÏÅ ÄÅÒÅ×Ï ÏÉÓËÁ ÂÕÄÅÔ ¾ÅÒÅËÏÛÅÎÎÙÍ¿.
---> listToTree [1 ..7℄ Node 7 (Node 6 (Node 5 (Node 4 (Node 3 (Node 2 (Node 1 Leaf Leaf) Leaf) Leaf) Leaf) Leaf) Leaf) Leaf èÏÔÑ ÄÁÎÎÁÑ ÓÔÒÕËÔÕÒÁ É Ñ×ÌÑÅÔÓÑ ÄÅÒÅ×ÏÍ ÏÉÓËÁ (×ÅÌÉÞÉÎÁ ËÁ ÖÄÏÇÏ ÜÌÅÍÅÎÔÁ ÚÁËÌÀÞÅÎÁ ÍÅÖÄÕ ÚÎÁÞÅÎÉÑÍÉ ÌÅ×ÏÇÏ É ÒÁ×ÏÇÏ ÏÄÄÅÒÅ×Á) ÓÔÒÕËÔÕÒÁ ÅÇÏ Ï ÓÕÔÉ ÌÉÎÅÊÎÁ. ÷ ÔÁËÏÍ ÄÅÒÅ×Å ÎÅÄÏ ÓÔÉÖÉÍÏ ÌÏÇÁÒÉÆÍÉÞÅÓËÏÅ ×ÒÅÍÑ ÏÉÓËÁ. úÎÁÞÉÔÅÌØÎÏ ÌÕÞÛÉÍ (ÎÅ ¾ÌÉÎÅÊÎÙÍ¿) ÄÅÒÅ×ÏÍ ÏÉÓËÁ Ó ÔÅÍÉ ÖÅ ÚÎÁÞÅÎÉÑÍÉ ÂÕÄÅÔ ÄÅÒÅ×Ï
Node 4 (Node 2 (Node (Node (Node 6 (Node (Node
1 3 5 7
Leaf Leaf Leaf Leaf
Leaf) Leaf)) Leaf) Leaf))
H
VII. Haskell ËÁË ÑÚÙË ïïð
192
óÏÒÔÉÒÏ×ËÁ Ó ÏÍÏÝØÀ ÄÅÒÅ×Á ÏÉÓËÁ
æÕÎË ÉÉ, ÒÁÓÓÍÏÔÒÅÎÎÙÅ ×ÙÛÅ, ÍÏÇÕÔ ÓÌÕÖÉÔØ ÏÓÎÏ×ÏÊ ÄÌÑ ÏÓÔÒÏÅÎÉÑ ÎÏ×ÏÇÏ ÁÌÇÏÒÉÔÍÁ ÓÏÒÔÉÒÏ×ËÉ. îÁÍ ÏÔÒÅÂÕÅÔÓÑ ÌÉÛØ ÅÝÅ ÏÄÎÁ ÆÕÎË ÉÑ, ËÏÔÏÒÁÑ ÏÍÅÝÁÅÔ ÜÌÅÍÅÎÔÙ ÄÅÒÅ×Á ÏÉÓËÁ × ÓÉÓÏË × ÎÕÖÎÏÍ ÏÒÑÄËÅ. ïÒÅÄÅÌÅÎÉÅ ÅÅ ÔÁËÏ×Ï:
labels :: tree a -> [a℄ labels leaf = [℄ labels (Node x l r) = labels l ++ [x℄ ++ labels r ÷ ÏÔÌÉÞÉÉ ÏÔ ÆÕÎË ÉÉ insertTree, ÜÔÁ ÆÕÎË ÉÑ ÒÏÉÚ×ÏÄÉÔ ÒÅ ËÕÒÓÉ×ÎÕÀ ÏÂÒÁÂÏÔËÕ ÏÄÄÅÒÅ×Á. üÔÏ ÚÎÁÞÉÔ, ÞÔÏ ËÁÖÄÙÊ ÜÌÅÍÅÎÔ ÄÅÒÅ×Á ÂÕÄÅÔ ÏÂÒÁÂÏÔÁÎ. ðÒÏÉÚ×ÏÌØÎÙÊ ÓÉÓÏË ÓÌÅÄÕÅÔ ÓÎÁÞÁÌÁ ÒÅ×ÒÁÔÉÔØ × ÄÅÒÅ×Ï Ï ÉÓËÁ Ó ÏÍÏÝØÀ ÆÕÎË ÉÉ insertTree, Á ÚÁÔÅÍ ÓÏÂÒÁÔØ ÉÈ × ÓÉÓÏË × ÒÁ×ÉÌØÎÏÍ ÏÒÑÄËÅ Ó ÏÍÏÝØÀ labels:
ËÁË ÌÅ×ÏÇÏ, ÔÁË É ÒÁ×ÏÇÏ
sort :: Ord a => [a℄ -> [a℄ sort = labels . listToTree õÄÁÌÅÎÉÅ ÉÚ ÄÅÒÅ×Á ÏÉÓËÁ
äÅÒÅ×ØÑ ÏÉÓËÁ ÍÏÖÎÏ ÉÓÏÌØÚÏ×ÁÔØ × ÒÏÌÉ ÂÁÚÙ ÄÁÎÎÙÈ. ëÒÏ ÍÅ ÏÅÒÁ ÉÊ ÅÒÅÎÕÍÅÒÏ×ËÉ, ×ÓÔÁ×ËÉ É ÏÓÔÒÏÅÎÉÑ, ËÏÔÏÒÙÅ ÕÖÅ ÏÉÓÁÎÙ, ÎÁÍ ÏÔÒÅÂÕÅÔÓÑ ÅÝÅ ÆÕÎË ÉÑ, ÕÄÁÌÑÀÝÁÑ ÜÌÅÍÅÎÔÙ ÉÚ ÂÁÚÙ ÄÁÎÎÙÈ. ïÎÁ ÏÈÏÖÁ ÎÁ ÆÕÎË ÉÀ insertTree: × ÚÁ×ÉÓÉÍÏÓÔÉ ÏÔ Ó×ÏÅÇÏ ÁÒÇÕÍÅÎÔÁ ÏÎÁ ×ÙÚÙ×ÁÅÔÓÑ ÒÅËÕÒÓÉ×ÎÏ ÌÉÂÏ ÄÌÑ ÌÅ×ÏÇÏ, ÌÉÂÏ ÄÌÑ ÒÁ×ÏÇÏ ÏÄÄÅÒÅ×Á.
deleteTree deleteTree e Leaf deleteTree e (Node | e | e | e
:: = x l r) < x = == x = > x =
Ord a => a -> Tree a -> Tree a Leaf Node x (deleteTree e l) r join l r Node x l (deleteTree e r)
åÓÌÉ ×ÅÌÉÞÉÎÁ ÂÕÄÅÔ ÎÁÊÄÅÎÁ × ÄÅÒÅ×Å (ÓÌÕÞÁÊ x == e), ÔÏ ÏÎÁ ÎÅ ÍÏÖÅÔ ÂÙÔØ ÒÏÓÔÏ ÏÕÝÅÎÁ, ÔÁË ËÁË × ÜÔÏÍ ÍÅÓÔÅ ÏÓÔÁÌÁÓØ ÂÙ ¾ÄÙÒÁ¿. ðÏÜÔÏÍÕ ÎÅÏÂÈÏÄÉÍÁ ÆÕÎË ÉÑ join, ÓÏÅÄÉÎÑÀÝÁÑ Ä×Á ÏÄÄÅÒÅ×Á × ÏÄÎÏ. üÔÁ ÆÕÎË ÉÑ ÂÅÒÅÔ ÎÁÉÂÏÌØÛÉÊ ÜÌÅÍÅÎÔ ÌÅ×ÏÇÏ ÏÄÄÅÒÅ×Á × ËÁÞÅÓÔ×Å ÎÏ×ÏÇÏ ÕÚÌÁ. åÓÌÉ ÌÅ×ÏÅ ÏÄÄÅÒÅ×Ï ÕÓÔÏ, ÔÏ × ÓÌÉÑÎÉÉ ÏÄÄÅÒÅ×ØÅ× ÕÖÅ ÎÅÔ ÒÏÂÌÅÍÙ.
join
:: tree a -> Tree a -> Tree a
3. áÌÇÅÂÒÁÉÞÅÓËÉÅ ÔÉÙ ÄÁÎÎÙÈ
193
join Leaf b2 = b2 join b1 b2 = Node x b1' b2 where (x, b1') = largest b1 æÕÎË ÉÑ largest ËÒÏÍÅ ÎÁÉÂÏÌØÛÅÇÏ ÜÌÅÍÅÎÔÁ ÏÄÄÅÒÅ×Á ÔÁËÖÅ ×ÏÚ×ÒÁÝÁÅÔ ÄÅÒÅ×Ï, ÏÓÔÁÀÝÅÅÓÑ ÏÓÌÅ ÉÚßÑÔÉÑ ÎÁÉÂÏÌØÛÅÇÏ ÜÌÅ ÍÅÎÔÁ. ïÂÁ ÒÅÚÕÌØÔÁÔÁ ÓÏÅÄÉÎÑÀÔÓÑ × ÁÒÕ. îÁÉÂÏÌØÛÉÊ ÜÌÅÍÅÎÔ ÎÁÈÏÄÉÔÓÑ ÒÉ ÒÅËÕÒÓÉ×ÎÏÍ ÒÏÓÍÏÔÒÅ ÒÁ×ÙÈ ÏÄÄÅÒÅ×ØÅ×:
largest :: Tree a -> (a, Tree a) largest (Node x b1 Leaf) = (x, b1) largest (Node x b1 b2) = (y, Node x b1 b2') where (y, b2') = largest b2 ðÒÏÉÌÌÀÓÔÒÉÒÕÅÍ ÒÁÂÏÔÕ ÆÕÎË ÉÉ deleteTree ÓÌÅÄÕÀÝÉÍ ÒÉÍÅÒÏÍ.
deleteTree 6
6 2
8
1
4 3
7
10
5
9
üÔÏÔ ×ÙÚÏ× ÒÉ×ÅÄÅÔ Ë ÒÉÍÅÎÅÎÉÀ ÆÕÎË ÉÉ join Ó ÌÅ×ÏÍÕ É ÒÁ ×ÏÍÕ ÏÄÄÅÒÅ×ØÑÍ × ËÁÞÅÓÔ×Å ÁÒÁÍÅÔÒÏ×:
join
b1
b2
2
8
1
7
4 3
5
10 9
æÕÎË ÉÑ largest ÂÕÄÅÔ ×ÙÚ×ÁÎÁ ÆÕÎË ÉÅÊ join × ÏÄÄÅÒÅ×ÏÍ b1 × ËÁÞÅÓÔ×Å ÁÒÁÍÅÔÒÁ. ÷ ÒÅÚÕÌØÔÁÔÅ ÂÕÄÅÔ ÏÌÕÞÅÎÁ ÁÒÁ (x, b1'):
VII. Haskell ËÁË ÑÚÙË ïïð
194
(
5,
)
2 1
4 3
äÅÒÅ×ØÑ b1' É b2 ×ÙÓÔÕÑÔ × ËÁÞÅÓÔ×Å ÏÄÄÅÒÅ×ØÅ× ÄÌÑ ÎÏ×ÏÇÏ ÄÅÒÅ×Á ÏÉÓËÁ:
5 2
8
1
4 3
7
10 9
æÕÎË ÉÑ largest ×ÙÚÙ×ÁÅÔÓÑ ÆÕÎË ÉÅÊ join ÔÏÌØËÏ × ÔÏÍ ÓÌÕÞÁÅ, ÅÓÌÉ ÏÌÕÞÅÎÎÏÅ ÄÅÒÅ×Ï ÎÅ ÕÓÔÏ (Ô. Å. ÎÅ Ñ×ÌÑÅÔÓÑ Leaf-ÄÅÒÅ×ÏÍ). äÌÑ ÏÂÒÁÂÏÔËÉ ÕÓÔÏÇÏ ÄÅÒÅ×Á × ÏÒÅÄÅÌÅÎÉÅ ÆÕÎË ÉÉ join ×ËÌÀÞÅÎÏ ÏÔÄÅÌØÎÏÅ ÒÁ×ÉÌÏ.
I õÒÁÖÎÅÎÉÅ VII.3.6
ðÏÄÇÏÔÏ×ØÔÅ ÓËÒÉÔ, ÓÏÄÅÒÖÁÝÉÊ ×ÙÛÅÏÉÓÁÎÎÙÅ ÆÕÎË ÉÉ ÄÌÑ ÒÁ ÂÏÔÙ Ó ÄÅÒÅ×ØÑÍÉ ÏÉÓËÁ. ðÒÉ ÏÂßÑ×ÌÅÎÉÉ ÔÉÁ Tree ÎÅ ÚÁÂÕÄØÔÅ ÕËÁÚÁÔØ, ÞÔÏ ÏÎ Ñ×ÌÑÅÔÓÑ ÜËÚÅÍÌÑÒÏÍ ËÌÁÓÓÁ Show (ÂÅÚ ÏÄÏÂÎÏÇÏ ÕËÁÚÁÎÉÑ ×Ù ÎÅ ÓÕÍÅÅÔÅ Õ×ÉÄÅÔØ ÒÅÚÕÌØÔÁÔ ÒÉÍÅÎÅÎÉÑ ÆÕÎË ÉÊ Ë ÄÅÒÅ×ØÑÍ):
data Tree a = Node a (Tree a) (Tree a) | Leaf deriving (Show) ÷ËÌÀÞÉÔÅ × ÓËÒÉÔ ÏÉÓÁÎÉÅ ÄÅÒÅ×Á ÏÉÓËÁ ÉÚ ÒÁÓÓÍÏÔÒÅÎÎÏÇÏ ÒÉÍÅÒÁ, ÚÁÄÁ×ÁÅÍÏÅ ×ÙÒÁÖÅÎÉÅÍ:
tree1 :: Tree Int tree1 = Node 6 (Node 2 (Node 1 Leaf Leaf) (Node 4 (Node 3 Leaf Leaf) (Node 5 Leaf Leaf)))
3. áÌÇÅÂÒÁÉÞÅÓËÉÅ ÔÉÙ ÄÁÎÎÙÈ
195
(Node 8 (Node 7 Leaf Leaf) (Node 10 (Node 9 Leaf Leaf) Leaf)) ÅÅÒØ ÍÏÖÎÏ ÒÁÂÏÔÁÔØ Ó ×ÅÌÉÞÉÎÏÊ tree1, ËÁË Ó ÂÁÚÏÊ ÄÁÎÎÙÈ. ÷ÙÏÌÎÉÔÅ ÓÌÅÄÕÀÝÉÅ ×ÙÚÏ×Ù ÆÕÎË ÉÊ:
---> elemTree True ---> elemTree False ---> elemTree True ---> elemTree False
4 tree1
H
14 tree1 14 (insertTree 14 tree1) 4 (deleteTree 4 tree1)
J
3.5. íÅÔËÉ ÏÌÅÊ ðÏÌÑ × ÒÅÄÅÌÁÈ ÄÅËÌÁÒÁ ÉÉ data ÍÏÇÕÔ ÂÙÔØ ÄÏÓÔÕÎÙ ÌÉÂÏ ÏÚÉ ÉÏÎÎÏ, ÌÉÂÏ Ï ÉÍÅÎÉ Ó ÉÓÏÌØÚÏ×ÁÎÉÅÍ . òÁÓ ÓÍÏÔÒÉÍ ÔÉ ÄÁÎÎÙÈ, ÒÅÄÓÔÁ×ÌÑÀÝÉÈ ÔÏÞËÕ ÎÁ ÌÏÓËÏÓÔÉ:
ÍÅÔÏË ÏÌÅÊ
data Point = Pt Float Float ä×Å ËÏÍÏÎÅÎÔÙ Point ÅÓÔØ ÅÒ×ÙÊ É ×ÔÏÒÏÊ ÁÒÇÕÍÅÎÔ ËÏÎÓÔÒÕË ÔÏÒÁ Pt. æÕÎË ÉÑ, ÁÎÁÌÏÇÉÞÎÁÑ,
pointx pointx (Pt x _)
:: Point -> Float = x
ÍÏÖÅÔ ÉÓÏÌØÚÏ×ÁÔØÓÑ ÄÌÑ ÓÓÙÌËÉ ÎÁ ÅÒ×ÕÀ ËÏÍÏÎÅÎÔÕ ÔÏÞËÉ × ÄÏÓÔÁÔÏÞÎÏ ÎÁÇÌÑÄÎÏÍ ×ÉÄÅ, ÎÏ ÄÌÑ ÂÏÌØÛÉÈ ÓÔÒÕËÔÕÒ ÄÏ×ÏÌØÎÏ ÕÔÏÍÉÔÅÌØÎÏ ÓÏÚÄÁ×ÁÔØ ÔÁËÉÅ ÆÕÎË ÉÉ ×ÒÕÞÎÕÀ. ëÏÎÓÔÒÕËÔÏÒ × ÄÅËÌÁÒÁ ÉÉ ÔÉÁ data ÍÏÖÅÔ ÂÙÔØ ÏÂßÑ×ÌÅÎ Ó ÁÓÓÏ ÉÉÒÏ×ÁÎÎÙÍ , ÚÁËÌÀÞÅÎÎÙÍ × ÓËÏÂËÉ. ÁËÏÅ ÉÍÑ ÏÌÑ ÏÔÏÖÄÅÓÔ×ÌÑÅÔ ËÏÍÏÎÅÎÔÙ ËÏÎÓÔÒÕËÔÏÒÁ Ó ÉÍÅÎÅÍ ÑÓ ÎÅÅ, ÞÅÍ ÕËÁÚÁÎÉÅ ÏÚÉ ÉÉ ÏÌÑ × ÓÔÒÕËÔÕÒÅ. ÷ÏÔ ÁÌØÔÅÒÎÁÔÉ×ÎÙÊ ÓÏÓÏ ÏÒÅÄÅÌÅÎÉÑ ÔÉÁ Point:
ÉÍÅÎÅÍ ÏÌÑ
data Point = Pt {pointx, pointy :: Float} ÁËÏÅ ÏÒÅÄÅÌÅÎÉÅ ÉÄÅÎÔÉÞÎÏ ÒÉ×ÅÄÅÎÎÏÍÕ ÒÁÎÅÅ ÏÒÅÄÅÌÅÎÉÀ ÔÉÁ Point. ëÏÎÓÔÒÕËÔÏÒ Pt ÏÄÉÎ É ÔÏÔ ÖÅ × ÏÂÏÉÈ ÓÌÕÞÁÑÈ. ïÄÎÁËÏ, ÜÔÁ ÄÅËÌÁÒÁ ÉÑ ÚÁÄÁÌÁ ÉÍÅÎÁ Ä×ÕÍ ÏÌÑÍ: pointx É
VII. Haskell ËÁË ÑÚÙË ïïð
196
pointy. äÁÎÎÙÅ ÉÍÅÎÁ ÍÏÇÕÔ ÉÓÏÌØÚÏ×ÁÔØÓÑ × ËÁÞÅÓÔ×Å ÓÅÌÅËÔÏÒ ÎÙÈ ÆÕÎË ÉÊ, ÏÚ×ÏÌÑÀÝÉÈ ×ÙÄÅÌÑÔØ ËÏÍÏÎÅÎÔÙ ÉÚ ÓÔÒÕËÔÕÒÙ. ÷ ÜÔÏÍ ÒÉÍÅÒÅ ÔÉ ÓÅÌÅËÔÏÒÎÙÈ ÆÕÎË ÉÊ ÔÁËÏ×: pointx pointy
:: ::
Point -> Float Point -> Float
á ×ÏÔ ÆÕÎË ÉÑ, ÉÓÏÌØÚÕÀÝÁÑ ÜÔÉ ÓÅÌÅËÔÏÒÙ:
absPoint absPoint p
:: Point -> Float = sqrt (pointx p * pointx p + pointy p * pointy p)
íÅÔËÉ ÏÌÅÊ ÍÏÖÎÏ ÉÓÏÌØÚÏ×ÁÔØ É ÄÌÑ ÏÌÕÞÅÎÉÑ ÎÏ×ÙÈ ×Å ÌÉÞÉÎ: ×ÙÒÁÖÅÎÉÅ Pt {pointx = 1, pointy = 2} ÉÄÅÎÔÉÞÎÏ Pt 1 2. éÓÏÌØÚÏ×ÁÎÉÅ ÉÍÅÎ ÏÌÅÊ ÎÅ ×ÙÔÅÓÎÑÅÔ ÕÏÔÒÅÂÌÅÎÉÅ ÏÚÉ ÉÏÎÎÏ ÇÏ ÓÔÉÌÑ ÒÉ ÚÁÄÁÎÉÉ ×ÅÌÉÞÉÎ, ÔÁË ÏÂÅ ÆÏÒÍÙ, ÒÉ×ÅÄÅÎÎÙÅ ÒÁÎÅÅ, ÄÏÓÔÕÎÙ ÏÌØÚÏ×ÁÔÅÌÀ, ÏÄÎÁËÏ, , ÞÔÏ ÎÅ×ÏÚÍÏÖÎÏ ÒÉ ÏÚÉ ÉÏÎÎÏÊ ÆÏÒÍÅ ÏÒÅÄÅÌÅÎÉÑ ×ÅÌÉÞÉÎÙ. ïÂÒÁÚ Ù ÓÏÏÔ×ÅÔÓÔ×ÉÑ, ×ËÌÀÞÁÀÝÉÅ ÉÍÅÎÁ ÏÌÅÊ, ÉÓÏÌØÚÕÀÔ ÔÁËÏÊ ÖÅ ÓÉÎÔÁËÓÉÓ, ÞÔÏ É ËÏÎÓÔÒÕËÔÏÒ Pt:
Ó ÏÍÏÝØÀ ÍÅÔÏË ÏÌÅÊ ÍÏÖ ÎÏ ÚÁÄÁÔØ ×ÅÌÉÞÉÎÕ, ÎÅ ×ÓÅ ÏÌÑ ËÏÔÏÒÏÊ ÂÕÄÕÔ ÏÒÅÄÅÌÅÎÙ
absPoint (Pt {pointx = x, pointy = y}) = sqrt (x*x + y*y) æÕÎË ÉÑ, ÉÚÍÅÎÑÀÝÁÑ ÚÎÁÞÅÎÉÅ ÓÔÒÕËÔÕÒÙ (update fun tion), ÉÓÏÌØÚÕÅÔ ÚÎÁÞÅÎÉÑ ÏÌÑ × ÓÕÝÅÓÔ×ÕÀÝÅÊ ÓÔÒÕËÔÕÒÅ ÄÌÑ ÚÁÏÌÎÅ ÎÉÑ ËÏÍÏÎÅÎÔ ÎÏ×ÏÊ ÓÔÒÕËÔÕÒÙ. åÓÌÉ p ÅÓÔØ ×ÅÌÉÞÉÎÁ ÔÉÁ Point (Ô. Å. ÔÏÞËÁ), ÔÏ p {pointx = 2} ÅÓÔØ ÔÏÞËÁ Ó ÔÅÍ ÖÅ ÚÎÁÞÅÎÉÅÍ ÏÌÑ pointy, ÞÔÏ É Õ p, ÎÏ Ó pointx, ÚÁÍÅÎÅÎÎÙÍ ÎÁ 2. ÁËÁÑ ÏÅÒÁ ÉÑ ÎÅ Ñ×ÌÑÅÔÓÑ ÄÅÓÔÒÕËÔÉ×ÎÏÊ: ÏÂÎÏ×ÌÑÀÝÁÑ ÆÕÎË ÉÑ ÌÉÛØ ÓÏÚÄÁÅÔ ÎÏ×ÕÀ ËÏÉÀ ÏÂßÅËÔÁ, ÚÁÏÌÎÑÑ ÎÅËÏÔÏÒÙÅ ÅÇÏ ÏÌÑ ÎÏ×ÙÍÉ ÚÎÁ ÞÅÎÉÑÍÉ.
I õÒÁÖÎÅÎÉÅ VII.3.7
óÏÚÄÁÊÔÅ ÓËÒÉÔ, ÓÏÄÅÒÖÁÝÉÊ ÓÌÅÄÕÀÝÉÊ ËÏÄ:
data Point = Pt {px, py :: Float} deriving Show absPoint :: Point -> Float absPoint p = sqrt (px p * px p + py p * py p) e1 e1 e2 e2
:: Point = Pt {px = 1, py = 2} :: Float = absPoint e1
3. áÌÇÅÂÒÁÉÞÅÓËÉÅ ÔÉÙ ÄÁÎÎÙÈ e3 e3 e4 e4
197
:: Float = px e1 :: Point = e1 {px = 4}
úÁÇÒÕÚÉÔÅ ÓËÒÉÔ É ×ÙÏÌÎÉÔÅ ×ÙÞÉÓÌÅÎÉÑ:
H
---> e1 Pt{px=1.0,py=2.0} ---> e2 2.23607 ---> e3 1.0 ---> e4 Pt{px=4.0,py=2.0} ÷ÙÞÉÓÌÉÔÅ ÒÁÓÓÔÏÑÎÉÅ ÏÔ ÔÏÞËÉ e4 ÄÏ ÎÁÞÁÌÁ ËÏÏÒÄÉÎÁÔ. ïÒÅÄÅ ÌÉÔÅ ÆÕÎË ÉÀ, ×ÙÞÉÓÌÑÀÝÕÀ ÒÁÓÓÔÏÑÎÉÅ ÍÅÖÄÕ Ä×ÕÍÑ ÔÏÞËÁÍÉ.
J
óËÏÂËÉ, ÉÓÏÌØÚÕÅÍÙÅ ÒÉ ÚÁÄÁÎÉÉ ÍÅÔÏË ÏÌÅÊ, ÉÍÅÀÔ ÓÅ ÉÁÌØÎÏÅ ÚÎÁÞÅÎÉÅ: ÎÅÓÍÏÔÒÑ ÎÁ ÔÏ, ÞÔÏ ÓÉÎÔÁËÓÉÓ ÑÚÙËÁ Haskell ÏÂÙÞÎÏ ÒÁÚÒÅÛÁÅÔ ÏÕÓËÁÔØ ÓËÏÂËÉ, ÚÁÍÅÎÑÑ ÉÈ ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÉÍ ×ÙÒÁ×ÎÉ×ÁÎÉÅÍ ÔÅËÓÔÁ ( ), ÒÉ ÉÓÏÌØÚÏ×ÁÎÉÉ ÍÅÔÏË Ï ÌÅÊ ÓËÏÂËÉ .
ÎÅÏÂÈÏÄÉÍÙ
layout rule
íÅÔËÉ ÏÌÅÊ ÍÏÇÕÔ ÉÓÏÌØÚÏ×ÁÔØÓÑ ÎÅ ÔÏÌØËÏ × ÔÉÁÈ ÄÁÎÎÙÈ Ó ÅÄÉÎÓÔ×ÅÎÎÙÍ ËÏÎÓÔÒÕËÔÏÒÏÍ (ÏÂÙÞÎÏ ÎÁÚÙ×ÁÅÍÙÅ ÚÁÉÓÑÍÉ, re ords). ïÄÎÁËÏ, ÓÌÅÄÕÅÔ ÏÔÍÅÔÉÔØ, ÞÔÏ × ÔÉÁÈ Ó ÎÅÓËÏÌØËÉÍÉ ËÏÎ ÓÔÒÕËÔÏÒÁÍÉ ÒÉÍÅÎÅÎÉÅ ×ÙÄÅÌÑÀÝÉÈ ÉÌÉ ÏÂÎÏ×ÌÑÀÝÉÈ ÆÕÎË ÉÊ, ÉÓÏÌØÚÕÀÝÉÈ ÉÍÅÎÁ ÏÌÅÊ, ÍÏÖÅÔ ÉÎÏÇÄÁ ÒÉ×ÅÓÔÉ Ë ÏÛÉÂËÅ ×ÒÅÍÅÎÉ ×ÙÏÌÎÅÎÉÑ, ÁÎÁÌÏÇÉÞÎÏÊ ÔÏÊ, Ë ËÏÔÏÒÏÊ ÒÉ×ÏÄÉÔ ×ÙÚÏ× ÆÕÎË ÉÉ head Ó ÕÓÔÙÍ ÓÉÓËÏÍ × ËÁÞÅÓÔ×Å ÁÒÇÕÍÅÎÔÁ. Ï ÉÌÉ ÉÎÏÅ ÉÍÑ ÏÌÑ ÎÅ ÍÏÖÅÔ ÉÓÏÌØÚÏ×ÁÔØÓÑ ÂÏÌÅÅ, ÞÅÍ × ÏÄÎÏÍ ÔÉÅ ÄÁÎÎÙÈ. ÅÍ ÎÅ ÍÅÎÅÅ × ÒÅÄÅÌÁÈ ÏÄÎÏÇÏ ÔÉÁ ÄÁÎÎÙÈ, ÜÔÏ ÉÍÑ ÍÏÖÅÔ ÉÓÏÌØÚÏ×ÁÔØÓÑ × ÒÁÚÌÉÞÎÙÈ ËÏÎÓÔÒÕËÔÏÒÁÈ. ÁË, × ÓÌÅÄÕÀÝÅÍ ÔÉÅ ÄÁÎÎÙÈ ÍÅÔËÁ f ÉÓÏÌØÚÕÅÔÓÑ ÓÒÁÚÕ × Ä×ÕÈ ËÏÎ ÓÔÒÕËÔÏÒÁÈ:
data T = C1 {f :: Int, g :: Float} | C2 {f :: Int, h :: Bool} åÓÌÉ x ÅÓÔØ ×ÅÌÉÞÉÎÁ ÔÉÁ T, ÔÏ ×ÙÒÁÖÅÎÉÅ x {f = 5} ÄÏÕÓÔÉÍÏ ÉÓÏÌØÚÏ×ÁÔØ ÎÅÚÁ×ÉÓÉÍÏ ÏÔ ÔÏÇÏ, ËÁËÉÍ ÉÚ ËÏÎÓÔÒÕËÔÏÒÏ× ÄÁÎÎÙÈ ÔÉÁ T ÂÙÌÁ ÓÏÚÄÁÎÁ ×ÅÌÉÞÉÎÁ x.
VII. Haskell ËÁË ÑÚÙË ïïð
198
I õÒÁÖÎÅÎÉÅ VII.3.8
óÏÚÄÁÊÔÅ ÓËÒÉÔ, ÓÏÄÅÒÖÁÝÉÊ ÓÌÅÄÕÀÝÉÊ ËÏÄ:
data T = C1 {f :: Int, g :: Float} | C2 {f :: Int, h :: Bool} deriving Show e5 e5 e6 e6 e7 e7 e8 e8 e9 e9
H
:: T = C1 {f = 1, g = 2} :: T = C2 {f = 3, h = False} :: Int = f e5 :: Int = f e6 :: Float = g e6
÷ÙÏÌÎÉÔÅ ×ÙÞÉÓÌÅÎÉÑ É ÏÂßÑÓÎÉÔÅ ÏÌÕÞÅÎÎÙÅ ÒÅÚÕÌØÔÁÔÙ:
---> e5 C1{f=1,g=2.0} ---> e6 C2{f=3,h=False} ---> e7 1 ---> e8 3 ---> e9 Program error: {T_C1_g e6}
J
íÅÔËÉ ÏÌÅÊ ÎÅ ÍÅÎÑÀÔ ÒÉÒÏÄÕ ÁÌÇÅÂÒÁÉÞÅÓËÏÇÏ ÔÉÁ ÄÁÎÎÙÈ, Á ÌÉÛØ Ñ×ÌÑÀÔÓÑ ÕÄÏÂÎÏÊ ÓÉÎÔÁËÓÉÞÅÓËÏÊ ×ÏÚÍÏÖÎÏÓÔØÀ ÏÂÒÁÝÅ ÎÉÑ Ë ËÏÍÏÎÅÎÔÁÍ ÓÔÒÕËÔÕÒÙ ÄÁÎÎÙÈ. ïÎÉ ÄÅÌÁÀÔ ËÏÎÓÔÒÕËÔÏÒÙ Ó ÎÅÓËÏÌØËÉÍÉ ËÏÍÏÎÅÎÔÁÍÉ ÂÏÌÅÅ ÕÄÏÂÎÙÍÉ ÄÌÑ ÒÁËÔÉÞÅÓËÏÇÏ ÉÓÏÌØÚÏ×ÁÎÉÑ, ÔÁË ËÁË ÏÌÑ ÍÏÇÕÔ ÄÏÂÁ×ÌÑÔØÓÑ ÉÌÉ ÕÄÁÌÑÔØÓÑ ÂÅÚ ÕÏÍÉÎÁÎÉÑ ËÏÎÓÔÒÕËÔÏÒÁ.
3.6. óÔÒÏÇÉÊ ËÏÎÓÔÒÕËÔÏÒ × data ÄÅËÌÁÒÁ ÉÉ óÔÒÕËÔÕÒÙ ÄÁÎÎÙÈ × ÑÚÙËÅ Haskell × ÏÂÝÅÍ ÓÌÕÞÁÅ Ñ×ÌÑÀÔÓÑ ÌÅÎÉ×ÙÍÉ: ËÏÍÏÎÅÎÔÙ ÎÅ ×ÙÞÉÓÌÑÀÔÓÑ ÄÏ ÔÅÈ ÏÒ, ÏËÁ Ñ×ÎÏ ÎÅ
3. áÌÇÅÂÒÁÉÞÅÓËÉÅ ÔÉÙ ÄÁÎÎÙÈ
199
ÏÔÒÅÂÕÀÔÓÑ. üÔÏ ÄÁÅÔ ×ÏÚÍÏÖÎÏÓÔØ ÒÉÍÅÎÅÎÉÑ ÓÔÒÕËÔÕÒ, ÓÏÄÅÒ ÖÁÝÉÈ ÜÌÅÍÅÎÔÙ, ×ÙÞÉÓÌÅÎÉÅ ËÏÔÏÒÙÈ, ÅÓÌÉ ÏÎÏ ÏÔÒÅÂÕÅÔÓÑ, ÒÉ ×ÅÄÅÔ Ë ÏÛÉÂËÅ ÉÌÉ ÒÅËÒÁÝÅÎÉÀ ×ÙÏÌÎÅÎÉÑ. éÓÏÌØÚÏ×ÁÎÉÅ ÌÅ ÎÉ×ÙÈ ÓÔÒÕËÔÕÒ ÄÁÎÎÙÈ ÕÓÉÌÉ×ÁÅÔ ×ÙÒÁÚÉÔÅÌØÎÏÓÔØ ÑÚÙËÁ Haskell É Ñ×ÌÑÅÔÓÑ ÎÅÏÔßÅÍÌÅÍÏÊ ÞÅÒÔÏÊ ÓÔÉÌÑ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÑ ÎÁ ÄÁÎ ÎÏÍ ÑÚÙËÅ. ÷ÎÕÔÒÅÎÎÅÅ ÒÅÄÓÔÁ×ÌÅÎÉÅ ËÁÖÄÏÇÏ ÏÌÑ ÏÂßÅËÔÁ, ÚÁÄÁ×ÁÅÍÏÇÏ ÌÅÎÉ×ÏÊ ÓÔÒÕËÔÕÒÏÊ ÄÁÎÎÙÈ ÎÁÏÍÉÎÁÅÔ ÎÅËÏÔÏÒÕÀ ÂÏÌØÛÕÀ É ÔÑ ÖÅÌÕÀ ÕÁËÏ×ËÕ, ËÏÔÏÒÁÑ ÓËÒÙ×ÁÅÔ ×ÙÞÉÓÌÅÎÉÅ ×ÅÌÉÞÉÎÙ, ÄÏ ÔÏÇÏ ÍÏÍÅÎÔÁ, ËÏÇÄÁ ÏÎÁ ÏÔÒÅÂÕÅÔÓÑ. õÁËÏ×ËÉ, ÓÏÄÅÒÖÁÝÉÅ ÎÅÏÒÅÄÅ ÌÅÎÎÙÅ ÜÌÅÍÅÎÔÙ (?), ÎÅ ÚÁÔÒÁÇÉ×ÁÀÔ ÄÒÕÇÉÅ ÜÌÅÍÅÎÔÙ ÓÔÒÕËÔÕÒÙ ÄÁÎÎÙÈ. ÁË, ËÏÒÔÅÖ ('a', ?) Ñ×ÌÑÅÔÓÑ ÓÏ×ÅÒÛÅÎÎÏ ÌÅÇÁÌØÎÏÊ ×Å ÌÉÞÉÎÏÊ × Haskell. ðÏÒÏÂÕÊÔÅ:
---> fst ('a', undefined) 'a'
H
éÓÏÌØÚÏ×ÁÎÉÅ ×ÅÌÉÞÉÎÙ 'a' ÎÅ ÚÁÔÒÁÇÉ×ÁÅÔ ÄÒÕÇÉÅ ËÏÍÏÎÅÎÔÙ ÔØÀÌÁ. âÏÌØÛÉÎÓÔ×Ï ÑÚÙËÏ× ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÑ Ñ×ÌÑÀÔÓÑ , Á ÎÅ ÌÅÎÉ×ÙÍÉ: × ÎÉÈ ×ÓÅ ËÏÍÏÎÅÎÔÙ ÓÔÒÕËÔÕÒ ÄÁÎÎÙÈ ×ÙÞÉÓÌÑ ÀÔÓÑ ÅÒÅÄ ÔÅÍ, ËÁË ÏÎÉ ÏÍÅÝÁÀÔÓÑ × ÓÔÒÕËÔÕÒÕ. åÓÔØ ÅÝÅ ÎÅÓËÏÌØËÏ ÏÓÏÂÅÎÎÏÓÔÅÊ, Ó×ÑÚÁÎÎÙÈ Ó ÏÄÏÂÎÏÊ ÕÁ ËÏ×ËÏÊ ÓÔÒÕËÔÕÒ: ×ÓÅ ÔÁËÉÅ ÓÔÒÕËÔÕÒÙ ÔÒÅÂÕÀÔ ÄÏÏÌÎÉÔÅÌØÎÏÇÏ ×ÒÅÍÅÎÉ ÄÌÑ ËÏÎÓÔÒÕÉÒÏ×ÁÎÉÑ É ×ÙÞÉÓÌÅÎÉÑ; ÄÌÑ ÉÈ ÒÁÚÍÅÝÅÎÉÑ × ÁÍÑÔÉ ÉÓÏÌØÚÕÅÔÓÑ ËÕÞÁ (heap) É ÏÎÉ ÏÚ×ÏÌÑÀÔ ÒÉÍÅÎÑÔØ ÓÂÏÒ ËÕ ÍÕÓÏÒÁ, ×Ï ×ÒÅÍÑ ×ÙÞÉÓÌÅÎÉÑ. éÚÂÅÖÁÔØ ÔÁËÉÈ ÎÁËÌÁÄÎÙÈ ÒÁÓ ÈÏÄÏ× ÏÚ×ÏÌÑÀÔ, ÔÁË ÎÁÚÙ×ÁÅÍÙÅ, , ÕÏÔÒÅÂÌÅ ÎÉÅ ËÏÔÏÒÙÈ × data-ÄÅËÌÁÒÁ ÉÉ ÒÉ×ÏÄÉÔ Ë ÎÅÍÅÄÌÅÎÎÏÍÕ ×ÙÞÉ ÓÌÅÎÉÀ ÏÔÍÅÞÅÎÎÙÈ ÉÍ ÏÌÅÊ ËÏÎÓÔÒÕËÔÏÒÁ, ÉÇÎÏÒÉÒÕÑ ÌÅÎÉ×ÏÓÔØ. æÌÁÇÉ ÓÔÒÏÇÏÓÔÉ ÍÏÖÎÏ ÉÓÏÌØÚÏ×ÁÔØ × ÓÌÅÄÕÀÝÉÈ ÓÉÔÕÁ ÉÑÈ:
ÓÔÒÏÇÉÍÉ
ÆÌÁÇÉ ÓÔÒÏÇÏÓÔÉ
ÄÌÑ ÚÁÄÁÎÉÑ ÔÅÈ ËÏÍÏÎÅÎÔ ÓÔÒÕËÔÕÒÙ, ËÏÔÏÒÙÅ ÏÂÑÚÁÔÅÌØÎÏ
ÂÕÄÕÔ ×ÙÞÉÓÌÑÔØÓÑ ×Ï ×ÒÅÍÑ ×ÙÏÌÎÅÎÉÑ ÒÏÇÒÁÍÍÙ; ÄÌÑ ÚÁÄÁÎÉÑ ËÏÍÏÎÅÎÔ ÓÔÒÕËÔÕÒÙ, ËÏÔÏÒÙÅ ÌÅÇËÏ ×ÙÞÉÓÌÑÀÔ ÓÑ É ÎÉËÏÇÄÁ ÎÅ ÒÉ×ÏÄÑÔ Ë ÏÛÉÂËÁÍ; ÒÉ ÉÓÏÌØÚÏ×ÁÎÉÉ ÔÉÏ×, ÄÌÑ ËÏÔÏÒÙÈ ÕÏÔÒÅÂÌÅÎÉÅ ÞÁÓÔÉÞÎÏ ÎÅÏÒÅÄÅÌÅÎÎÙÈ ×ÅÌÉÞÉÎ ÎÅ Ñ×ÌÑÅÔÓÑ ÎÅÏÂÈÏÄÉÍÙÍ.
ëÏÍÌÅËÓÎÙÅ ÞÉÓÌÁ, ÎÁÒÉÍÅÒ, ÍÏÖÎÏ ÏÂßÑ×ÉÔØ ËÁË ÔÉ Complex ÓÌÅÄÕÀÝÉÍ ÏÂÒÁÚÏÍ:
data RealFloat a => Complex a = !a :+ !a
200
VII. Haskell ËÁË ÑÚÙË ïïð
÷ ÄÁÎÎÏÍ ÏÒÅÄÅÌÅÎÉÉ ÉÓÏÌØÚÕÅÔÓÑ ËÏÎÓÔÒÕËÔÏÒ × ÆÏÒÍÅ ÉÎÆÉËÓ ÎÏÇÏ ÏÅÒÁÔÏÒÁ :+. üÔÏ ÏÒÅÄÅÌÅÎÉÅ ×ÙÄÅÌÑÅÔ Ä×Å ËÏÍÏÎÅÎÔÙ ÄÅÊÓÔ×ÉÔÅÌØÎÕÀ É ÍÎÉÍÕÀ ÞÁÓÔÉ ËÏÍÌÅËÓÎÏÇÏ ÞÉÓÌÁ ËÁË ÓÔÒÏÇÏ ÏÒÅÄÅÌÅÎÎÙÅ. íÏÖÎÏ ÒÅÄÌÏÖÉÔØ ÂÏÌÅÅ ËÏÍÁËÔÎÏÅ ÒÅÄÓÔÁ×ÌÅ ÎÉÅ ËÏÍÌÅËÓÎÙÈ ÞÉÓÅÌ ÂÅÚ ÉÓÏÌØÚÏ×ÁÎÉÅ ÆÌÁÇÁ ÓÔÒÏÇÏÓÔÉ, ÎÏ ÏÎÏ ÒÉ×ÏÄÉÔ Ë ÄÏÏÌÎÉÔÅÌØÎÙÍ ÒÁÓÈÏÄÁÍ ÒÉ ÓÏÚÄÁÎÉÉ ËÏÍÌÅËÓÎÏÇÏ ÞÉÓÌÁ Ó ÎÅÏÒÅÄÅÌÅÎÎÏÊ ËÏÍÏÎÅÎÔÏÊ, ÔÁËÏÇÏ ËÁË 1 :+ ?. ! æÌÁÇÉ ÓÔÒÏÇÏÓÔÉ ÍÏÇÕÔ ÒÉ×ÏÄÉÔØ Ë ÕÔÅÞËÁÍ ÁÄÒÅÓÏ× ÁÍÑÔÉ: ÔÁËÉÅ data ÓÔÒÕËÔÕÒÙ ÎÅ ÏÚ×ÏÌÑÀÔ ÉÓÏÌØÚÏ ×ÁÔØ ÓÂÏÒËÕ ÍÕÓÏÒÁ ÄÌÑ ÔÅÈ ÞÁÓÔÅÊ, ËÏÔÏÒÙÅ ÕÖÅ ÎÅ ÏÔÒÅÂÕÀÔÓÑ ÄÌÑ ×ÙÞÉÓÌÅÎÉÊ. æÌÁÇ ÓÔÒÏÇÏÓÔÉ ! ÍÏÖÅÔ ÉÓÏÌØÚÏ×ÁÔØÓÑ ÔÏÌØËÏ × ÄÅËÌÁÒÁ É ÑÈ data. ïÎ ÎÅ ÍÏÖÅÔ ÕÏÔÒÅÂÌÑÔØÓÑ × ÓÉÇÎÁÔÕÒÁÈ ÏÒÅÄÅÌÅÎÉÊ ÄÒÕÇÉÈ ÔÉÏ× ÄÅËÌÁÒÁ ÉÊ. óÌÅÄÕÅÔ ÒÅÄÏÓÔÅÒÅÞØ ÏÔ ÂÅÚÄÕÍÎÏÇÏ ÉÓ ÏÌØÚÏ×ÁÎÉÑ ÆÌÁÇÁ ÓÔÒÏÇÏÓÔÉ, ÔÁË ËÁË ÌÅÎÉ×ÏÓÔØ Ñ×ÌÑÅÔÓÑ ÏÄÎÉÍ ÉÚ ÆÕÎÄÁÍÅÎÔÁÌØÎÙÈ Ó×ÏÊÓÔ× ÑÚÙËÁ Haskell É ÕÏÔÒÅÂÌÅÎÉÅ ÆÌÁÇÏ× ÓÔÒÏÇÏÓÔÉ ÍÏÖÅÔ ÚÎÁÞÉÔÅÌØÎÏ ÕÓÌÏÖÎÉÔØ ÏÂÒÁÂÏÔËÕ ÂÅÓËÏÎÅÞÎÙÈ ÓÔÒÕËÔÕÒ ÉÌÉ ÒÉ×ÅÓÔÉ Ë ÄÒÕÇÉÍ ÎÅÏÖÉÄÁÎÎÙÈ ÏÓÌÅÄÓÔ×ÉÑÍ.
ðÏÌÑ, ÏÔÍÅÞÅÎÎÙÅ ÚÎÁËÏÍ × ÄÅËÌÁÒÁ ÉÉ , ×ÙÞÉÓÌÑ ÀÔÓÑ × ÍÏÍÅÎÔ ÓÏÚÄÁÎÉÑ.
I õÒÁÖÎÅÎÉÅ VII.3.9
ïÒÅÄÅÌÉÍ ÔÉ ÄÁÎÎÙÈ, ÁÎÁÌÏÇÉÞÎÙÊ ÓÉÓËÁÍ, ÎÏ ÓÔÒÏÇÉÊ Ï ÏÔ ÎÏÛÅÎÉÀ Ë ÅÇÏ ÅÒ×ÏÍÕ ÜÌÅÍÅÎÔÕ (ÇÏÌÏ×Å):
data HList a = Cons !a (HList a) | Nil deriving Show hd (Cons x y) = x tl (Cons x y) = y e10 :: HList Bool e10 = True `Cons` (error "e10" `Cons` Nil) e11, e12 :: Bool e11 = hd e10 e12 = hd (tl e10) e13 :: HList Bool e13 = tl (tl (e10))
H
÷ÙÞÉÓÌÉÔÅ ÕËÁÚÁÎÎÙÅ ÚÎÁÞÅÎÉÑ É ÒÏËÏÍÍÅÎÔÉÒÕÊÔÅ ÏÌÕÞÅÎÎÙÅ ÒÅÚÕÌØÔÁÔÙ:
---> e10 Cons True Program error: e10
3. áÌÇÅÂÒÁÉÞÅÓËÉÅ ÔÉÙ ÄÁÎÎÙÈ
201
---> e11 True ---> e12 Program error: e10 ---> e13 Program error: e10 ïÂßÑÓÎÉÔÅ, ÏÞÅÍÕ ÒÉ ÕÄÁÌÅÎÉÉ ÆÌÁÇÁ ÓÔÒÏÇÏÓÔÉ (!) × ÏÂßÑ×ÌÅÎÉÉ ÔÉÁ ÉÓÞÅÚÁÅÔ ÏÛÉÂËÁ ÒÉ ×ÙÞÉÓÌÅÎÉÉ e13:
---> e13 Nil
H
J
3.7. îÏ×ÙÅ ÔÉÙ: ÄÅËÌÁÒÁ ÉÑ newtype ïÂÝÅÊ ÒÏÇÒÁÍÍÉÓÔÓËÏÊ ÒÁËÔÉËÏÊ Ñ×ÌÑÅÔÓÑ ÏÒÅÄÅÌÅÎÉÅ ÔÉ Á, ËÏÔÏÒÙÊ ÒÅÄÓÔÁ×ÌÑÅÔ × ÔÏÞÎÏÓÔÉ ÓÕÝÅÓÔ×ÕÀÝÉÊ ÔÉ, ÎÏ ÒÅÄÓÔÁ×ÌÑÅÔÓÑ ÏÔÄÅÌØÎÏ × ÓÉÓÔÅÍÅ ÔÉÏ×. ÷ Haskell ÄÅËÌÁÒÁ ÉÑ newtype ÓÏÚÄÁÅÔ ÎÏ×ÙÊ ÔÉ ÉÚ ÕÖÅ ÓÕÝÅÓÔ×ÕÀÝÅÇÏ. úÁ ÉÓËÌÀÞÅÎÉ ÅÍ ËÌÀÞÅ×ÏÇÏ ÓÌÏ×Á, newtype-ÄÅËÌÁÒÁ ÉÑ ÉÓÏÌØÚÕÅÔ ÔÏÔ ÖÅ ÓÁÍÙÊ ÓÉÎÔÁËÓÉÓ, ÞÔÏ É data ÄÅËÌÁÒÁ ÉÑ Ó ÅÄÉÎÓÔ×ÅÎÎÙÍ ËÏÎÓÔÒÕËÔÏÒÏÍ, ÓÏÄÅÒÖÁÝÉÍ ÅÄÉÎÓÔ×ÅÎÎÏÅ ÏÌÅ. îÁÒÉÍÅÒ, ÎÁÔÕÒÁÌØÎÙÅ ÞÉÓÌÁ ÍÏÇÕÔ ÂÙÔØ ÒÅÄÓÔÁ×ÌÅÎÙ ÔÉÏÍ Integer Ó ÏÍÏÝØÀ ÓÌÅÄÕÀÝÅÊ ÄÅËÌÁÒÁ ÉÉ:
newtype Natural = MakeNatural Integer deriving (Eq, Ord, Show) ÁËÏÅ ÏÂßÑ×ÌÅÎÉÅ ÓÏÚÄÁÅÔ ÓÏ×ÅÒÛÅÎÎÏ ÎÏ×ÙÊ ÔÉ Natural, ÆÁËÔÉ ÞÅÓËÉ ÅÒÅÉÍÅÎÏ×Ù×ÁÀÝÉÊ Integer. ðÏÌÕÞÅÎÎÙÊ ÔÁËÉÍ ÏÂÒÁÚÏÍ ÔÉ ÏÔÌÉÞÁÅÔÓÑ ÏÔ ÔÉÁ-ÓÉÎÏÎÉÍÁ ÔÅÍ, ÞÔÏ ÜÔÏ ÓÏ×ÅÒÛÅÎÎÏ ÏÔÄÅÌØ ÎÙÊ ÔÉ, ËÏÔÏÒÙÊ ÏÌÎÏÓÔØÀ ÓÏÏÔ×ÅÔÓÔ×ÕÅÔ ÉÓÈÏÄÎÏÍÕ ÔÉÕ. ðÏ ÄÏÂÎÏÅ ÒÅÏÂÒÁÚÏ×ÁÎÉÅ ÎÅ ÔÒÅÂÕÅÔ ÄÏÏÌÎÉÔÅÌØÎÙÈ ×ÒÅÍÅÎÎÙÈ ÚÁ ÔÒÁÔ; newtype ÎÅ ÉÚÍÅÎÑÅÔ ÌÅÖÁÝÅÅ × ÏÓÎÏ×Å ÒÅÄÓÔÁ×ÌÅÎÉÅ ÏÂßÅË ÔÁ. äÏÕÓÔÉÍÏ ÏÒÅÄÅÌÅÎÉÅ ÔÉÁ, ÏÌÕÞÅÎÎÏÇÏ Ó ÏÍÏÝØÀ ÄÅËÌÁ ÒÁ ÉÉ newtype, ËÁË ÜËÚÅÍÌÑÒÁ ÔÏÇÏ ÉÌÉ ÉÎÏÇÏ ËÌÁÓÓÁ, ÞÔÏ ÎÅ×ÏÚ ÍÏÖÎÏ ÄÌÑ ÔÉÏ×, ÏÂßÑ×ÌÅÎÎÙÈ Ó ÏÍÏÝØÀ ÄÅËÌÁÒÁ ÉÉ type, Ô. Å. ÓÉÎÏÎÉÍÏ×. ÷ ÒÉ×ÅÄÅÎÎÏÍ ×ÙÛÅ ÏÂßÑ×ÌÅÎÉÉ, ËÏÎÓÔÒÕËÔÏÒ MakeNatural ÒÅÏÂÒÁÚÕÅÔ ×ÅÌÉÞÉÎÕ ÔÉÁ Integer Ë ÔÉÕ Natural:
toNatural toNatural x | x < 0
:: Integer -> Natural = error "÷ÅÌÉÞÉÎÁ ÍÅÎØÛÅ 0!"
VII. Haskell ËÁË ÑÚÙË ïïð
202
| otherwise
= MakeNatural x
fromNatural :: Natural -> Integer fromNatural (MakeNatural i) = i
óÌÅÄÕÀÝÁÑ ÄÅËÌÁÒÁ ÉÑ instan e ÏÒÅÄÅÌÑÅÔ Natural ËÁË ÜËÚÅÍÌÑÒ ËÌÁÓÓÁ Num:
instan e Num Natural where fromInteger = toNatural x + y = toNatural (fromNatural x + fromNatural y) x - y = let r = fromNatural x - fromNatural y in if r < 0 then error "òÁÚÎÏÓÔØ < 0" else toNatural r x * y = toNatural (fromNatural x * fromNatural y) âÅÚ ÏÄÏÂÎÏÊ ÄÅËÌÁÒÁ ÉÉ Natural ÎÅ ÍÏÖÅÔ ÉÓÏÌØÚÏ×ÁÔØ ÍÅÔÏÄÙ ËÌÁÓÓÁ Num. äÅËÌÁÒÁ ÉÑ ÎÁÓÌÅÄÏ×ÁÎÉÑ ÄÌÑ ÔÉÁ, ÉÓÏÌØÚÕÅÍÏÇÏ × ËÁÞÅÓÔ×Å ÏÓÎÏ×Ù, ÎÅ ÅÒÅÎÏÓÉÔÓÑ Á×ÔÏÍÁÔÉÞÅÓËÉ ÎÁ ÔÉ, ÏÒÅÄÅ ÌÅÎÎÏÊ ÒÉ ÏÍÏÝÉ ÏÂßÑ×ÌÅÎÉÑ newtype. îÅÓÍÏÔÒÑ ÎÁ ÔÏ, ÞÔÏ ÔÉ Integer ÕÖÅ Ñ×ÌÑÅÔÓÑ ÜËÚÅÍÌÑÒÏÍ ËÌÁÓÓÁ Num, ÄÌÑ ÔÉÁ Natural ÎÅÏÂÈÏÄÉÍÏ ×ÎÏ×Ø ÅÒÅÏÒÅÄÅÌÉÔØ ÍÅÔÏÄÙ ÒÏÄÉÔÅÌØÓËÏÇÏ ËÌÁÓÓÁ.
I õÒÁÖÎÅÎÉÅ VII.3.10
H
óÏÚÄÁÊÔÅ ÓËÒÉÔ, × ËÏÔÏÒÙÊ ÏÍÅÓÔÉÔÅ ÏÂßÑ×ÌÅÎÉÅ ÔÉÁ Natural É ÅÒÅÇÒÕÖÅÎÎÙÅ ÍÅÔÏÄÙ ËÌÁÓÓÁ Num, ÏÉÓÁÎÎÙÅ ×ÙÛÅ. ðÏÓÌÅ ÜÔÏÇÏ ÓÏÚÄÁÊÔÅ ÎÅÓËÏÌØËÏ ÎÁÔÕÒÁÌØÎÙÈ ÞÉÓÅÌ É ×ÙÏÌÎÉÔÅ ÓÏÏÔ×ÅÔÓÔ×Õ ÀÝÉÅ ÁÒÉÆÍÅÔÉÞÅÓËÉÅ ÏÅÒÁ ÉÉ:
---> toNatural 5 MakeNatural 5 ---> MakeNatural 3 + MakeNatural 4 MakeNatural 7 ---> MakeNatural 3 - MakeNatural 4 MakeNatural Program error: òÁÚÎÏÓÔØ ÏÔÒÉ ÁÔÅÌØÎÁ ---> MakeNatural 3 * MakeNatural 4 MakeNatural 12
J
åÝÅ ÒÁÚ ÏÔÍÅÔÉÍ, ÞÔÏ ÔÁË ÏÒÅÄÅÌÅÎÎÙÊ ÔÉ ÎÅ ÓÏ×ÁÄÁÅÔ Ó Num, × ÏÔÌÉÞÉÉ ÏÔ ÉÓÏÌØÚÏ×ÁÎÉÑ ÔÉÁ-ÓÉÎÏÎÉÍÁ ÄÌÑ Integer, Á Ñ×ÌÑÅÔÓÑ ÓÏ×ÅÒÛÅÎÎÏ ÏÔÄÅÌØÎÙÍ ÔÉÏÍ ÄÁÎÎÙÈ.
3. áÌÇÅÂÒÁÉÞÅÓËÉÅ ÔÉÙ ÄÁÎÎÙÈ
203
ðÏÄÏÂÎÏÇÏ ÜÆÆÅËÔÁ ÍÏÖÎÏ ÂÙÌÏ ÂÙ ÄÏÂÉÔØÓÑ É Ó ÏÍÏÝØÀ ÄÅ ËÌÁÒÁ ÉÉ data ×ÍÅÓÔÏ newtype. ÅÍ ÎÅ ÍÅÎÅÅ, ÍÁÎÉÕÌÑ ÉÑ Ó ×Å ÌÉÞÉÎÁÍÉ ÔÉÁ, ÏÂßÑ×ÌÅÎÎÏÇÏ Ó ÏÍÏÝØÀ ÄÅËÌÁÒÁ ÉÉ data, ËÁË ÕÖÅ ÏÔÍÅÞÁÌÏÓØ, ÒÉ×ÏÄÉÔ Ë Ï×ÙÛÅÎÎÙÍ ÔÒÁÔÁÍ ×ÒÅÍÅÎÉ ÒÉ ÒÁ ÂÏÔÅ Ó ×ÅÌÉÞÉÎÁÍÉ ÔÁËÏÇÏ ÔÉÁ. ðÒÉÍÅÎÅÎÉÅ ÄÅËÌÁÒÁ ÉÉ newtype ÏÚ×ÏÌÑÅÔ ÉÚÂÅÖÁÔØ ÜÔÉÈ ÄÏÏÌÎÉÔÅÌØÎÙÈ ÒÁÓÈÏÄÏ× (Ó×ÑÚÁÎÎÙÈ Ó ÌÅÎÉ×ÏÓÔØÀ ×ÙÞÉÓÌÅÎÉÊ) ÎÅÉÚÂÅÖÎÏ ÒÉ×ÎÏÓÉÍÙÈ ÄÅËÌÁÒÁ ÉÅÊ data. äÒÕÇÏÅ ÏÔÌÉÞÉÅ ÓÏÓÔÏÉÔ × ÒÁÚÌÉÞÎÙÈ ÒÁ×ÉÌÁÈ ÒÉÍÅÎÅÎÉÑ ÏÂÒÁÚ Ï× ÓÏÏÔ×ÅÔÓÔ×ÉÑ: newtype . üÔÏ ÏÚÎÁÞÁÅÔ, ÞÔÏ ÅÓ ÌÉ ÔÉ N ÏÂßÑ×ÌÅÎ Ó ÏÍÏÝØÀ ÄÅËÌÁÒÁ ÉÉ newtype, Á ? ÅÓÔØ ÎÅÏÒÅÄÅÌÅÎÎÁÑ ×ÅÌÉÞÉÎÁ, ÔÏ N ? ÅÓÔØ × ÔÏÞÎÏÓÔÉ ?. ÷ ÎÁÛÕ ÚÁ ÄÁÞÕ ÓÅÊÞÁÓ ÎÅ ×ÈÏÄÉÔ ÏÉÓÁÎÉÅ ×ÓÅÈ ÔÏÎËÏÓÔÅÊ × ÒÁÚÌÉÞÉÑÈ ÜÔÉÈ ÄÅËÌÁÒÁ ÉÊ, ÒÁÓÓÍÏÔÒÉÍ ÌÉÛØ ÏÄÉÎ ÒÉÍÅÒ, ×ÎÏÓÑÝÉÊ ÎÅËÏÔÏÒÕÀ ÑÓÎÏÓÔØ × ÕÏÔÒÅÂÌÅÎÉÅ ÔÏÊ ÉÌÉ ÉÎÏÊ ÄÅËÌÁÒÁ ÉÉ ÔÉÁ.
ËÏÎÓÔÒÕËÔÏÒ × ÄÅËÌÁÒÁ ÉÉ ÅÒÅÉÍÅÎÏ×Á ) Ñ×ÌÑÅÔÓÑ ÓÔÒÏÇÏÊ ÆÕÎË ÉÅÊ
ÎÉÑ (
I õÒÁÖÎÅÎÉÅ VII.3.11
ðÏÍÅÓÔÉÔÅ × ÓËÒÉÔ ÏÒÅÄÅÌÅÎÉÑ ÎÅÓËÏÌØËÉÈ ÔÉÏ× ÄÁÎÎÙÈ:
data D1 data D2 type S newtype N
= = = =
D1 Int D2 !Int Int N Int
d1 (D1 i) d2 (D2 i) s i n (N i)
= = = =
42 42 42 42
ðÒÉ ÔÁËÉÈ ÏÒÅÄÅÌÅÎÉÑÈ ÔÉÏ× É ÆÕÎË ÉÊ, ×ÙÒÁÖÅÎÉÑ (d1 ?), (d2 ?), (d2 (D2 ?)) ÜË×É×ÁÌÅÎÔÎÙ ?, × ÔÏ ×ÒÅÍÑ ËÁË (n ?), (n (N ?)), (d1 (D1 ?)) É (s ?) ÜË×É×ÁÌÅÎÔÎÙ 42. ÷ ÞÁÓÔÎÏÓÔÉ (N ?) ÜË×É×ÁÌÅÎÔÎÏ ?, Á (D1 ?) ÎÅ ÜË×É×ÁÌÅÎÔÎÏ ?. îÁÏÍÎÉÍ, ÞÔÏ ÎÅÏÒÅÄÅÌÅÎÎÏÅ ÚÎÁÞÅÎÉÅ ? × ÑÚÙËÅ Haskell ÚÁÄÁÅÔÓÑ Ó ÏÍÏÝØÀ ÆÕÎË ÉÉ error ÉÌÉ undefined. ÷ÙÏÌÎÉÔÅ ÎÅÓËÏÌØËÏ ×ÙÚÏ×Ï× ÏÒÅÄÅÌÅÎÎÙÈ ×ÙÛÅ ÆÕÎË ÉÊ Ó ÒÁÚÌÉÞÎÙÍÉ ÁÒÇÕÍÅÎÔÁÍÉ, ÏÓÌÅ ÞÅÇÏ ÏÂßÑÓÎÉÔÅ ÏÓÏÂÅÎÎÏÓÔÉ ÉÈ Ï×ÅÄÅÎÉÑ:
---> d1 (undefined) Program error: {undefined} ---> d1 (D1 undefined)
H
VII. Haskell ËÁË ÑÚÙË ïïð
204
42 ---> d2 (undefined) Program error: {undefined} ---> d2 (D2 undefined) Program error: {undefined} ---> s (undefined) 42 ---> n (undefined) 42 ---> n (N undefined) 42
J
÷ÏÒÏÓÙ É ÚÁÄÁÎÉÑ VII.3.1
ðÒÅÄÏÌÏÖÉÍ, ÍÙ ÈÏÔÉÍ ÓÞÉÔÁÔØ Ä×Á ÒÁÓÓÔÏÑÎÉÑ ÒÁ×ÎÙÍÉ, ÅÓÌÉ ÏÎÉ ÏÔÌÉÞÁÀÔÓÑ ÍÅÎÅÅ ÞÅÍ ÎÁ 10 ËÍ. íÏÖÎÏ ÌÉ ÏÒÅÄÅÌÉÔØ ÔÅÓÔ ÎÁ ÒÁ×ÅÎÓÔ×Ï ÄÌÑ Distan e, ÅÓÌÉ Distan e ÅÓÔØ ÔÉ-ÓÉÎÏÎÉÍ? åÓÌÉ ÄÁ, ÔÏ ÞÔÏ ÍÏÖÎÏ ÎÁÚ×ÁÔØ ÏÅÒÁ ÉÅÊ (==)? VII.3.2
ðÅÒÅÉÛÉÔÅ ÏÒÅÄÅÌÅÎÉÅ ÆÕÎË ÉÉ alalyse, ÏÒÅÄÅÌÅÎÎÏÊ ÎÁ ÓÔÒ. 180 ÔÁË, ÞÔÏÂÙ ÓÌÕÞÁÉ ÁÎÁÌÉÚÁ ÎÅ ÚÁ×ÉÓÅÌÉ ÏÔ ÏÒÑÄËÁ, × ËÏ ÔÏÒÏÍ ÏÎÉ ÄÁÀÔÓÑ. VII.3.3
H
ïÒÅÄÅÌÉÔÅ ÆÕÎË ÉÀ group, ÏÂßÑ×ÌÅÎÎÕÀ ËÁË
group
:: Int -> [a℄ ->[[a℄℄
üÔÁ ÆÕÎË ÉÑ ÒÁÚÄÅÌÑÅÔ ÄÁÎÎÙÊ ÓÉÓÏË ÎÁ ÏÄÓÉÓËÉ (ÏÍÅÝÁÑ ÉÈ × ÒÅÚÕÌØÔÉÒÕÀÝÉÊ ÓÉÓÏË), ÇÄÅ ×ÓÅ ÏÄÓÉÓËÉ ÉÍÅÀÔ ÚÁÄÁÎÎÕÀ ÄÌÉÎÕ. ÏÌØËÏ ÏÓÌÅÄÎÉÊ ÏÄÓÉÓÏË ÍÏÖÅÔ ÉÍÅÔØ ÄÌÉÎÕ ÍÅÎØÛÕÀ ÚÁÄÁÎÎÏÊ. îÁÒÉÍÅÒ,
---> group [3 [1 .. 11℄ [ [1, 2, 3℄, [4, 5, 6℄, [7, 8, 9℄, [10, 11℄℄
3. áÌÇÅÂÒÁÉÞÅÓËÉÅ ÔÉÙ ÄÁÎÎÙÈ
205
VII.3.4
ðÒÅÄÏÌÏÖÉÍ, ÞÔÏ ÄÁÔÁ ÚÁÄÁÅÔÓÑ ÔÒÏÊËÏÊ (d, m, y), ÇÄÅ d, m É y ÞÉÓÌÁ ÔÉÁ Int, ÚÁÄÁÀÝÉÅ ÓÏÏÔ×ÅÔÓÔ×ÅÎÎÏ ÄÅÎØ, ÍÅÓÑ É ÇÏÄ. äÁÊÔÅ ÏÒÅÄÅÌÅÎÉÅ ÆÕÎË ÉÉ showDate, ÂÅÒÕÝÅÊ ÄÁÔÕ É ÅÞÁÔÁÀÝÕÀ ÅÅ × ×ÉÄÅ ÁÎÁÌÏÇÉÞÎÏÍ ÒÉ×ÅÄÅÎÎÏÍÕ:
---> putStr(showDate (10, 11, 2002)) 10 ÎÏÑÂÒÑ 2002 ÇÏÄÁ VII.3.5
îÁÉÛÉÔÅ ÞÅÔÙÒÅ ÁÒÉÆÍÅÔÉÞÅÓËÉÈ ÆÕÎË ÉÉ ÄÌÑ ÒÁÂÏÔÙ Ó ËÏÍ ÌÅËÓÎÙÍÉ ÞÉÓÌÁÍÉ. ëÏÍÌÅËÓÎÙÅ ÞÉÓÌÁ ÜÔÏ ÞÉÓÌÁ, ÒÅÄÓÔÁ×É ÍÙÅ × ×ÉÄÅ a + bi, ÇÄÅ a É b ÅÓÔØ ÄÅÊÓÔ×ÉÔÅÌØÎÙÅ ÞÉÓÌÁ, Á i ÍÎÉÍÁÑ ÅÄÉÎÉ Á, ÕÄÏ×ÌÅÔ×ÏÒÑÀÝÁÑ ÕÒÁ×ÎÅÎÉÀ i2 = 1. óÏ×ÅÔ: ÎÁÊÄÉÔÅ ÆÏÒÍÕÌÕ ÄÌÑ ×ÙÞÉÓÌÅÎÉÑ 1=(a + bi), ÒÅÛÁÑ ÕÒÁ×ÎÅÎÉÅ (a + bi) (x + iy ) = (1 + 0i) ÏÔÎÏÓÉÔÅÌØÎÏ x É y . VII.3.6
ðÕÓÔØ ÄÅÒÅ×Ï ÚÁÄÁÅÔÓÑ ÓÌÅÄÕÀÝÉÍ ÏÂßÑ×ÌÅÎÉÅÍ ÔÉÁ:
data Tree' = Empty | Leaf Int | Node Tree' Int Tree' deriving (Show) ÷ ÔÁÂÌÉ Å ÒÉ×ÅÄÅÎÏ ÎÅÓËÏÌØËÏ ÒÉÍÅÒÏ× ÄÅÒÅ×ØÅ× ÄÁÎÎÏÇÏ ÔÉÁ.
t1
t2
t3
t4
16
4
14 4 1
20 8
15
úÄÅÓØ t1 ÕÓÔÏÅ ÄÅÒÅ×Ï, t2 ÄÅÒÅ×Ï Ó ÅÄÉÎÓÔ×ÅÎÎÙÍ ÜÌÅÍÅÎÔÏÍ (ÌÉÓÔÏÍ), ÉÍÅÀÝÉÍ ÔÉ Int, t3 É t4 ÒÉÍÅÒÙ ÍÎÏÇÏÕÒÏ×ÎÅ×ÙÈ ÄÅÒÅ×ØÅ×, ÏÓÔÒÏÅÎÎÙÈ ÉÚ ×ÎÕÔÒÅÎÎÉÈ ×ÅÒÛÉÎ, ×ÅÒÛÉÎ-ÌÉÓÔØÅ× É ÕÓÔÙÈ ÄÅÒÅ×ØÅ×. ëÁÖÄÁÑ ×ÎÕÔÒÅÎÎÑÑ ×ÅÒÛÉÎÁ ÓÏÄÅÒÖÉÔ ÞÉÓÌÏ É Ä×Á ÏÄÄÅÒÅ×Á. ðÅÒ×ÙÅ ÔÒÉ ÄÅÒÅ×Á ÚÁÄÁÎÙ ÏÒÅÄÅÌÅÎÉÑÍÉ:
t1, t2, t3 :: Tree' t1 = Empty t2 = Leaf 16 t3 = Node Empty 4 Empty
H
206
VII. Haskell ËÁË ÑÚÙË ïïð
ðÒÉ×ÅÄÉÔÅ ×ÙÒÁÖÅÎÉÅ, ÏÉÓÙ×ÁÀÝÅÅ ÄÅÒÅ×Ï t4. VII.3.7
äÌÑ ÄÅÒÅ×Á ÏÉÓËÁ ÉÚ ÒÅÄÙÄÕÝÅÇÏ ÚÁÄÁÎÉÑ ÎÁÉÛÉÔÅ ÒÏÇÒÁÍÍÕ, ÓÏÄÅÒÖÁÝÕÀ ÆÕÎË ÉÉ ×ÓÔÁ×ËÉ É ÕÄÁÌÅÎÉÑ ÜÌÅÍÅÎÔÏ× × ÄÅÒÅ×Ï. VII.3.8
ðÅÒÅÉÛÉÔÅ ÆÕÎË ÉÀ ÓÏÒÔÉÒÏ×ËÉ Ó ÏÍÏÝØÀ ÄÅÒÅ×Á ÔÁËÉÍ ÏÂÒÁ ÚÏÍ, ÞÔÏÂÙ ÏÎÁ ÉÓÏÌØÚÏ×ÁÌÁ ÄÅÒÅ×Ï ÔÉÁ Tree'. VII.3.9
äÁÎÏ ÄÅÒÅ×Ï ÓÌÅÄÕÀÝÅÇÏ ÔÉÁ:
data Tree'' a = Leaf a | Node'' (Tree'' a) (Tree'' a) îÁÉÛÉÔÅ ÆÕÎË ÉÉ mapTree É foldTree, ÏÒÅÄÅÌÅÎÎÙÅ ÎÁ ÔÉÅ Tree, É ÁÎÁÌÏÇÉÞÎÙÅ ÆÕÎË ÉÑÍ map É fold, ÚÁÄÁÎÎÙÍ ÎÁ ÓÉÓËÁÈ. ïÂÑÚÁÔÅÌØÎÏ ÕËÁÖÉÔÅ ÔÉ ËÁÖÄÏÊ ÆÕÎË ÉÉ. VII.3.10
òÁÓÓÍÏÔÒÉÍ ÏÂßÑ×ÌÅÎÉÅ
data Jane = MkJane Int newtype Di k = MkDi k Int äÁÊÔÅ ÏÄÈÏÄÑÝÉÅ ÏÒÅÄÅÌÅÎÉÑ ÆÕÎË ÉÊ, ÄÅÍÏÎÓÔÒÉÒÕÀÝÉÈ, ÞÔÏ ÔÉÙ Jane É Di k ÏÔÌÉÞÁÀÔÓÑ ÄÒÕÇ ÏÔ ÄÒÕÇÁ.
4. ðÒÉÍÅÒÙ ÓÔÒÕËÔÕÒÉÒÏ×ÁÎÎÙÈ ÔÉÏ× ÄÁÎÎÙÈ 4.1. É Angle òÁÎÅÅ (ÓÔÒ. 156) ÍÙ ××ÅÌÉ ÔÉ-ÓÉÎÏÎÉÍ Angle ÄÌÑ ÏÂÏÚÎÁÞÅÎÉÑ ÕÇÌÁ Ï×ÏÒÏÔÁ ÎÁ ÌÏÓËÏÓÔÉ. ÁË ËÁË ÓÉÎÏÎÉÍ ÎÅ ÓÏÚÄÁÅÔ ÎÏ×ÙÈ ÔÉÏ×, ÏÎ ÕÎÁÓÌÅÄÕÅÔ ×ÓÅ Ó×ÏÊÓÔ×Á ÏÓÎÏ×ÎÏÇÏ ÔÉÁ. ðÏÜÔÏÍÕ ÓÍÙÓÌ ÏÅÒÁÔÏÒÁ == ÄÌÑ ×ÅÌÉÞÉÎ ÔÉÁ Angle ÔÏÔ ÖÅ, ÞÔÏ É ÄÌÑ ×ÅÌÉÞÉÎ ÔÉÁ Float. îÁ ÒÁËÔÉËÅ ÍÏÖÅÔ ÏÔÒÅÂÏ×ÁÔØÓÑ ×ÌÏÖÉÔØ ÄÒÕÇÏÊ ÓÍÙÓÌ × ÔÏÔ ÉÌÉ ÉÎÏÊ ÏÅÒÁÔÏÒ ÉÌÉ ÆÕÎË ÉÀ, ÏÒÅÄÅÌÅÎÎÕÀ ÎÁ ÎÏ×ÏÍ ÔÉÅ. îÁÒÉÍÅÒ, ÅÓÔÅÓÔ×ÅÎÎÏ ÏÂßÑ×ÉÔØ ÒÁ×ÅÎÓÔ×Ï ÎÁ ÍÎÏÖÅ ÓÔ×Å ÕÇÌÏ× ÎÁ ÌÏÓËÏÓÔÉ ËÁË ÒÁ×ÅÎÓÔ×Ï Ï ÍÏÄÕÌÀ ÞÉÓÌÁ 2 (Ä×Á ÕÇÌÁ ÒÁ×ÎÙ ÍÅÖÄÕ ÓÏÂÏÊ, ÅÓÌÉ ÉÈ ÒÁÚÎÏÓÔØ ËÒÁÔÎÁ 2 ). ëÏÎÅÞÎÏ,
4. ðÒÉÍÅÒÙ ÓÔÒÕËÔÕÒÉÒÏ×ÁÎÎÙÈ ÔÉÏ× ÄÁÎÎÙÈ
207
ÍÏÖÎÏ ÂÙÌÏ ÂÙ ××ÅÓÔÉ ÓÅ ÉÁÌØÎÕÀ ÆÕÎË ÉÀ ÄÌÑ ÒÏ×ÅÒËÉ ÎÁ ÒÁ ×ÅÎÓÔ×Ï Ä×ÕÈ ÕÇÌÏ×, ÕÞÉÔÙ×ÁÀÝÕÀ ÏÔÍÅÞÅÎÎÏÅ Ó×ÏÊÓÔ×Ï ÕÇÌÏ×, ÎÏ ÅÓÌÉ ÎÁÍ ÈÏÞÅÔÓÑ ÉÓÏÌØÚÏ×ÁÔØ ÉÍÅÎÎÏ ÏÅÒÁÔÏÒ ==, ÔÏ ÍÙ ÄÏÌÖÎÙ ÏÂßÑ×ÉÔØ Angle ËÁË ÎÏ×ÙÊ ÔÉ ÄÁÎÎÙÈ, Á ÎÅ ËÁË ÔÉ-ÓÉÎÏÎÉÍ:
data Angle = MkAngle Float
instan e Eq Angle where MkAngle x == MkAngle y = normalise x == normalise y normalise :: Float -> Float normalise x | x < 0 = normalise (x +rot) | x >= rot = normalise (x-rot) | otherwise = x where rot = 2*pi ÷ÓÏÍÏÇÁÔÅÌØÎÁÑ ÆÕÎË ÉÑ normalise, ÉÓÏÌØÚÕÅÍÁÑ × ÜÔÏÍ ÏÒÅ ÄÅÌÅÎÉÉ, ×ÏÚ×ÒÁÝÁÅÔ ÕÇÏÌ × ÄÉÁÁÚÏÎÅ ÏÔ 0 ÄÏ 2 . ðÌÁÔÏÊ ÚÁ ÒÉÍÅÎÅÎÉÅ ÔÁËÏÇÏ ÏÒÅÄÅÌÅÎÉÑ ÒÁ×ÅÎÓÔ×Á ÕÇÌÏ×, Ñ×ÌÑÅÔÓÑ ÔÏ, ÞÔÏ ÜÌÅÍÅÎÔÙ Angle ÔÅÅÒØ ÉÍÅÀÔ ¾ÓÕÅÒÏÂÌÏÖËÕ¿ × ÌÉ Å ËÏÎÓÔÒÕËÔÏÒÁ ÄÁÎÎÙÈ MkAngle.
---> MkAngle (-pi) == MkAngle pi True ---> MkAngle 0 == MkAngle (2*pi) True ---> MkAngle pi == MkAngle (2*pi) False õ ÜÔÏÇÏ ÓÏÓÏÂÁ ÏÒÅÄÅÌÅÎÉÑ ÔÉÁ Angle ÅÓÔØ Ä×Á ÎÅÄÏÓÔÁÔËÁ. ðÅÒ×ÙÍ ÉÚ ÎÉÈ Ñ×ÌÑÅÔÓÑ ÔÏ, ÞÔÏ ÏÅÒÁ ÉÉ ÓÏÚÄÁÎÉÑ É ÉÓÏÌØÚÏ×Á ÎÉÑ ÕÇÌÏ×, ×ÓÌÅÄÓÔ×ÉÅ ÌÅÎÉ×ÏÓÔÉ ËÏÎÓÔÒÕËÔÏÒÁ ÔÉÏ× data, ÔÒÅÂÕ ÀÔ ÏÓÔÏÑÎÎÏÇÏ ¾ÚÁ×ÏÒÁÞÉ×ÁÎÉÑ¿ É ¾ÅÒÅÚÁ×ÏÒÁÞÉ×ÁÎÉÑ¿ ÄÁÎÎÙÈ. ÷ÓÅ ÜÔÏ ÔÒÅÂÕÅÔ ÒÉ×ÏÄÉÔ Ë ÄÏÏÌÎÉÔÅÌØÎÙÍ ÚÁÔÒÁÔÁÍ ÁÍÑÔÉ É ×ÒÅÍÅÎÉ ÒÉ ÒÁÂÏÔÅ Ó ÏÄÏÂÎÙÍ ÏÂÒÁÚÏÍ ÏÒÅÄÅÌÅÎÎÙÍÉ ×ÅÌÉÞÉÎÁ ÍÉ. ÷Ï ×ÔÏÒÙÈ, ÏÂßÑ×ÌÑÑ ÎÏ×ÙÊ ÔÉ ÄÁÎÎÙÈ, ÍÙ ÔÁËÖÅ ÏÂßÑ×ÌÑÅÍ ×ÏÚÍÏÖÎÏ ÎÅÖÅÌÁÔÅÌØÎÙÅ ÜÌÅÍÅÎÔÙ, ÎÁÒÉÍÅÒ, MkAngle ? ÔÁËÖÅ Ñ×ÌÑÅÔÓÑ ×ÅÌÉÞÉÎÏÊ ÔÉÁ Angle. äÒÕÇÉÍÉ ÓÌÏ×ÁÍÉ, ÔÉÙ Angle É Float ÕÖÅ . ëÁË ÕÖÅ ÏÔÍÅÞÁÌÏÓØ, ÏÓÏÚÎÁ×ÁÑ ÜÔÏ, Haskell ÏÂÅÓÅÞÉ×ÁÅÔ ÁÌØ ÔÅÒÎÁÔÉ×ÎÙÊ ÍÅÈÁÎÉÚÍ ÓÏÚÄÁÎÉÑ ÎÏ×ÏÇÏ ÔÉÁ, ÏÌÎÏÓÔØÀ ÉÚÏÍÏÒÆ ÎÏÇÏ ÕÖÅ ÓÕÝÅÓÔ×ÕÀÝÅÍÕ. ïÂßÑ×ÌÅÎÉÅ
H
ÎÅ ÉÚÏÍÏÒÆÎÙ
newtype Angle = MkAngle Float
VII. Haskell ËÁË ÑÚÙË ïïð
208
ÔÏÞÎÏ ÓÏÏÔ×ÅÔÓÔ×ÕÅÔ
××ÏÄÉÔ Angle ËÁË ÎÏ×ÙÊ ÔÉ, ÞÅÊ ÏÂÒÁÚ ÔÉ Õ Float. ïÔÌÉÞÉÅ ÔÁËÏÇÏ ÏÂßÑ×ÌÅÎÉÑ ÏÔ ÔÉÁ-ÓÉÎÏÎÉÍÁ × ÔÏÍ, ÞÔÏ ÓÏÚÄÁÅÔÓÑ ÎÏ×ÙÊ ÔÉ, É ÞÔÏ ÍÏÖÎÏ ÏÂßÑ×ÌÑÔØ ×Ù×ÅÄÅÎÎÙÅ ÉÚ ÎÅÇÏ ËÌÁÓÓÙ. ïÔÌÉÞÉÅ ÏÔ data-ÄÅËÌÁÒÁ ÉÉ ÓÏÓÔÏÉÔ, ×Ï ÅÒ×ÙÈ, × ÔÏÍ, ÞÔÏ ÍÁÎÉÕÌÑ ÉÉ Ó ×ÅÌÉÞÉÎÁÍÉ, ÏÒÅÄÅÌÅÎÎÙÍÉ Ó ÏÍÏÝØÀ ÔÁËÏ ÇÏ ËÏÎÓÔÒÕËÔÏÒÁ ÄÁÎÎÙÈ MkAngle, ÎÅ ÔÒÅÂÕÅÔ ÄÏÏÌÎÉÔÅÌØÎÏÇÏ ×ÒÅ ÍÅÎÉ. èÏÔÑ ×ÙÒÁÖÅÎÉÅ MkAngle É ÒÉÓÕÔÓÔ×ÕÅÔ × ÔÅËÓÔÅ ÒÏÇÒÁÍ ÍÙ, ÏÎÏ ÕÄÁÌÑÅÔÓÑ ÅÝÅ ÄÏ ÎÁÞÁÌÁ ×ÙÞÉÓÌÅÎÉÊ: ×ÅÌÉÞÉÎÙ ÔÁËÏÇÏ ÔÉÁ ÍÅÔÏÄÉÞÎÏ ÚÁÍÅÎÑÀÔÓÑ ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÉÍÉ ÚÎÁÞÅÎÉÑÍÉ ÂÁÚÏ ×ÏÇÏ ÔÉÁ. ÷ÔÏÒÏÅ ÏÔÌÉÞÉÅ ÓÏÓÔÏÉÔ × ÔÏÍ, ÞÔÏ MkAngle ËÏÎÓÔÒÕËÔÏÒ É MkAngle ? É ? ÏÂßÑ×ÌÑÀÔ ÏÄÎÏ É ÔÏ ÖÅ ÚÎÁÞÅÎÉÅ. óÌÅÄÏ×ÁÔÅÌØÎÏ, ÍÅÖÄÕ ×ÅÌÉÞÉÎÁÍÉ ÔÉÏ× Angle É Float ÉÍÅÅÔÓÑ ×ÚÁÉÍÎÏ ÏÄÎÏÚÎÁÞÎÏÅ ÓÏÏÔ×ÅÔÓÔ×ÉÅ.
ÓÔÒÏÇÉÊ
4.2. É Day
÷ÅÒÎÅÍÓÑ Ë ÒÁÓÓÍÏÔÒÅÎÉÀ ÔÉÁ ÄÁÎÎÙÈ Day, ××ÅÄÅÎÎÏÇÏ ÎÁ ÓÔÒ. 180 ÓÌÅÄÕÀÝÉÍ ÏÒÅÄÅÌÅÎÉÅÍ:
data Day = Sun | Mon | Tue | Wed | Thu | Fri | Sat ÷ÏÚÍÏÖÎÏ × ÒÏÇÒÁÍÍÅ ÏÔÒÅÂÕÅÔÓÑ ÓÒÁ×ÎÅÎÉÅ ÜÌÅÍÅÎÔÏ× ÔÉÁ Day, ÏÜÔÏÍÕ ÓÌÅÄÕÅÔ ÏÂßÑ×ÉÔØ, ÞÔÏ Day ÎÁÓÌÅÄÕÅÔ Ó×ÏÊÓÔ×Á ËÌÁÓÓÏ× Eq É Ord. åÓÌÉ ÍÙ ÒÅÛÉÍ ÅÒÅÏÒÅÄÅÌÑÔØ ÍÅÔÏÄÙ ÜÔÉÈ ËÌÁÓÓÏ× Ó Ï ÍÏÝØÀ ÏÂÒÁÚ Ï× ÓÏÏÔ×ÅÔÓÔ×ÉÑ, ÔÏ ÒÉÄÅÔÓÑ ÚÁÄÁÔØ ÏÞÅÎØ ÂÏÌØÛÏÅ ÞÉÓÌÏ ÕÒÁ×ÎÅÎÉÊ. ìÕÞÛÅÊ ÉÄÅÅÊ ÂÕÄÅÔ ËÏÄÉÒÏ×ÁÎÉÅ ÜÌÅÍÅÎÔÏ× ÔÉ Á Day ÅÌÙÍÉ ÞÉÓÌÁÍÉ É ÉÓÏÌØÚÏ×ÁÎÉÅ ÓÒÁ×ÎÅÎÉÑ ÅÌÙÈ ÞÉÓÅÌ. ÁË ËÁË ÏÄÏÂÎÁÑ ÉÄÅÑ ÍÏÖÅÔ ÂÙÔØ ÒÉÍÅÎÉÍÁ É Ë ÄÒÕÇÉÍ ÅÒÅ ÞÉÓÌÑÅÍÙÍ ÔÉÁÍ, ÔÏ ÚÁÍÅÔÉÍ, ÞÔÏ ÉÍÅÎÎÏ ÄÌÑ ÔÁËÉÈ ÓÉÔÕÁ ÉÊ É ××ÅÄÅÎ ËÌÁÓÓ Enum (ÓÍ. ÓÔÒ. 175), ËÏÔÏÒÙÊ ÏÉÓÙ×ÁÅÔ ÔÉÙ, ÞØÉ ÜÌÅÍÅÎÔÙ ÍÏÇÕÔ ÂÙÔØ ÅÒÅÞÉÓÌÅÎÙ. É, ÏÂßÑ×ÌÅÎÎÙÊ ËÁË ÜËÚÅÍÌÑÒ (instan e) ËÌÁÓÓÁ Enum, ÉÓ ÏÌØÚÕÅÔ ÆÕÎË ÉÉ toEnum É fromEnum ÄÌÑ ÒÅÏÂÒÁÚÏ×ÁÎÉÑ ÍÅÖÄÕ ÅÇÏ ÜÌÅÍÅÎÔÁÍÉ É ÔÉÏÍ Int. æÕÎË ÉÑ fromEnum ÄÏÌÖÎÁ ÂÙÔØ ÌÅ ×ÏÏÂÒÁÔÉÍÏÊ (left-inverse) Ï ÏÔÎÏÛÅÎÉÀ Ë toEnum, Ô. Å. ÄÌÑ ×ÓÅÈ x ÄÏÌÖÎÏ ×ÙÏÌÎÑÔØÓÑ ÓÏÏÔÎÏÛÅÎÉÅ fromEnum (toEnum x) = x. ïÒÅÄÅÌÉÍ Day ËÁË ÜËÚÅÍÌÑÒ ËÌÁÓÓÁ Enum:
instan e toEnum toEnum toEnum toEnum
Enum Day where Sun = 0 Mon = 1 Tue = 2 Wed = 3
4. ðÒÉÍÅÒÙ ÓÔÒÕËÔÕÒÉÒÏ×ÁÎÎÙÈ ÔÉÏ× ÄÁÎÎÙÈ
209
toEnum Thu = 4 toEnum Fri = 5 toEnum Sat = 6 æÕÎË ÉÑ fromEnum ÔÁËÖÅ ÚÁÄÁÅÔÓÑ ÓÅÍØÀ ÕÒÁ×ÎÅÎÉÑÍÉ. ðÏÄÏÂÎÁÑ ÉÄÅÑ ÁÓÓÏ ÉÉÒÏ×ÁÎÉÑ ÚÎÁÞÅÎÉÊ ÅÒÅÞÉÓÌÑÅÍÏÇÏ ÔÉÁ Ó ÅÌÙÍÉ ÉÓÏÌØÚÕÅÔÓÑ ÒÉ ÏÉÓÁÎÉÉ ÔÉÁ Char. æÁËÔÉÞÅÓËÉ, ÍÏÖ ÎÏ ÏÂßÑ×ÉÔØ
instan e Enum Char where toEnum = ord fromEnum = hr éÍÅÑ ÆÕÎË ÉÀ toEnum ÄÌÑ Day, ÍÙ ÍÏÖÅÍ ÏÒÅÄÅÌÉÔØ ÍÅÔÏÄÙ ÄÒÕÇÉÈ ËÌÁÓÓÏ×:
instan e Eq Day where x == y = toEnum x == toEnum y instan e Ord Day where x < y = toEnum x < toEnum y îÁÏÍÎÉÍ, ÞÔÏ Haskell ÏÚ×ÏÌÑÅÔ ÉÓÏÌØÚÏ×ÁÔØ ÂÏÌÅÅ ÕÄÏÂÎÕÀ ÆÏÒÍÕ ÏÂßÑ×ÌÅÎÉÑ ÔÉÁ ÎÁÓÌÅÄÕÀÝÅÇÏ Ó×ÏÊÓÔ×Á ÔÏÇÏ ÉÌÉ ÉÎÏÇÏ ËÌÁÓÓÁ: ×ÍÅÓÔÏ ÄÅËÌÁÒÁ ÉÉ instan e, × ËÏÔÏÒÏÊ ÅÒÅÇÒÕÖÁÀÔÓÑ ÍÅÔÏÄÙ ÎÅËÏÔÏÒÏÇÏ ËÌÁÓÓÁ, ÍÏÖÎÏ ÏÂßÑ×ÉÔØ ÔÉ, ÕËÁÚÁ× ÒÉ ÜÔÏÍ, ÞÔÏ ÏÎ (deriving ÎÁÓÌÅÄÏ×ÁÎÉÅ) Ó×ÏÊÓÔ×Á ÕËÁÚÁÎÎÏÇÏ ËÌÁÓÓÁ. ÁË ÍÏÖÎÏ ÚÁÉÓÁÔØ
ÎÁÓÌÅÄÕÅÔ
data Day = Sun | Mon | Tue | Wed | Thu | Fri | Sat deriving (Eq, Ord, Enum, Show) ðÕÎËÔ deriving ÓÌÕÖÉÔ ÄÌÑ ÇÅÎÅÒÁ ÉÉ ÏÄËÌÁÓÓÁ ÅÒÅÞÉÓÌÅÎÎÙÈ ËÌÁÓÓÏ× Á×ÔÏÍÁÔÉÞÅÓËÉ, ÎÏ ÜÔÉ ËÌÁÓÓÙ ÄÏÌÖÎÙ ÂÙÔØ ÏÉÓÁÎÙ ÒÁ ÎÅÅ. á×ÔÏÍÁÔÉÞÅÓËÏÅ ÎÁÓÌÅÄÏ×ÁÎÉÅ ÏÄËÌÁÓÓÁ ÄÌÑ Enum ×ÏÚÍÏÖÎÏ ÔÏÌØËÏ ÄÌÑ ÔÉÏ× ÄÁÎÎÙÈ, ËÏÔÏÒÙÅ ÏÂßÑ×ÌÑÀÔÓÑ Ñ×ÎÙÍ ÓÉÓËÏÍ ÉÈ ×ÅÌÉÞÉÎ, ÒÉÞÅÍ ÏÒÑÄÏË ÓÌÅÄÏ×ÁÎÉÑ ÉÈ ËÏÎÓÔÒÕËÔÏÒÏ× × ÏÂß Ñ×ÌÅÎÉÉ ÚÁÄÁÅÔ ÏÔÎÏÛÅÎÉÅ ÏÒÑÄËÁ ÎÁ ÜÌÅÍÅÎÔÁÈ ÜÔÏÇÏ ÔÉÁ. ÅÅÒØ × ÆÕÎË ÉÑÈ ÄÌÑ ÒÁÂÏÔÙ Ó ÄÎÑÍÉ ÎÅÄÅÌÉ ÍÏÖÎÏ ÉÓÏÌØ ÚÏ×ÁÔØ ÔÉ Day:
workday workday restday restday
:: Day -> Bool d = (Mon <= d) && (d <= Fri) :: Day -> Bool d = (d == Sat) || (d == Sun)
äÌÑ ÏÒÅÄÅÌÅÎÉÑ ÆÕÎË ÉÉ dayAfter, ×ÙÄÁÀÝÕÀ ÄÅÎØ, ÓÌÅÄÕÀ ÝÉÊ ÚÁ ÔÅËÕÝÉÍ, ÉÓÏÌØÚÕÅÍ ÆÕÎË ÉÉ toEnum É fromEnum:
210
VII. Haskell ËÁË ÑÚÙË ïïð
dayAfter :: Day -> Day dayAfter d = fromEnum (toEnum d + 1) `mod` 7 ÷ ÞÁÓÔÎÏÓÔÉ, dayAfter Sat = Sun.
I õÒÁÖÎÅÎÉÅ VII.4.1
ïÒÅÄÅÌÉÔÅ ÔÉ Day, ÉÓÏÌØÚÕÑ Á×ÔÏÍÁÔÉÞÅÓËÕÀ ÇÅÎÅÒÁ ÉÀ ÏÄ ËÌÁÓÓÏ×, É ÆÕÎË ÉÉ ÄÌÑ ÒÁÂÏÔÙ Ó ÎÉÍ:
data Day = Sun | Mon | Tue | Wed | Thu | Fri | Sat deriving (Eq, Ord, Enum, Show) workday :: Day -> Bool workday d = (Mon <= d) && (d <= Fri) restday :: Day -> Bool restday d = (d == Sat) || (d == Sun) dayAfter :: Day -> Day dayAfter d = toEnum ((fromEnum d + 1) `mod` 7) ÷ÙÚÏ×ÉÔÅ ÏÒÅÄÅÌÅÎÎÙÅ ×ÙÛÅ ÆÕÎË ÉÉ É ÒÏ×ÅÒØÔÅ, ËÁË ×ÙÏÌÎÑ ÀÔÓÑ ÎÁ ÜÌÅÍÅÎÔÁÈ ÄÁÎÎÏÇÏ ÔÉÁ ÏÔÎÏÛÅÎÉÑ ÒÁ×ÅÎÓÔ×Á É ÏÒÑÄËÁ:
H
---> dayAfter Sat Sun ---> restday Sat True ---> workday Sat False ---> Sat < Mon False ---> Wed == Wed True ---> Wed == Fri False ó ÄÒÕÇÏÊ ÓÔÏÒÏÎÙ, ÕÎÁÓÌÅÄÏ×ÁÎÎÏÅ ÏÒÅÄÅÌÅÎÉÅ ÍÏÖÅÔ ÂÙÔØ ÎÅ ÓÏ×ÓÅÍ ÔÁËÉÍ, ËÁË ÎÁÍ ÈÏÞÅÔÓÑ. îÁÒÉÍÅÒ, ÍÏÖÅÔ ×ÏÚÎÉËÎÕÔØ ÔÒÅÂÏ×ÁÎÉÅ Ï ÓÅ ÉÆÉÞÅÓËÏÍ ×ÉÄÅ ÅÞÁÔÉ ÔÅÈ ÉÌÉ ÉÎÙÈ ÄÁÎÎÙÈ ÔÉÁ, ×Ù×ÅÄÅÎÎÏÇÏ ÉÚ ËÌÁÓÓÁ Show, Ô. Å. ÏÔÒÅÂÕÅÔÓÑ ÄÒÕÇÏÅ ×ÉÄÉ ÍÏÅ ÒÅÄÓÔÁ×ÌÅÎÉÅ ÜÌÅÍÅÎÔÏ×, ÏÔÌÉÞÎÏÅ ÏÔ ÔÏÇÏ, ÞÔÏ ÓÌÅÄÕÅÔ ÉÚ
4. ðÒÉÍÅÒÙ ÓÔÒÕËÔÕÒÉÒÏ×ÁÎÎÙÈ ÔÉÏ× ÄÁÎÎÙÈ
211
ÎÁÓÌÅÄÕÅÍÏÇÏ ÏÒÅÄÅÌÅÎÉÑ. ÷ ÏÄÏÂÎÙÈ ÓÉÔÕÁ ÉÑÈ ÒÉÄÅÔÓÑ ÄÁÔØ Ñ×ÎÏ ÏÂßÑ×ÌÅÎÉÅ ÔÉÁ ËÁË ÜËÚÅÍÌÑÒÁ ÔÏÇÏ ÉÌÉ ÉÎÏÇÏ ËÌÁÓÓÁ instan e-ÄÅËÌÁÒÁ ÉÀ. é, ÎÁËÏÎÅ , ÅÓÌÉ ÏÔÒÅÂÕÅÔÓÑ ÒÁÚÒÁÂÏÔÁÔØ ÏÓÏÂÙÊ ÓÏÓÏ ÅÞÁÔÉ ÜÌÅÍÅÎÔÏ× ËÁËÏÇÏ-ÔÏ ÔÉÁ ÄÁÎÎÙÈ, ÔÏ ×ÓÅÇÄÁ ÍÏÖÎÏ ÎÁÉÓÁÔØ ÓÅ ÉÁÌØÎÕÀ ÆÕÎË ÉÀ ÄÌÑ ÜÔÏÇÏ ÓÌÕÞÁÑ. íÙ ÎÅ ÏÂÑÚÁÎÙ ÉÓÏÌØÚÏ×ÁÔØ ÆÕÎË ÉÀ show. ðÒÏÉÌÌÀÓÔÒÉÒÕÅÍ ÜÔÕ ×ÏÚ ÍÏÖÎÏÓÔØ ÒÉÍÅÒÏÍ. ðÕÓÔØ ÄÁÎ ÔÉ
data Data = Pair Bool Int deriving (Show) åÓÌÉ ÎÕÖÎÏ ÎÁÅÞÁÔÁÔØ ×ÅÌÉÞÉÎÙ ÔÉÁ Data, ÔÏ ÎÁÓÌÅÄÕÅÍÏÅ ÉÚ Show ÏÒÅÄÅÌÅÎÉÅ ÄÁÅÔ ÓÌÅÄÕÀÝÅÅ
---> Pair True (3+4) Pair True 7 îÏ ÎÉÞÔÏ ÎÅ ÍÅÛÁÅÔ ××ÅÓÔÉ ÆÕÎË ÉÀ showData, ÒÅÄÎÁÚÎÁÞÅÎÎÕÀ ÄÌÑ ÅÞÁÔÉ ×ÅÌÉÞÉÎ ÔÉÁ Data:
showData :: Data -> String showData (Pair b n) = if b then "+" ++ show n else "-" ++ show n putData = putStr . showData îÁÒÉÍÅÒ,
---> putData (Pair True (3+4)) +7 ---> putData (Pair False (3*4)) -12
H
H
÷ ÏÒÅÄÅÌÅÎÉÉ showData ÆÕÎË ÉÑ show ÉÓÏÌØÚÕÅÔÓÑ ÄÌÑ Int, ÎÏ ÎÅ ÄÌÑ Data.
4.3. ÷ÅËÔÏÒÁ É ÍÁÔÒÉ Ù ÷ ÜÔÏÍ ÒÁÚÄÅÌÅ ÍÙ ÎÁÏÍÎÉÍ ÎÅËÏÔÏÒÙÅ ÏÎÑÔÉÑ ×ÅËÔÏÒÎÏÊ ÁÌ ÇÅÂÒÙ É Õ×ÉÄÉÍ ËÁË ÍÏÖÎÏ ÓÍÏÄÅÌÉÒÏ×ÁÔØ ÏÅÒÁ ÉÉ Ó ÍÁÔÒÉ ÁÍÉ Ó ÏÍÏÝØÀ ÔÉÏ× ÑÚÙËÁ Haskell. ïÂÏÂÝÅÎÉÅÍ ÏÄÎÏÍÅÒÎÏÊ ÌÉÎÉÉ, Ä×ÕÍÅÒÎÏÊ ÌÏÓËÏÓÔÉ É ÔÒÅÈ ÍÅÒÎÏÇÏ ÒÏÓÔÒÁÎÓÔ×Á Ñ×ÌÑÅÔÓÑ n-ÍÅÒÎÏÅ ÒÏÓÔÒÁÎÓÔ×Ï, ÇÄÅ ËÁ ÖÄÁÑ ÔÏÞËÁ ÚÁÄÁÅÔÓÑ Ó ÏÍÏÝØÀ n ËÏÏÒÄÉÎÁÔ. áÎÁÌÏÇÉÞÎÏ ÏÒÅÄÅ ÌÑÅÔÓÑ n-ÍÅÒÎÙÊ ×ÅËÔÏÒ. äÌÑ ÚÁÄÁÎÉÑ ÏÄÏÂÎÙÈ ÏÂßÅËÔÏ× ÍÏÖÎÏ ÉÓÏÌØÚÏ×ÁÔØ ÔÉ-ÓÉÎÏÎÉÍ Ve tor:
type Ve tor = [Float℄
VII. Haskell ËÁË ÑÚÙË ïïð
212
ëÏÌÉÞÅÓÔ×Ï ÜÌÅÍÅÎÔÏ× × ÔÁËÏÍ ÓÉÓËÅ ÏÒÅÄÅÌÑÅÔ ÒÁÚÍÅÒÎÏÓÔØ ÒÏ ÓÔÒÁÎÓÔ×Á. äÌÑ ÔÏÇÏ ÞÔÏÂÙ ÏÔÌÉÞÁÔØ ÏÄÏÂÎÙÊ ÏÂßÅËÔ ÏÔ ÄÒÕÇÉÈ ÓÉÓËÏ×, ÓÏÄÅÒÖÁÝÉÈ ÞÉÓÌÁ ÔÉÁ Float, ÌÕÞÛÅ ÏÒÅÄÅÌÉÔØ ÎÏ×ÙÊ ÔÉ ÄÁÎÎÙÈ ÒÉ ÏÍÏÝÉ ÄÅËÌÁÒÁ ÉÉ data:
data Ve tor = Ve [Float℄ úÄÅÓØ ËÏÎÓÔÒÕËÔÏÒ ÄÁÎÎÙÈ Ve ÒÅÏÂÒÁÚÕÅÔ ÓÉÓÏË ÞÉÓÅÌ × ×ÅÌÉ ÞÉÎÕ ÔÉÁ Ve tor. áÎÁÌÏÇÉÞÎÏ, ÔÏÞËÕ × n-ÍÅÒÎÏÍ ÒÏÓÔÒÁÎÓÔ×Å ÍÏÖÎÏ ÏÒÅÄÅÌÉÔØ ËÁË ×ÅËÔÏÒ, ÓÏÅÄÉÎÑÀÝÉÊ ÅÅ Ó ÎÁÞÁÌÏÍ ËÏÏÒÄÉ ÎÁÔ ×ÅÄØ ×ÓÅ ËÏÏÒÄÉÎÁÔÙ ÔÏÞËÉ É ÔÁËÏÇÏ ×ÅËÔÏÒÁ ÒÁ×ÎÙ. ïÄÎÏÊ ÉÚ ÏÓÎÏ×ÎÙÈ ÆÕÎË ÉÊ ÎÁ ÍÎÏÖÅÓÔ×Å ×ÅËÔÏÒÏ× Ñ×ÌÑÅÔÓÑ ÆÕÎË ÉÑ, ÏÒÅÄÅÌÑÀÝÁÑ ÄÌÉÎÕ ×ÅËÔÏÒÁ (ÉÌÉ ÒÁÓÓÔÏÑÎÉÅ ÏÔ ÔÏÞËÉ Ó ÔÅÍÉ ÖÅ ËÏÏÒÄÉÎÁÔÁÍÉ, ÞÔÏ É Õ ×ÅËÔÏÒÁ, ÄÏ ÎÁÞÁÌÁ ËÏÏÒÄÉÎÁÔ):
ve Length :: Ve tor -> Float äÌÑ Ä×ÕÈ ×ÅËÔÏÒÏ× (ÏÄÎÏÊ ÒÁÚÍÅÒÎÏÓÔÉ) ÍÏÖÎÏ ×ÙÑÓÎÉÔØ, ÅÒÅÎ ÄÉËÕÌÑÒÎÙ ÌÉ ÏÎÉ, ÉÌÉ ÎÁÊÔÉ ÕÇÏÌ ÍÅÖÄÕ ÎÉÍÉ:
ve Perpendi ular :: Ve tor -> Ve tor -> Bool ve Angle :: Ve tor -> Ve tor -> Float ÷ÅËÔÏÒ ÍÏÖÅÔ ÂÙÔØ ÕÍÎÏÖÅÎ ÎÁ ÞÉÓÌÏ (ÞÔÏ Ó×ÏÄÉÔÓÑ Ë ÕÍÎÏÖÅÎÉÀ ÎÁ ÜÔÏ ÞÉÓÌÏ ×ÓÅÈ ÅÇÏ ËÏÏÒÄÉÎÁÔ), Ä×Á ×ÅËÔÏÒÁ ÍÏÖÎÏ ÓÌÏÖÉÔØ:
ve S ale :: Float -> Ve tor -> Ve tor ve Plus :: Ve tor -> Ve tor -> Ve tor äÁÌÅÅ ÍÙ ÒÉ×ÅÄÅÍ ÏÒÅÄÅÌÅÎÉÑ ÜÔÉÈ ÆÕÎË ÉÊ. óÅÊÞÁÓ ÌÉÛØ ÄÁ ÄÉÍ ÉÈ ËÒÁÔËÏÅ ÏÉÓÁÎÉÅ:
ve S ale: ÏÌÕÞÅÎÉÅ ËÏÌÌÉÎÅÁÒÎÏÇÏ ×ÅËÔÏÒÁ, ÌÅÖÁÝÅÇÏ ÎÁ ÔÏÊ
ÖÅ ÒÑÍÏÊ, ÎÏ ÄÅÆÏÒÍÉÒÏ×ÁÎÎÏÇÏ × ÚÁ×ÉÓÉÍÏÓÔÉ ÏÔ ÁÒÇÕÍÅÎ ÔÁ ÓÌÅÄÕÀÝÉÍ ÏÂÒÁÚÏÍ: ÅÓÌÉ ÁÂÓÏÌÀÔÎÁÑ ×ÅÌÉÞÉÎÁ ÁÒÁÍÅÔÒÁ 1, ÔÏ ×ÅËÔÏÒ ÓÖÉÍÁÅÔÓÑ, × ÒÏÔÉ×ÎÏÍ ÓÌÕÞÁÅ ÒÁÓÔÑÇÉ×ÁÅÔÓÑ; ÅÓÌÉ ÁÒÇÕÍÅÎÔ ÏÔÒÉ ÁÔÅÌØÎÙÊ, ÔÏ ×ÅËÔÏÒ ÍÅÎÑÅÔ Ó×ÏÅ ÎÁÒÁ ×ÌÅÎÉÅ ÎÁ ÒÏÔÉ×ÏÏÌÏÖÎÏÅ; ve Plus: ×ÔÏÒÏÊ ×ÅËÔÏÒ ¾ÒÉËÌÁÄÙ×ÁÅÔÓÑ¿ Ë ËÏÎ Õ ÅÒ×ÏÇÏ, Ï ÓÌÅ ÞÅÇÏ ÎÁÞÁÌÏ ÅÒ×ÏÇÏ ×ÅËÔÏÒÁ ÓÏÅÄÉÎÑÅÔÓÑ Ó ËÏÎ ÏÍ ×ÔÏÒÏÇÏ (× ÕËÁÚÁÎÎÏÍ ÏÒÑÄËÅ).
óÌÅÄÕÀÝÉÊ ÒÉÍÅÒ ÉÌÌÀÓÔÒÉÒÕÅÔ ÜÔÉ ÏÅÒÁ ÉÉ ÄÌÑ ×ÅËÔÏÒÏ× × Ä×ÕÍÅÒÎÏÍ ÒÏÓÔÒÁÎÓÔ×Å.
4. ðÒÉÍÅÒÙ ÓÔÒÕËÔÕÒÉÒÏ×ÁÎÎÙÈ ÔÉÏ× ÄÁÎÎÙÈ v
-1.5w 0.5v
v+w
w -1v
2w
ve Plus v ve S ale 0.5 ve S ale -1 ve S ale 2 ve S ale -1.5
v w w v v w w
213
= = = = = = =
[3, 2℄ [1, -1℄ [4, 1℄ [1.5, 1℄ [-3, -2℄ [2, -2℄ [-1.5, 1.5℄
òÁÓÓÍÏÔÒÉÍ ÆÕÎË ÉÉ, ÒÅÏÂÒÁÚÕÀÝÉÅ ×ÅËÔÏÒ × ×ÅËÔÏÒ. ïÓÏÂÏ ÉÎ ÔÅÒÅÓÎÙ ÆÕÎË ÉÉ, ÒÅÏÂÒÁÚÕÀÝÉÅ ËÁÖÄÕÀ ÉÚ ËÏÏÒÄÉÎÁÔ ×ÅËÔÏÒÁ × ÌÉÎÅÊÎÕÀ ËÏÍÂÉÎÁ ÉÀ ÄÒÕÇÉÈ ËÏÏÒÄÉÎÁÔ. ÁË, ÄÌÑ ×ÅËÔÏÒÁ ÎÁ ÌÏÓËÏÓÔÉ ÏÄÏÂÎÏÅ ÒÅÏÂÒÁÚÏ×ÁÎÉÅ ÚÁÄÁÅÔÓÑ ÆÏÒÍÕÌÏÊ
f (x; y) = (a x + b y; x + d y);
ÇÄÅ a, b, É d ÅÓÔØ ÒÏÉÚ×ÏÌØÎÙÅ ÞÉÓÌÁ. íÏÖÎÏ ÓËÁÚÁÔØ, ÞÔÏ ÌÀ ÂÏÅ ÌÉÎÅÊÎÏÅ ÒÅÏÂÒÁÚÏ×ÁÎÉÅ ×ÅËÔÏÒÁ × n-ÍÅÒÎÏÍ ÒÏÓÔÒÁÎÓÔ×Å ÏÄ ÎÏÚÎÁÞÎÏ ÏÒÅÄÅÌÑÅÔÓÑ n2 ÞÉÓÌÁÍÉ. ïÂÙÞÎÏ ÏÎÉ ÚÁÉÓÙ×ÁÀÔÓÑ × ×ÉÄÅ ÓÔÒÏË ÞÉÓÅÌ, ÚÁËÌÀÞÅÎÎÙÈ × ÓËÏÂËÉ. ÁËÏÊ ÍÁÔÅÍÁÔÉÞÅÓËÉÊ ÏÂßÅËÔ ÎÁÚÙ×ÁÅÔÓÑ . îÁÒÉÍÅÒ, ÓÌÅÄÕÀÝÁÑ ÍÁÔÒÉ Á ÏÉ ÓÙ×ÁÅÔ Ï×ÏÒÏÔ ×ÅËÔÏÒÁ × ÔÒÅÈÍÅÒÎÏÍ ÒÏÓÔÒÁÎÓÔ×Å ÎÁ 30Æ ×ÏËÒÕÇ ÏÓÉ z : 0 p 1 3 1 01 2 p2 C B 1 1 2 2 3 0A 0 0 0
ÍÁÔÒÉ Á
÷×ÅÄÅÍ ÎÏ×ÙÊ ÔÉ, ÏÉÓÙ×ÁÀÝÉÊ ÍÁÔÒÉ Ù ËÁË ÓÉÓÏË ÓÉÓËÏ×:
data Matrix = Mat [[Float℄℄ ïÅÒÁ ÉÑ ÒÅÏÂÒÁÚÏ×ÁÎÉÑ ÓÔÏÌ Ï× × ÓÔÒÏËÉ É ÎÁÏÂÏÒÏÔ ÎÁÚÙ×ÁÅÔ ÓÑ ÍÁÔÒÉ Ù É ÚÁÄÁÅÔÓÑ ÆÕÎË ÉÅÊ matTransp, ÉÍÅÀÝÅÊ ÓÌÅÄÕÀÝÉÊ ÔÉ:
ÔÒÁÎÓÏÎÉÒÏ×ÁÎÉÅÍ
matTransp :: Matrix -> Matrix ! ! 1 2 1 3 îÁÒÉÍÅÒ, matTransp = .
3 4
2 4
îÁÉÂÏÌÅÅ ×ÁÖÎÏÊ ÉÚ ×ÓÅÈ ÆÕÎË ÉÊ ÄÌÑ ÒÁÂÏÔÙ Ó ÍÁÔÒÉ ÁÍÉ ÍÏÖÎÏ ÓÞÉÔÁÔØ ÆÕÎË ÉÀ, ÚÁÄÁÀÝÕÀ ÌÉÎÅÊÎÏÅ ÒÅÏÂÒÁÚÏ×ÁÎÉÅ ÍÁ ÔÒÉ Ù. åÅ ÔÉ ÔÁËÏ×:
matApply :: Matrix -> Ve tor -> Ve tor
VII. Haskell ËÁË ÑÚÙË ïïð
214
ëÏÍÏÚÉ ÉÑ Ä×ÕÈ ÌÉÎÅÊÎÙÈ ÒÅÏÂÒÁÚÏ×ÁÎÉÊ ÔÁËÖÅ Ñ×ÌÑÅÔÓÑ ÌÉ ÎÅÊÎÙÍ ÒÅÏÂÒÁÚÏ×ÁÎÉÅÍ. ä×Å ÍÁÔÒÉ Ù ÚÁÄÁÀÔ Ä×Á ÌÉÎÅÊÎÙÈ ÒÅ ÏÂÒÁÚÏ×ÁÎÉÑ, ËÏÍÏÚÉ ÉÑ ÜÔÉÈ ÒÅÏÂÒÁÚÏ×ÁÎÉÊ ÔÁËÖÅ ÚÁÄÁÅÔÓÑ ÍÁ ÔÒÉ ÅÊ. ÁËÏÅ ÒÅÏÂÒÁÚÏ×ÁÎÉÅ ÞÁÓÔÏ ÎÁÚÙ×ÁÀÔ . É ÜÔÏÊ ÆÕÎË ÉÉ ÔÁËÏ×:
ÍÁÔÒÉÞÎÙÍ ÒÏÉÚ
×ÅÄÅÎÉÅÍ
matProd :: Matrix -> Matrix -> Matrix ðÒÉ×ÅÄÅÍ ÒÉÍÅÒ ÕÍÎÏÖÅÎÉÑ ÍÁÔÒÉ : 1 2 3 2 1 0
!
0
1
0 1 2 2 B 2 3 4 1 C A= 1 3 4 2
7 16 22 10 2 5 8 5
!
ÁË ËÁË ÏÅÒÁ ÉÑ ËÏÍÏÚÉ ÉÉ ÆÕÎË ÉÊ ÁÓÓÏ ÉÁÔÉ×ÎÁ, ÔÏ É ÆÕÎË ÉÑ matProd ÂÕÄÅÔ ÁÓÓÏ ÉÁÔÉ×ÎÁ (A (B C ) = (A B ) C , ÏÄÎÁËÏ ÏÅÒÁ ÉÑ ÕÍÎÏÖÅÎÉÑ ÍÁÔÒÉ (Ô. Å. A B × ÏÂÝÅÍ ÓÌÕÞÁÅ ÎÅ ÒÁ×ÎÁ B A). íÁÔÒÉÞÎÏÅ ÒÏÉÚ×ÅÄÅÎÉÅ A B ÏÚÎÁÞÁÅÔ, ÞÔÏ ÓÎÁÞÁÌÁ ÒÉÍÅÎÉÌÉ ÒÅÏÂÒÁÚÏ×ÁÎÉÅ B , Á ÚÁÔÅÍ A.
ÎÅ ËÏÍÍÕÔÁÔÉ×ÎÁ
ÏÖÄÅÓÔ×ÅÎÎÏÅ ÒÅÏÂÒÁÚÏ×ÁÎÉÅ (ÎÉÞÅÇÏ ÎÅ ÍÅÎÑÀÝÅÅ) ÚÁÄÁÅÔÓÑ ÅÄÉÎÉÞÎÏÊ ÍÁÔÒÉ ÅÊ. åÇÏ ÍÁÔÒÉ Á ÓÏÄÅÒÖÉÔ 1 ÎÁ ÇÌÁ×ÎÏÊ ÄÉÁÇÏÎÁ ÌÉ, Á ×ÓÅ ÏÓÔÁÌØÎÙÅ ÜÌÅÍÅÎÔÙ ÒÁ×ÎÙ 0. íÏÖÎÏ ÏÒÅÄÅÌÉÔØ ÆÕÎË ÉÀ, ËÏÔÏÒÁÑ ×ÙÄÁÅÔ ÅÄÉÎÉÞÎÕÀ ÍÁÔÒÉ Õ ÕËÁÚÁÎÎÏÊ ÒÁÚÍÅÒÎÏÓÔÉ:
matId :: Int -> Matrix îÅËÏÔÏÒÙÅ ÌÉÎÅÊÎÙÅ ÒÅÏÂÒÁÚÏ×ÁÎÉÑ Ñ×ÌÑÀÔÓÑ ×ÚÁÉÍÎÏ ÏÂÒÁÔÎÙ ÍÉ. ïÂÒÁÔÎÏÅ ÒÅÏÂÒÁÚÏ×ÁÎÉÅ (ÅÓÌÉ ÏÎÏ ÓÕÝÅÓÔ×ÕÅÔ) ÔÁËÖÅ Ñ×ÌÑ ÅÔÓÑ ÌÉÎÅÊÎÙÍ ÒÅÏÂÒÁÚÏ×ÁÎÉÅÍ É ÚÁÄÁÅÔÓÑ ÆÕÎË ÉÅÊ
matInv :: Matrix -> Matrix íÁÔÒÉ Á, ÏÌÕÞÅÎÎÁÑ × ÒÅÚÕÌØÔÁÔÅ ÏÂÒÁÔÎÏÇÏ ÒÅÏÂÒÁÚÏ×ÁÎÉÑ ÎÅ ÏÂÑÚÁÔÅÌØÎÏ ÉÍÅÅÔ ÔÏÔ ÖÅ ÒÁÚÍÅÒ, ÞÔÏ É ÉÓÈÏÄÎÁÑ. õÓÌÏ×ÉÅ ÓÏ×Á ÄÅÎÉÑ ËÏÌÉÞÅÓÔ×Á ÓÔÒÏË Ó ËÏÌÉÞÅÓÔ×ÏÍ ÓÔÏÌ Ï× (ÔÁË ÎÁÚÙ×ÁÅÍÁÑ ¾Ë×ÁÄÒÁÔÎÁÑ¿ ÍÁÔÒÉ Á) Ñ×ÌÑÅÔÓÑ ÎÅÏÂÈÏÄÉÍÙÍ, ÎÏ ÎÅ ÄÏÓÔÁÔÏÞ ÎÙÍ ÕÓÌÏ×ÉÅÍ ! ÓÕÝÅÓÔ×Ï×ÁÎÉÑ ÏÂÒÁÔÎÏÊ ÍÁÔÒÉ Ù, ÎÁÒÉÍÅÒ, ÍÁ 1 2 ÔÒÉ Á ÎÅ ÉÍÅÅÔ ÏÂÒÁÔÎÏÊ.
3 6
äÌÉÎÁ ×ÅËÔÏÒÁ
äÌÉÎÁ ×ÅËÔÏÒÁ ×ÙÞÉÓÌÑÅÔÓÑ Ó ÏÍÏÝØÀ ÔÅÏÒÅÍÙ ðÉÆÁÇÏÒÁ. òÉ ÓÕÎÏË ÉÌÌÀÓÔÒÉÒÕÅÔ ÓÉÔÕÁ ÉÀ ÄÌÑ 2-È É 3-È ÍÅÒÎÏÇÏ ÒÏÓÔÒÁÎÓÔ×Á:
4. ðÒÉÍÅÒÙ ÓÔÒÕËÔÕÒÉÒÏ×ÁÎÎÙÈ ÔÉÏ× ÄÁÎÎÙÈ
p
x2 + y2
p
y
x
(x2 + y 2 ) + z 2
p
215
z
x2 + y 2
÷ ÏÂÝÅÍ ÓÌÕÞÁÅ ÄÌÉÎÁ ×ÅËÔÏÒÁ ÅÓÔØ ËÏÒÅÎØ Ë×ÁÄÒÁÔÎÙÊ ÉÚ ÓÕÍ ÍÙ Ë×ÁÄÒÁÔÏ× ËÏÏÒÄÉÎÁÔ:
ve Length (Ve xs) = sqrt (sum (map square xs))
õÇÏÌ ÍÅÖÄÕ Ä×ÕÍÑ ×ÅËÔÏÒÁÍÉ
òÁÓÓÍÏÔÒÉÍ Ä×Á Ä×ÕÍÅÒÎÙÈ ×ÅËÔÏÒÁ ÅÄÉÎÉÞÎÏÊ ÄÌÉÎÙ. åÓÌÉ ÎÁÞÁÌÏ ×ÅËÔÏÒÏ× ÎÁÈÏÄÉÔÓÑ × ÔÏÞËÅ Ó ËÏÏÒÄÉÎÁÔÁÍÉ (0; 0), ÔÏ ËÏÎ Ù ÜÔÉÈ ×ÅËÔÏÒÏ× ÎÁÈÏÄÑÔÓÑ ÎÁ ÏËÒÕÖÎÏÓÔÉ ÅÄÉÎÉÞÎÏÇÏ ÒÁÄÉÕÓÁ Ó ÅÎÔÒÏÍ × ÎÁÞÁÌÅ ËÏÏÒÄÉÎÁÔ. ðÕÓÔØ ×ÅËÔÏÒÁ ÏÂÒÁÚÕÀÔ Ó ÏÓØÀ Ox ÕÇÌÙ É ÓÏÏÔ×ÅÔÓÔ×ÅÎÎÏ, ÔÏÇÄÁ ÉÈ ËÏÏÒÄÉÎÁÔÙ ÚÁÄÁÀÔÓÑ ÆÏÒÍÕ ÌÁÍÉ ( os ; sin ) É ( os ; sin ). õÇÏÌ ÍÅÖÄÕ ÔÁËÉÍÉ ×ÅËÔÏÒÁÍÉ ÒÁ×ÅÎ . ðÏ ÆÏÒÍÕÌÅ ËÏÓÉÎÕÓÁ ÒÁÚÎÏÓÔÉ Ä×ÕÈ ÕÇÌÏ× ÎÁÊÄÅÍ
os( ) = os os + sin sin ÷ÙÒÁÖÅÎÉÅ, ÓÔÏÑÝÅÅ × ÒÁ×ÏÊ ÞÁÓÔÉ ÆÏÒÍÕÌÙ, ÎÁÚÙ×ÁÅÔÓÑ (inner produ t). ÷ ÏÂÝÅÍ ÓÌÕÞÁÅ ÓËÁ ÌÑÒÎÏÅ ÒÏÉÚ×ÅÄÅÎÉÅ ×ÅËÔÏÒÏ× ÍÏÖÎÏ ÎÁÊÔÉ Ó ÏÍÏÝØÀ ÆÕÎË ÉÉ
ÎÙÍ ÒÏÉÚ×ÅÄÅÎÉÅÍ ×ÅËÔÏÒÏ×
ÓËÁÌÑÒ
ve Inprod (Ve xs) (Ve ys)= sum (zipWith (*) xs ys) äÌÑ ÎÁÈÏÖÄÅÎÉÑ ËÏÓÉÎÕÓÁ ÕÇÌÁ ÍÅÖÄÕ ×ÅËÔÏÒÁÍÉ Ó ÄÌÉÎÏÊ ÎÅ ÒÁ× ÎÏÊ ÅÄÉÎÉ Å, ÉÈ ÒÅÄ×ÁÒÉÔÅÌØÎÏ ÓÌÅÄÕÅÔ ÎÏÒÍÉÒÏ×ÁÔØ, Ô. Å. ÏÄÅ ÌÉÔØ ×ÓÅ ËÏÏÒÄÉÎÁÔÙ ÎÁ ÄÌÉÎÕ ×ÅËÔÏÒÁ. ÅÅÒØ ÍÏÖÎÏ ÏÒÅÄÅÌÉÔØ ÆÕÎË ÉÀ
ve Angle v w = a os (ve Inprod v w / (ve Length v * ve Length w))
æÕÎË ÉÑ a os Ñ×ÌÑÅÔÓÑ ÏÂÒÁÔÎÏÊ Ë ËÏÓÉÎÕÓÕ (× ÒÕÓÓËÏÊ ÌÉÔÅÒÁÔÕ ÒÅ ÜÔÁ ÆÕÎË ÉÑ ÎÏÓÉÔ ÎÁÚ×ÁÎÉÅ ar
os). ëÏÓÉÎÕÓ ÕÇÌÏ× × 90Æ É 90Æ ÒÁ×ÅÎ ÎÕÌÀ, ÞÔÏ ÒÁ×ÎÏÚÎÁÞÎÏ ÒÁ ×ÅÎÓÔ×Õ ÎÕÌÀ ÓËÁÌÑÒÎÏÇÏ ÒÏÉÚ×ÅÄÅÎÉÑ ×ÅËÔÏÒÏ×, ÏÂÒÁÚÕÀÝÉÈ ÜÔÉ ÕÇÌÙ, ÏÜÔÏÍÕ ÅÒÅÎÄÉËÕÌÑÒÎÏÓÔØ ÏÒÅÄÅÌÑÅÔÓÑ ÆÕÎË ÉÅÊ
ve Perpendi ular v w = ve Inprod v w == 0
VII. Haskell ËÁË ÑÚÙË ïïð
216
óÌÏÖÅÎÉÅ É ÍÁÓÛÔÁÂÉÒÏ×ÁÎÉÅ ×ÅËÔÏÒÏ×
æÕÎË ÉÉ ve S ale É ve Plus ÌÅÇËÏ ÏÒÅÄÅÌÑÀÔÓÑ ÞÅÒÅÚ ÆÕÎË ÉÉ map É zipWith:
ve S ale k (Ve xs) = Ve (map (k*) xs) ve Plus (Ve xs) (Ve ys) = Ve (zipWith (+) xs ys) ðÏÄÏÂÎÙÅ ÒÅÏÂÒÁÚÏ×ÁÎÉÑ ÄÏÕÓÔÉÍÙ É ÒÉ ÒÁÂÏÔÅ Ó ÍÁÔÒÉ Á ÍÉ. òÁÚÒÁÂÏÔÁÅÍ Ä×Å ÆÕÎË ÉÉ mapl É ziplWith, ÉÍÅÎÁ ËÏÔÏÒÙÈ ÁÎÁÌÏÇÉÞÎÙ ÆÕÎË ÉÑÍ map É zipWith, ÎÏ ÒÅÄÎÁÚÎÁÞÅÎÎÙÅ ÄÌÑ ÒÁÂÏÔÙ ÓÏ ÓÉÓËÁÍÉ ÓÉÓËÏ×.
mapl :: (a -> b) -> [[a℄℄ -> [[b℄℄ mapl f = map (map f) áÌØÔÅÒÎÁÔÉ×ÎÏÅ ÏÒÅÄÅÌÅÎÉÅ ÜÔÏÊ ÆÕÎË ÉÉ ÔÁËÏ×Ï:
mapl = map . map
ziplWith :: (a -> b -> ) -> [[a℄℄ -> [[b℄℄ -> [[ ℄℄ ziplWith = zipWith . zipWith
æÕÎË ÉÑ ziplWith ÏÒÅÄÅÌÑÅÔÓÑ ÁÎÁÌÏÇÉÞÎÏ:
ó ÏÍÏÝØÀ ÜÔÉÈ ÆÕÎË ÉÊ ÍÏÖÎÏ ÏÒÅÄÅÌÉÔØ matS ale É matPlus:
matS ale :: Float -> Matrix -> Matrix matS ale k (Mat xss) = Mat (mapl (k*) xss) matPlus :: Matrix -> Matrix -> Matrix matPlus (Mat xss) (Mat yss) = Mat (ziplWith (+) xss yss) ÒÁÎÓÏÎÉÒÏ×ÁÎÉÅ ÍÁÔÒÉ
H
ÒÁÎÓÏÎÉÒÏ×ÁÎÎÁÑ ÍÁÔÒÉ Á ÜÔÏ ÍÁÔÒÉ Á, Õ ËÏÔÏÒÏÊ ÓÔÒÏËÉ É ÓÔÏÌ ٠ÏÍÅÎÑÌÉÓØ ÍÅÓÔÁÍÉ. üÔÕ ÏÅÒÁ ÉÀ ÍÏÖÎÏ ÒÉÍÅÎÑÔØ É Ë ÏÂÙÞÎÙÍ ÓÉÓËÁÍ ÓÉÓËÏ× (ÎÅ ÉÓÏÌØÚÕÀÝÉÈ ËÏÎÓÔÒÕËÔÏÒ Mat). ðÏÜÔÏÍÕ ÓÎÁÞÁÌÁ ÏÒÅÄÅÌÉÍ ÆÕÎË ÉÀ transpose:
transpose
:: [[a℄℄ -> [[a℄℄
ðÏÓÌÅ ÞÅÇÏ ÓÔÁÎÏ×ÉÔÓÑ ÑÓÎÙÍ ÏÒÅÄÅÌÅÎÉÅ ÆÕÎË ÉÉ matTransp:
matTransp (Mat xss) = Mat (transpose xss) æÕÎË ÉÑ transpose ÅÓÔØ ÏÂÏÂÝÅÎÉÅ ÆÕÎË ÉÉ zip. ÷ ÔÏ ×ÒÅÍÑ ËÁË zip ÓÏÅÄÉÎÑÅÔ Ä×Á ÓÉÓËÁ × ÓÉÓÏË ÁÒ, transpose ÓÏÂÉÒÁÅÔ ÓÉÓÏË ÓÉÓËÏ× × ÎÏ×ÙÊ ÓÉÓÏË ÓÉÓËÏ×. ïÒÅÄÅÌÉÍ ÜÔÕ ÆÕÎË ÉÀ ÒÅËÕÒ ÓÉ×ÎÏ, ÎÏ ÓÎÁÞÁÌÁ ÏÓÍÏÔÒÉÍ ÎÁ ÒÉÍÅÒÅ ËÁË ÏÎÁ ÒÁÂÏÔÁÅÔ:
---> transpose [[1,2,3℄, [4,5,6℄, [7,8,9℄, [10,11,12℄℄ [[1,4,7,10℄,[2,5,8,11℄,[3,6,9,12℄℄
4. ðÒÉÍÅÒÙ ÓÔÒÕËÔÕÒÉÒÏ×ÁÎÎÙÈ ÔÉÏ× ÄÁÎÎÙÈ
217
åÓÌÉ ÓÉÓÏË ÓÉÓËÏ× ÓÏÓÔÏÉÔ ÔÏÌØËÏ ÉÚ ÏÄÎÏÊ ÓÔÒÏËÉ (ÂÁÚÏ×ÙÊ ÓÌÕ ÞÁÊ ÒÅËÕÒÓÉÉ), ÔÏ ÓÌÅÄÕÅÔ ÓÏÚÄÁÔØ ÓÉÓÏË ÓÉÓËÏ×, × ËÏÔÏÒÏÍ ËÁ ÖÄÙÊ ÓÉÓÏË ÓÏÓÔÏÉÔ ÔÏÌØËÏ ÉÚ ÏÄÎÏÇÏ ÜÌÅÍÅÎÔÁ:
transpose [row℄ = map singleton row where singleton x = [x℄ äÌÑ ÏÌÕÞÅÎÉÑ ÒÅËÕÒÓÉ×ÎÏÇÏ ÓÌÕÞÁÑ ÒÅÄÓÔÁ×ÉÍ ÓÅÂÅ, ÞÔÏ ÕÖÅ ×ÓÅ ÔÒÁÎÓÏÎÉÒÏ×ÁÌÉ, ÚÁ ÉÓËÌÀÞÅÎÉÅÍ ÅÒ×ÏÊ ÓÔÒÏËÉ. ÷ ÒÁÍËÁÈ ÒÅ ÄÙÄÕÝÅÇÏ ÒÉÍÅÒÁ ÜÔÏ ÜË×É×ÁÌÅÎÔÎÏ ÓÌÅÄÕÀÝÅÍÕ:
---> transpose [[4,5,6℄, [7,8,9℄, [10,11,12℄℄ [[4,7,10℄,[5,8,11℄,[6,9,12℄℄ ëÁË ÖÅ ÓËÏÍÂÉÎÉÒÏ×ÁÔØ ÅÒ×ÕÀ ÓÔÒÏËÕ Ó ÏÌÕÞÅÎÎÙÍ ÞÁÓÔÉÞÎÙÍ ÒÅÛÅÎÉÅÍ ÄÌÑ ÏÌÕÞÅÎÉÑ ÏÂÝÅÇÏ ÓÌÕÞÁÑ? åÅ ÜÌÅÍÅÎÔÙ ÓÌÅÄÕÅÔ ÄÏ ÂÁ×ÌÑÔØ Ï ÏÄÎÏÍÕ × ÎÁÞÁÌÏ ËÁÖÄÏÇÏ ÓÉÓËÁ ÉÚ ÒÅËÕÒÓÉ×ÎÏÇÏ ÒÅ ÛÅÎÉÑ: 1 ÎÕÖÎÏ ÄÏÂÁ×ÉÔØ × ÎÁÞÁÌÏ [4,7,10℄, 2 ÏÍÅÓÔÉÔØ × ÎÁÞÁÌÏ [5,8,11℄, Á 3 × ÎÁÞÁÌÏ [6,9,12℄. üÔÕ ÏÅÒÁ ÉÀ ÌÅÇËÏ ÏÓÕÝÅÓÔ×ÉÔØ Ó ÏÍÏÝØÀ zipWith:
transpose (xs :xss) = zipWith (:) xs (transpose xss) åÄÉÎÓÔ×ÅÎÎÙÊ ÓÌÕÞÁÊ, ÕÕÝÅÎÎÙÊ ÎÁÍÉ ÉÚ ÒÁÓÓÍÏÔÒÅÎÉÑ, ÍÁ ÔÒÉ Á Ó ÎÕÌÅ×ÙÍ ËÏÌÉÞÅÓÔ×ÏÍ ÓÔÒÏË, ÎÏ ÔÒÁÎÓÏÎÉÒÏ×ÁÔØ ÏÄÏ ÎÕÀ ÍÁÔÒÉ Õ É ÎÅÔ ÎÅÏÂÈÏÄÉÍÏÓÔÉ. îÅÒÅËÕÒÓÉ×ÎÁÑ ÆÕÎË ÉÑ ÔÒÁÎÓÏÎÉÒÏ×ÁÎÉÑ ÍÁÔÒÉ Ù
íÏÖÎÏ ÒÅÄÌÏÖÉÔØ ÎÅÒÅËÕÒÓÉ×ÎÕÀ ×ÅÒÓÉÀ transpose, ÏÓÎÏ ×ÁÎÎÕÀ ÎÁ ×ÙÚÏ×Å ÓÔÁÎÄÁÒÔÎÏÊ ÆÕÎË ÉÉ foldr. ïÔÍÅÔÉÍ ÓÌÅÄÕ ÀÝÅÅ Ó×ÏÊÓÔ×Ï transpose
transpose (y:ys) = f y (transpose ys), ÇÄÅ f ÅÓÔØ ÞÁÓÔÉÞÎÏ ÁÒÁÍÅÔÒÉÚÏ×ÁÎÎÁÑ ÆÕÎË ÉÑ zipWith (:). ÷ ËÁÞÅÓÔ×Å ÎÁÞÁÌØÎÏÇÏ ÜÌÅÍÅÎÔÁ ÏÅÒÁ ÉÉ Ó×ÅÒÔËÉ ÅÓÔÅÓÔ×ÅÎÎÏ ÏÌÏ ÖÉÔØ transpose [ ℄. ðÕÓÔÕÀ ÍÁÔÒÉ Õ ÍÏÖÎÏ ÔÒÁËÔÏ×ÁÔØ ËÁË ÍÁÔÒÉ Õ ÉÚ 0 ÓÔÒÏË É n-ÓÔÏÌ Ï×. ðÏÓÌÅ ÔÒÁÎÓÏÎÉÒÏ×ÁÎÉÑ ÏÄÏÂÎÁÑ ÍÁÔÒÉ Á ÒÅ×ÒÁ ÔÉÔÓÑ × ÍÁÔÒÉ Õ ÉÚ n ÕÓÔÙÈ ÓÉÓËÏ×. îÏ, ÞÅÍÕ ÒÁ×ÎÏ ÞÉÓÌÏ n? ÷ ÎÁÞÁÌÅ Õ ÎÁÓ ÂÙÌÁ ÒÏÓÔÏ ÍÁÔÒÉ Á ÂÅÚ ÓÔÒÏË, ÏÜÔÏÍÕ ÎÅÌØÚÑ ÓËÁ ÚÁÔØ, ÞÔÏ n ÄÌÉÎÁ ÅÒ×ÏÊ ÓÔÒÏËÉ. ðÏÜÔÏÍÕ, ÞÔÏÂÙ ÎÅ ÏËÁÚÁÔØÓÑ × ÓÉÔÕÁ ÉÉ, ËÏÇÄÁ ÚÁÄÁÎÎÏÅ ÎÁÍÉ × ÜÔÏÍ ÓÌÕÞÁÅ ÞÉÓÌÏ n ÏËÁÖÅÔ ÓÑ ÎÅÄÏÓÔÁÔÏÞÎÏ ×ÅÌÉËÏ, ×ÏÚØÍÅÍ 1 × ËÁÞÅÓÔ×Å n. ÁËÉÍ ÏÂÒÁÚÏÍ, ÔÒÁÎÓÏÎÉÒÕÀ ÍÁÔÒÉ Õ ÉÚ 0 ÓÔÒÏË É 1 ÜÌÅÍÅÎÔÏ×, ÍÙ ÏÌÕÞÉÍ ÍÁ ÔÒÉ Õ ÉÚ 1 ÓÔÒÏË, ÓÏÄÅÒÖÁÝÉÈ ÕÓÔÙÅ ÓÉÓËÉ. îÉËÁËÉÈ ÒÏÂÌÅÍ Ó
H
218
VII. Haskell ËÁË ÑÚÙË ïïð
ÒÉÍÅÎÅÎÉÅÍ ÆÕÎË ÉÉ zipWith Ë ÔÁËÏÍÕ ÓÉÓËÕ ÎÅ ÂÕÄÅÔ, ÔÁË ËÁË ×ÔÏÒÏÊ ÁÒÇÕÍÅÎÔ ÜÔÏÊ ÆÕÎË ÉÉ Ñ×ÌÑÅÔÓÑ ËÏÎÅÞÎÙÍ ÓÉÓËÏÍ.
òÅÚÕÌØÔÁÔÏÍ ÎÁÛÉÈ ÒÁÓÓÕÖÄÅÎÉÊ Ñ×ÌÑÅÔÓÑ ÏÞÅÎØ ÉÚÑÝÎÁÑ ×ÅÒ ÓÉÑ ÆÕÎË ÉÉ transpose:
transpose = foldr f e where f = zipWith (:) e = repeat [℄ üÔÕ ×ÅÒÓÉÀ ÍÏÖÎÏ ÅÒÅÉÓÁÔØ É × ×ÉÄÅ
transpose = foldr (zipWith (:)) (repeat [℄) æÕÎË ÉÏÎÁÌØÎÏÅ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÅ ÅÓÔØ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÅ Ï ÓÒÅÄÓÔ×ÏÍ ÆÕÎË ÉÊ! ðÒÉÍÅÎÅÎÉÅ ÍÁÔÒÉ Ù Ë ×ÅËÔÏÒÕ
íÁÔÒÉ Á ÚÁÄÁÅÔ ÌÉÎÅÊÎÏÅ ÒÅÏÂÒÁÚÏ×ÁÎÉÅ ×ÅËÔÏÒÏ×. æÕÎË ÉÑ matApply ÏÓÕÝÅÓÔ×ÌÑÅÔ ÜÔÏ ÒÅÏÂÒÁÚÏ×ÁÎÉÅ, ÎÁÒÉÍÅÒ,
matApply (Mat [[1,2,3℄, [4,5,6℄℄) (Ve [x,y,z℄) = Ve [1x+2y+3z, 4x+5y+6z℄ þÉÓÌÏ ÓÔÏÌ Ï× × ÍÁÔÒÉ Å ÒÁ×ÎÑÅÔÓÑ ÞÉÓÌÕ ËÏÏÒÄÉÎÁÔ ÉÓÈÏÄÎÏÇÏ ×ÅËÔÏÒÁ, Á ÞÉÓÌÏ ÓÔÒÏË ËÏÌÉÞÅÓÔ×Õ ËÏÏÒÄÉÎÁÔ ÏÌÕÞÉ×ÛÅÇÏÓÑ ×ÅËÔÏÒÁ.
äÌÑ ×ÙÞÉÓÌÅÎÉÑ ÏÄÎÏÊ ÉÚ ËÏÏÒÄÉÎÁÔ ÒÅÚÕÌØÔÉÒÕÀÝÅÇÏ ×ÅËÔÏÒÁ ÏÔÒÅÂÕÀÔÓÑ ÚÎÁÞÅÎÉÑ ÔÏÌØËÏ ÉÚ ÏÄÎÏÊ ÓÔÒÏËÉ ÍÁÔÒÉ Ù. üÔÏ ÄÁÅÔ ×ÏÚÍÏÖÎÏÓÔØ ÚÁÄÁÔØ matApply Ó ÏÍÏÝØÀ ÆÕÎË ÉÉ map:
matApply (Mat m) v = Ve (map f m) æÕÎË ÉÑ f ÂÅÒÅÔ ÏÄÎÕ ÓÔÒÏËÕ ÉÚ ÍÁÔÒÉ Ù É ×ÏÚ×ÒÁÝÁÅÔ ÏÄÎÕ ÉÚ ËÏ ÏÒÄÉÎÁÔ ÒÅÚÕÌØÔÉÒÕÀÝÅÇÏ ×ÅËÔÏÒÁ, ÎÁÒÉÍÅÒ, ÄÌÑ ×ÔÏÒÏÊ ÓÔÒÏËÉ ÉÍÅÅÍ
f [4, 5, 6℄ = 4x + 5y + 6z
ÆÕÎË ÉÑ f ×ÙÞÉÓÌÑÅÔ ÌÉÎÅÊÎÏÅ ÒÏÉÚ×ÅÄÅÎÉÅ (× ÄÁÎÎÏÍ ÓÌÕÞÁÅ Ó ×ÅËÔÏÒÏÍ v, ÉÍÅÀÝÉÍ ËÏÏÒÄÉÎÁÔÙ [x, y,z℄). ðÏÜÔÏÍÕ ÍÏÖÎÏ ÚÁÉÓÁÔØ
matApply :: Matrix -> Ve tor -> Ve tor matApply (Mat m) v = Ve (map f m) where f row = ve Inprod (Ve row) v
4. ðÒÉÍÅÒÙ ÓÔÒÕËÔÕÒÉÒÏ×ÁÎÎÙÈ ÔÉÏ× ÄÁÎÎÙÈ
219
åÄÉÎÉÞÎÁÑ ÍÁÔÒÉ Á
äÌÑ ÌÀÂÏÇÏ ÒÏÓÔÒÁÎÓÔ×Á ÕËÁÚÁÎÎÏÊ ÒÁÚÍÅÒÎÏÓÔÉ ÓÕÝÅÓÔ×ÕÅÔ ÔÏÌØËÏ ÏÄÎÁ ÅÄÉÎÉÞÎÁÑ ÍÁÔÒÉ Á: ÜÔÏ Ë×ÁÄÒÁÔÎÁÑ ÍÁÔÒÉ Á, Õ ËÏÔÏ ÒÏÊ ÞÉÓÌÏ ÓÔÒÏË É ÓÔÏÌ Ï× ÓÏ×ÁÄÁÅÔ Ó ÒÁÚÍÅÒÎÏÓÔØÀ ÒÏÓÔÒÁÎ ÓÔ×Á, ÎÁ ÅÅ ÇÌÁ×ÎÏÊ ÄÉÁÇÏÎÁÌÉ ÎÁÈÏÄÑÔÓÑ ÅÄÉÎÉ Ù, Á ×ÓÅ ÏÓÔÁÌØÎÙÅ ÍÅÓÔÁ ÚÁÏÌÎÅÎÙ ÎÕÌÑÍÉ. ðÅÒÅÄ ÒÁÚÒÁÂÏÔËÏÊ ÆÕÎË ÉÉ, ËÏÔÏÒÁÑ ×ÏÚ×ÒÁÝÁÅÔ ÅÄÉÎÉÞÎÕÀ ÍÁÔÒÉ Õ ÕËÁÚÁÎÎÏÊ ÒÁÚÍÅÒÎÏÓÔÉ, ÏÌÅÚÎÏ ÎÁÉÓÁÔØ ÆÕÎË ÉÀ, ÓÏÚÄÁÀÝÕÀ ÍÁÔÒÉ Õ ÂÅÓËÏÎÅÞÎÏÇÏ ÒÁÚÍÅÒÁ: 0
1 0 0 0
:::
.. .
..
B B 0 0 1 0 B B 0 0 0 1
.
1 C C C C A
ðÅÒ×ÁÑ ÓÔÒÏËÁ ÔÁËÏÊ ÍÁÔÒÉ Ù ÅÓÔØ ÂÅÓËÏÎÅÞÎÙÊ ÓÉÓÏË ÉÚ ÎÕÌÅÊ, ÓÏÄÅÒÖÁÝÉÊ ÅÄÉÎÉ Õ × ÎÁÞÁÌÅ, Ô. Å. 1 : repeat 0. ÷ÓÅ ÄÒÕÇÉÅ ÓÔÒÏ ËÉ ÏÌÕÞÁÀÔÓÑ ÄÏÂÁ×ÌÅÎÉÅÍ ÅÝÅ ÏÄÎÏÇÏ ÎÕÌÑ × ÎÁÞÁÌÏ ÓÉÓËÁ. éÓ ÏÌØÚÕÑ ÆÕÎË ÉÀ iterate, ÍÏÖÎÏ ÚÁÉÓÁÔØ
matIdent :: Matrix matIdent = Mat (iterate (0:) (1: repeat 0))
åÄÉÎÉÞÎÁÑ ÍÁÔÒÉ Á ÒÁÚÍÅÒÎÏÓÔÉ n ÂÕÄÅÔ ÏÌÕÞÅÎÁ, ÅÓÌÉ ÉÚ ÂÅÓ ËÏÎÅÞÎÏÊ ÍÁÔÒÉ Ù ×ÚÑÔØ ÅÒ×ÙÅ n ÓÔÏÌ Ï× ÉÚ ÅÒ×ÙÈ n ÓÔÒÏË:
matId :: Int -> Matrix matId n = Mat ( map (take n) (take n xss)) where (Mat xss) = matIdent ïÒÅÄÅÌÉÔÅÌØ ÍÁÔÒÉ Ù
ÏÌØËÏ ×ÚÁÉÍÎÏÏÄÎÏÚÎÁÞÎÏÅ ÏÔÏÂÒÁÖÅÎÉÅ ÚÁÄÁÅÔ ÍÁÔÒÉ Õ, ËÏ ÔÏÒÁÑ ÉÍÅÅÔ ÏÂÒÁÔÎÕÀ. íÁÔÒÉ Á, ÏÂÒÁÔÎÁÑ Ë ÍÁÔÒÉ Å A, ÏÂÏÚÎÁ ÞÁÅÔÓÑ ËÁË A 1 É ÕÄÏ×ÌÅÔ×ÏÒÑÅÔ ÓÏÏÔÎÏÛÅÎÉÀ A A 1 = E , ÇÄÅ E ÅÄÉÎÉÞÎÁÑ ÍÁÔÒÉ Á. ÏÌØËÏ Ë×ÁÄÒÁÔÎÁÑ ÍÁÔÒÉ Á ÉÍÅÅÔ ÏÂÒÁÔ ÎÕÀ. îÏ ÄÁÖÅ ÎÅ ËÁÖÄÁÑ ÍÁÔÒÉ Á ÉÍÅÅÔ ÏÂÒÁÔÎÕÀ, Ë×ÁÄÒÁÔÎÁÑ ÔÁË, ÎÁÒÉÍÅÒ, ÍÁÔÒÉ Á 00 00 ËÏÔÏÒÁÑ ÒÅÏÂÒÁÚÕÅÔ ÌÀÂÕÀ ÔÏÞËÕ
Ë ÎÁÞÁÌÕ ËÏÏÒÄÉÎÁÔ, ÎÅ ÉÍÅÅÔ ÏÂÒÁÔÎÏÊ; ÍÁÔÒÉ Á 12 12 ËÁÖÄÕÀ ÔÏÞËÕ ÒÅÏÂÒÁÚÕÅÔ Ë ÔÏÞËÅ ÌÅÖÁÝÅÊ ÎÁ ÒÑÍÏÊ y = 2x É ÔÁËÖÅ 1 2 ÎÅ ÉÍÅÅÔ ÏÂÒÁÔÎÏÊ; ÍÁÔÒÉ Á 3 6 ÒÅÏÂÒÁÚÕÅÔ ×ÓÅ ÔÏÞËÉ × ÔÏÞËÉ, ÌÅÖÁÝÉÅ ÎÁ ÏÄÎÏÊ ÒÑÍÏÊ, ÔÁËÖÅ ÎÅ ÉÍÅÅÔ ÏÂÒÁÔÎÏÊ. ÏÌØËÏ ÅÓÌÉ
VII. Haskell ËÁË ÑÚÙË ïïð
220
×ÔÏÒÁÑ ÓÔÒÏËÁ Ä×ÕÍÅÒÎÏÊ ÍÁÔÒÉ Ù ÎÅ ÒÏÏÒ ÉÏÎÁÌØÎÁ ÅÒ×ÏÊ, ÍÏÖÎÏ ×ÙÞÉÓÌÉÔØ ÏÂÒÁÔÎÕÀ Ë ÎÅÊ ÍÁÔÒÉ Õ. a b a b äÒÕÇÉÍÉ ÓÌÏ×ÁÍÉ, ÍÁÔÒÉ Á d ÉÍÅÅÔ ÏÂÒÁÔÎÕÀ, ÅÓÌÉ 6= ,
d ÞÔÏ ÜË×É×ÁÌÅÎÔÎÏ ad b 6= 0. ÷ÅÌÉÞÉÎÁ ad b ÎÁÚÙ×ÁÅÔÓÑ ÏÒÅÄÅ ÌÉÔÅÌÅÍ (ÉÌÉ ÄÅÔÅÒÍÉÎÁÎÔÏÍ) ÍÁÔÒÉ Ù 2 2. åÓÌÉ ÏÒÅÄÅÌÉÔÅÌØ ÒÁ×ÅÎ ÎÕÌÀ, ÔÏ ÍÁÔÒÉ Á ÎÅ ÉÍÅÅÔ ÏÂÒÁÔÎÏÊ. ïÒÅÄÅÌÉÔÅÌØ Ë×ÁÄÒÁÔÎÏÊ ÍÁÔÒÉ Ù ÂÏÌØÛÅÊ ÒÁÚÍÅÒÎÏÓÔÉ ÔÁË ÖÅ ÍÏÖÎÏ ×ÙÞÉÓÌÉÔØ. äÌÑ ÍÁÔÒÉ Ù ÒÁÚÍÅÒÏÍ 3 3 ÏÒÅÄÅÌÉÔÅÌØ ×ÙÞÉÓÌÑÅÔÓÑ ÔÁË:
ab det d e f gh i
!
d e e f d f = a det h i b det g i + det g h
ïÒÅÄÅÌÉÔÅÌØ ÍÁÔÒÉ Ù ÌÀÂÏÇÏ ÏÒÑÄËÁ ÍÏÖÅÔ ÂÙÔØ Ó×ÅÄÅÎ Ë ×ÙÞÉÓÌÅÎÉÀ ÏÒÅÄÅÌÉÔÅÌÅÊ ÍÁÔÒÉ ÍÅÎØÛÅÇÏ ÏÒÑÄËÁ. äÌÑ ÜÔÏ ÇÏ ×ÙÂÉÒÁÀÔ ÌÀÂÕÀ ÓÔÒÏËÕ (ÅÒ×ÕÀ × ÎÁÛÅÍ ÒÉÍÅÒÅ), ÏÓÌÅ ÞÅ ÇÏ ÓËÌÁÄÙ×ÁÀÔ ×ÙÒÁÖÅÎÉÑ, ÏÌÕÞÅÎÎÙÅ ÕÔÅÍ ÕÍÎÏÖÅÎÉÑ ÞÉÓÌÁ 1, ÌÉÂÏ 1 (ÄÌÑ ÅÒ×ÏÇÏ ÓÌÁÇÁÅÍÏÇÏ 1, ÚÁÔÅÍ ÞÉÓÌÁ ÞÅÒÅÄÕÀÔÓÑ), ÎÁ ×ÅÌÉÞÉÎÕ ÜÌÅÍÅÎÔÁ, ÒÁÓÏÌÏÖÅÎÎÏÇÏ × ÏÞÅÒÅÄÎÏÍ ÓÔÏÌ ŠÜÔÏÊ ÓÔÒÏËÉ, É ÎÁ ÏÒÅÄÅÌÉÔÅÌØ ÍÁÔÒÉ Ù, ÏÌÕÞÅÎÎÏÊ ÏÓÌÅ .
ÕÄÁÌÅÎÉÑ ÄÁÎÎÏÊ ÓÔÒÏËÉ É ÔÅËÕÝÅÇÏ ÓÔÏÌÂ Á ÉÚ ÉÓÈÏÄÎÏÊ ÍÁÔÒÉ Ù
H
ðÒÏÅËÔÉÒÏ×ÁÎÉÅ ÆÕÎË ÉÉ det ÎÁÞÎÅÍ Ó ÎÅÆÏÒÍÁÌØÎÏÇÏ ÏÉÓÁ ÎÉÑ ÏÒÅÄÅÌÉÔÅÌÑ, ËÏÔÏÒÙÊ ÔÒÅÂÕÅÔÓÑ ×ÙÞÉÓÌÉÔØ. íÙ ÍÏÖÅÍ ÉÓ ÏÌØÚÏ×ÁÔØ ÒÁÚÄÅÌÅÎÉÅ ÍÁÔÒÉ Ù ÎÁ ÅÒ×ÕÀ ÓÔÒÏËÕ É ÏÓÔÁ×ÛÕÀÓÑ ÞÁÓÔØ ÍÁÔÒÉ Ù:
det (Mat (row:rows)) = ... îÁÍ ÎÕÖÎÏ ÂÕÄÅÔ ÕÄÁÌÉÔØ ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÉÊ ÓÔÏÌÂÅ ÉÚ ÍÁÔÒÉ Ù rows. ÷ÍÅÓÔÏ ÕÄÁÌÅÎÉÑ Ï ÏÄÎÏÍÕ ÜÌÅÍÅÎÔÕ ÉÚ ËÁÖÄÏÊ ÓÔÒÏËÉ ÚÎÁ ÞÉÔÅÌØÎÏ ÒÏÝÅ ÔÒÁÎÓÏÎÉÒÏ×ÁÔØ ÍÁÔÒÉ Õ É ÕÖÅ ÉÚ ÔÒÁÎÓÏÎÉ ÒÏ×ÁÎÎÏÊ ÍÁÔÒÉ Ù ÕÄÁÌÉÔØ ÅÌÉËÏÍ ÓÔÒÏËÕ. äÌÑ ÜÔÏÇÏ ÏÌÕÞÉÍ ÓÉÓÏË ÓÉÓËÏ×, ÓÏÄÅÒÖÁÝÉÊ ×ÓÅ ×ÏÚÍÏÖÎÙÅ ÍÁÔÒÉ Ù, ÏÌÕÞÅÎÎÙÅ ÏÓÌÅ ÕÄÁÌÅÎÉÑ ÏÄÎÏÇÏ ÉÚ ÓÔÏÌ Ï×. äÁÎÎÕÀ ÏÅÒÁ ÉÀ ÕÄÏÂÎÏ ×Ù ÏÌÎÉÔØ Ó ÏÍÏÝØÀ ÆÕÎË ÉÉ gaps, ÏÂÒÁÚÕÀÝÅÊ ÓÉÓÏË ÓÉÓËÏ×, ÏÌÕÞÅÎÎÙÈ ×ÓÅ×ÏÚÍÏÖÎÙÍÉ ÕÄÁÌÅÎØÑÍÉ ÏÄÎÏÇÏ ÜÌÅÍÅÎÔÁ ÉÚ ÓÉÓ ËÁ, ÎÁÒÉÍÅÒ,
---> gaps [1,2,3,4℄ [[2,3,4℄,[1,3,4℄,[1,2,4℄,[1,2,3℄℄
4. ðÒÉÍÅÒÙ ÓÔÒÕËÔÕÒÉÒÏ×ÁÎÎÙÈ ÔÉÏ× ÄÁÎÎÙÈ
221
ïÓÔÁ×É× × ËÁÞÅÓÔ×Å ÓÁÍÏÓÔÏÑÔÅÌØÎÏÇÏ ÚÁÄÁÎÉÑ ÒÁÚÒÁÂÏÔËÕ ÜÔÏÊ ÆÕÎË ÉÉ, ×ÅÒÎÅÍÓÑ Ë ÎÁÉÓÁÎÉÀ ÆÕÎË ÉÉ, ×ÙÞÉÓÌÑÀÝÅÊ ÏÒÅ ÄÅÌÉÔÅÌØ. ðÏÌÕÞÅÎÎÙÅ ÓÉÓËÉ ÓÉÓËÏ× ÓÌÅÄÕÅÔ ÔÒÁÎÓÏÎÉÒÏ×ÁÔØ ÏÂÒÁÔÎÏ É Ó ÏÍÏÝØÀ ËÏÎÓÔÒÕËÔÏÒÁ Mat ÒÅ×ÒÁÔÉÔØ × ÍÁÔÒÉ Ù:
det (Mat (row:rows)) = ... where ols = transpose rows mats = map (Mat . transpose) (gaps ols) äÌÑ ×ÓÅÈ ÏÌÕÞÅÎÎÙÈ ÍÁÔÒÉ ÓÌÅÄÕÅÔ ×ÙÞÉÓÌÉÔØ ÏÒÅÄÅÌÉÔÅÌÉ, ÄÌÑ ÞÅÇÏ ÒÉÄÅÔÓÑ ÉÓÏÌØÚÏ×ÁÔØ ÒÅËÕÒÓÉÀ. ÚÁÔÅÍ ÏÌÕÞÅÎÎÙÅ ÏÒÅ ÄÅÌÉÔÅÌÉ ÓÌÅÄÕÅÔ ÕÍÎÏÖÉÔØ ÏÓÌÅÄÏ×ÁÔÅÌØÎÏ ÎÁ ×ÓÅ ÜÌÅÍÅÎÔÙ ÅÒ ×ÏÊ ÓÔÒÏËÉ:
det (Mat (row:rows)) = ... where ols = transpose rows mats = map (Mat . transpose) (gaps ols) prods = zipWith (*) row (map det mats) ðÒÏÉÚ×ÅÄÅÎÉÑ prods ÄÏÌÖÎÙ ÂÙÔØ ÏÏÞÅÒÅÄÎÏ ÕÍÎÏÖÅÎÙ ÎÁ +1 ÉÌÉ 1 É ÚÁÔÅÍ ÓÌÏÖÅÎÙ. äÌÑ ×ÙÏÌÎÅÎÉÑ ÜÔÏÊ ÏÅÒÁ ÉÉ ×ÏÓ ÏÌØÚÕÅÍÓÑ ÆÕÎË ÉÅÊ altsum (ÓÕÍÍÉÒÏ×ÁÎÉÅ Ó ÁÌØÔÅÒÎÁÔÉ×ÁÍÉ), ÉÓÏÌØÚÕÀÝÅÊ ÂÅÓËÏÎÅÞÎÙÊ ÓÉÓÏË:
altsum xs = sum (zipWith (*) xs plusMinusOne) where plusMinusOne = 1 : -1 : plusMinusOne úÁÉÛÅÍ ÉÔÏÇÏ×ÕÀ ÆÕÎË ÉÀ, ×ÙÞÉÓÌÑÀÝÕÀ ÏÒÅÄÅÌÉÔÅÌØ ÍÁ ÔÒÉ Ù:
det (Mat (row:rows)) = altsum prods where ols = transpose rows mats = map (Mat . transpose) (gaps ols) prods = zipWith (*) row (map det mats) ðÏÌÕÞÅÎÎÕÀ ÆÕÎË ÉÀ ÍÏÖÎÏ ÓÌÅÇËÁ ÕÒÏÓÔÉÔØ, ÚÁÍÅÔÉ×, ÞÔÏ ÎÅÔ ÎÅÏÂÈÏÄÉÍÏÓÔÉ × ÏÂÒÁÔÎÏÍ ÔÒÁÎÓÏÎÉÒÏ×ÁÎÉÉ ÍÁÔÒÉ , ÔÁË ËÁË ÏÒÅÄÅÌÉÔÅÌØ ÔÒÁÎÓÏÎÉÒÏ×ÁÎÎÏÊ ÍÁÔÒÉ Ù ÓÏ×ÁÄÁÅÔ Ó ÏÒÅÄÅÌÉ ÔÅÌÅÍ ÉÓÈÏÄÎÏÊ:
det (Mat (row:rows)) = altsum ( zipWith (*) row (map det (map (Mat (gaps (transpose rows)))))) ÁË ËÁË det ÒÅËÕÒÓÉ×ÎÁÑ ÆÕÎË ÉÑ, ÎÅÏÂÈÏÄÉÍÏ ÕÞÅÓÔØ ÂÁÚÏ ×ÙÊ ÓÌÕÞÁÊ. ïÒÅÄÅÌÉÔÅÌØ ÍÁÔÒÉ Ù 1 1 ÓÏ×ÁÄÁÅÔ ÓÏ ÚÎÁÞÅÎÉÅÍ ÅÅ ÅÄÉÎÓÔ×ÅÎÎÏÇÏ ÜÌÅÍÅÎÔÁ:
det (Mat [[x℄℄) = x
222
VII. Haskell ËÁË ÑÚÙË ïïð
é, ÎÁËÏÎÅ , ÏËÏÎÞÁÔÅÌØÎÙÊ ÒÅÚÕÌØÔÁÔ:
det :: Matrix -> Float det (Mat [[x℄℄) = x det (Mat (row:rows)) = (altsum . zipWith (*) row . map det . map Mat . gaps . transpose) rows ÷ÙÞÉÓÌÉÍ ÏÒÅÄÅÌÉÔÅÌØ ÅÄÉÎÉÞÎÏÊ ÍÁÔÒÉ Ù ÞÅÔ×ÅÒÔÏÇÏ ÏÒÑÄËÁ:
H
---> det (Mat [[1,0,0,0℄,[0,1,0,0℄,[0,0,1,0℄,[0,0,0,1℄℄) 1.0
÷ÏÒÏÓÙ É ÚÁÄÁÎÉÑ VII.4.1
îÁÉÛÉÔÅ ÆÕÎË ÉÀ dayBefore, ×ÏÚ×ÒÁÝÁÀÝÕÀ ÄÅÎØ, ÒÅÄÛÅÓÔ×Õ ÀÝÉÊ ÄÁÎÎÏÍÕ. VII.4.2
ïÒÅÄÅÌÉÔÅ ÔÉ Dire tion, ÞØÉ ÚÎÁÞÅÎÉÑ ÏÉÓÙ×ÁÀÔ ÞÅÔÙÒÅ ÇÌÁ× ÎÙÈ ÔÏÞËÉ ÎÁ ËÏÍÁÓÅ, É ÏÒÅÄÅÌÉÔÅ ÆÕÎË ÉÀ revCorner ÄÌÑ ×Ù ÄÁÞÉ ÒÏÔÉ×ÏÏÌÏÖÎÏÇÏ ÎÁÒÁ×ÌÅÎÉÑ. VII.4.3
÷ ÌÏÇÉËÅ ÓÌÅÄÓÔ×ÉÅ (ÉÍÌÉËÁ ÉÑ, impli ation), ÏÂÏÚÎÁÞÁÅÍÏÅ ËÁË ), ÏÒÅÄÅÌÑÅÔÓÑ ÕÓÌÏ×ÉÅÍ, ÞÔÏ x ) y ÌÏÖÎÏ ÔÏÇÄÁ É ÔÏÌØËÏ ÔÏÇÄÁ, ËÏÇÄÁ x ÉÓÔÉÎÎÏ, Á y ÌÏÖÎÏ. äÁÊÔÅ ÆÏÒÍÁÌØÎÏÅ ÏÒÅÄÅÌÅÎÉÅ ÉÍÌÉËÁ ÉÉ ËÁË ÏÅÒÁ ÉÉ ÎÁ ÍÎÏÖÅÓÔ×Å Bool. VII.4.4
óËÏÌØËÏ ÕÒÁ×ÎÅÎÉÊ ÏÔÒÅÂÕÅÔÓÑ ×ÁÍ ÎÁÉÓÁÔØ, ÞÔÏÂÙ ÏÒÅÄÅÌÉÔØ ÆÕÎË ÉÀ, ×ÏÚ×ÒÁÝÁÀÝÕÀ ÚÎÁÞÅÎÉÅ ÔÉÁ Triangle, ×Ù×ÅÄÅÎÎÏÇÏ ÉÚ ËÌÁÓÓÁ Ord? (óÍ. ÓÔÒ. 180.) VII.4.5
óÕÝÅÓÔ×ÕÀÔ ÌÉ ÞÉÓÌÁ, ËÏÔÏÒÙÅ ÍÏÖÎÏ ÓÒÁ×ÎÉÔØ ÒÉ ÏÍÏÝÉ ÏÅ ÒÁÔÏÒÁ (==), ÎÏ ÎÅÌØÚÑ ÓÒÁ×ÎÉÔØ ÒÉ ÏÍÏÝÉ (<)? VII.4.6
üÔÏ ÚÁ ×ÅÌÉÞÉÎÙ ÏÌÕÞÁÔÓÑ × ÒÅÚÕÌØÔÁÔÅ ×ÙÞÉÓÌÅÎÉÑ ÓÌÅÄÕÀÝÉÈ ×ÙÒÁÖÅÎÉÊ?
5. éÎËÁÓÕÌÑ ÉÑ ÄÁÎÎÙÈ × ÍÏÄÕÌÑÈ
223
show (show 42) show 42 ++ show 42 show "\n" VII.4.7
îÁÉÛÉÔÅ ÆÕÎË ÉÀ gaps, ËÏÔÏÒÁÑ ×ÏÚ×ÒÁÝÁÅÔ ÓÉÓÏË ÓÉÓËÏ×, Ï ÌÕÞÅÎÎÙÈ ×ÓÅ×ÏÚÍÏÖÎÙÍÉ ÕÄÁÌÅÎØÑÍÉ ÏÄÎÏÇÏ ÜÌÅÍÅÎÔÁ ÉÚ ÉÓÈÏÄ ÎÏÇÏ ÓÉÓËÁ, ÎÁÒÉÍÅÒ,
---> gaps [1,2,3,4,5℄ [[2,3,4,5℄,[1,3,4,5℄,[1,2,4,5℄,[1,2,3,5℄,[1,2,3,4℄℄ VII.4.8
îÁÉÛÉÔÅ ÆÕÎË ÉÀ matProd ÄÌÑ ÅÒÅÍÎÏÖÅÎÉÑ Ä×ÕÈ ÍÁÔÒÉ . VII.4.9
îÁÉÛÉÔÅ ÆÕÎË ÉÀ matInv ÄÌÑ ÏÒÅÄÅÌÅÎÉÑ ÏÂÒÁÔÎÏÊ ÍÁÔÒÉ Ù. VII.4.10
äÌÑ ÏÔÏÂÒÁÖÅÎÉÑ ÒÅÚÕÌØÔÁÔÏ× ÆÕÎË ÉÊ, ×ÏÚ×ÒÁÝÁÀÝÉÈ ×ÅËÔÏÒÁ É ÍÁÔÒÉ Ù, ÓÌÅÄÕÅÔ × ÄÅËÌÁÒÁ ÉÉ data ÜÔÉÈ ÔÉÏ× ÏÔÍÅÔÉÔØ, ÞÔÏ ÏÎÉ ÎÁÓÌÅÄÕÀÔ Ó×ÏÊÓÔ×Á ËÌÁÓÓÁ Show. ïÄÎÁËÏ ×Ù×ÏÄ, ÒÅÄÌÁÇÁÅÍÙÊ ÜÔÉÍ ËÌÁÓÓÏÍ Ï ÕÍÏÌÞÁÎÉÀ, ÎÅ ÏÞÅÎØ ÎÁÇÌÑÄÅÎ. éÓÏÌØÚÕÑ ÄÅËÌÁ ÒÁ ÉÀ instan e ÏÂßÑ×ÉÔÅ ÔÉÙ Ve É Matrix ËÁË ÜËÚÅÍÌÑÒÙ ËÌÁÓ ÓÁ Show É ÓÏÚÄÁÊÔÅ Ó×ÏÉ ÆÕÎË ÉÉ show, ÅÒÅÇÒÕÖÁÀÝÉÅ ÄÁÎÎÙÊ ÍÅÔÏÄ ËÌÁÓÓÁ Show. äÏÂÅÊÔÅÓØ ÔÏÇÏ, ÞÔÏÂÙ ×Ù×ÏÄ, ÏÓÕÝÅÓÔ×ÌÅÎÎÙÊ ÒÉ ÏÍÏÝÉ ÒÁÚÒÁÂÏÔÁÎÎÙÈ ×ÁÍÉ ÆÕÎË ÉÊ, ÓÏÏÔ×ÅÔÓÔ×Ï×ÁÌ ÏÂÝÅ ÒÉÎÑÔÙÍ ÍÁÔÅÍÁÔÉÞÅÓËÉÍ ÔÒÁÄÉ ÉÑÍ.
5. éÎËÁÓÕÌÑ ÉÑ ÄÁÎÎÙÈ × ÍÏÄÕÌÑÈ 5.1. îÅÏÂÈÏÄÉÍÏÓÔØ ÓÏËÒÙÔÉÑ ÄÁÎÎÙÈ éÓÏÌØÚÏ×ÁÎÉÅ ÌÏËÁÌØÎÙÈ ÅÒÅÍÅÎÎÙÈ × ËÏÎÓÔÒÕË ÉÑÈ let É where Ñ×ÌÑÅÔÓÑ ÏÄÎÉÍ ÉÚ ÓÏÓÏÂÏ× ÓÏËÒÙÔÉÑ ×ÎÕÔÒÅÎÎÉÈ ÄÅÔÁÌÅÊ ÒÅÁÌÉÚÁ ÉÉ ÏÄÎÏÊ ÒÏÇÒÁÍÍÎÏÊ ËÏÍÏÎÅÎÔÙ ÏÔ ÄÒÕÇÉÈ. óÕÝÎÏ ÓÔÉ, ÏÒÅÄÅÌÑÅÍÙÅ × where-ÆÒÁÚÁÈ, ÄÏÓÔÕÎÙ ÔÏÌØËÏ ×ÎÕÔÒÉ ÔÁ ËÏÇÏ ÏÒÅÄÅÌÅÎÉÑ. ÁËÉÍ ÏÂÒÁÚÏÍ, where-ÒÅÄÌÏÖÅÎÉÑ, Ñ×ÌÑÀÔÓÑ ÎÅËÏÔÏÒÙÍ ÓÏÓÏÂÏÍ ÓËÒÙÔØ ÏÔ ÄÏÓÔÕÁ ÉÚ×ÎÅ (ÉÎËÁÓÕÌÉÒÏ×ÁÔØ, en apsulate) ÉÎÆÏÒÍÁ ÉÀ. ÷ÅÌÉÞÉÎÙ, ÓËÒÙÔÙÅ ÏÄÏÂÎÙÍ ÏÂÒÁÚÏÍ, ÚÁÝÉÝÅÎÙ ÏÔ ×ÏÚÄÅÊÓÔ×ÉÑ ÄÒÕÇÉÈ ÏÒÅÄÅÌÅÎÉÊ. ÅÍ ÎÅ ÍÅÎÅÅ, ×ÓÅ
VII. Haskell ËÁË ÑÚÙË ïïð
224
ÖÅ ÌÕÞÛÅ ÓÏÈÒÁÎÑÔØ where-ÒÅÄÌÏÖÅÎÉÑ ÎÁÓÔÏÌØËÏ ËÏÒÏÔËÉÍÉ, ÎÁ ÓËÏÌØËÏ ÜÔÏ ×ÏÚÍÏÖÎÏ. åÓÌÉ ÏÎÉ ÄÏÓÔÁÔÏÞÎÏ ÄÌÉÎÙ, ÔÏ ÏÎÉ ÓÏÄÅÒ ÖÁÔ ÍÎÏÇÏ ÅÒÅÍÅÎÎÙÈ, ÞÔÏ ÍÏÖÅÔ ÒÉ×ÅÓÔÉ Ë ×ÏÚÎÉËÎÏ×ÅÎÉÀ ÒÁÚ ÌÉÞÎÙÈ ËÏÎÆÌÉËÔÏ×. äÏÓÔÕ Ë ÓÕÝÎÏÓÔÑÍ ÍÏÖÅÔ ÔÁËÖÅ ËÏÎÔÒÏÌÉÒÏ×ÁÔØÓÑ ÏÒÅÄÅÌÅ ÎÉÅÍ ÉÈ × ÒÏÇÒÁÍÍÎÙÈ ÅÄÉÎÉ ÁÈ, ÉÚ×ÅÓÔÎÙÈ ËÁË . ÷ÅÌÉ ÞÉÎÙ, ÏÒÅÄÅÌÅÎÎÙÅ × ÍÏÄÕÌÑÈ, ÍÏÇÕÔ ÂÙÔØ ËÁË ÏÂÝÅÄÏÓÔÕÎÙÍÉ ( ), ÄÏÓÔÕ Ë ËÏÔÏÒÙÍ ÒÁÚÒÅÛÅÎ ÉÚ×ÎÅ ÍÏÄÕÌÑ, ÉÌÉ ÌÏËÁÌØ ÎÙÍÉ ( ), ÄÏÓÔÕÎÙÅ ÔÏÌØËÏ ×ÎÕÔÒÉ ÍÏÄÕÌÑ. ÁËÏÊ ÏÄÈÏÄ ÄÁÅÔ ×ÏÚÍÏÖÎÏÓÔØ ÏÒÅÄÅÌÑÔØ ÒÏÇÒÁÍÍÎÙÅ ÅÄÉÎÉ Ù, ÎÅÚÁ×ÉÓÉ ÍÙÅ ÄÒÕÇ ÏÔ ÄÒÕÇÁ, ×ÚÁÉÍÏÄÅÊÓÔ×ÕÀÝÉÅ ÄÒÕÇ Ó ÄÒÕÇÏÍ ÎÅËÉÍ ÚÁ ÒÁÎÅÅ ÏÇÏ×ÏÒÅÎÎÙÍ ÓÏÓÏÂÏÍ, ÏÚ×ÏÌÑÀÝÉÈ ÄÏÂÒÁÔØÓÑ ÄÏ ÏÂÝÅÄÏ ÓÔÕÎÙÈ ×ÅÌÉÞÉÎ. ðÒÉÍÅÎÅÎÉÅ ÍÏÄÕÌÅÊ ÄÅÌÁÅÔ ×ÏÚÍÏÖÎÙÍÉ ÉÚÍÅ ÎÅÎÉÑ ×ÎÕÔÒÅÎÎÅÇÏ ÓÏÄÅÒÖÁÎÉÑ ÍÏÄÕÌÅÊ ÂÅÚ ÚÁÔÒÁÇÉ×ÁÎÉÑ ÄÒÕÇÉÈ ÞÁÓÔÅÊ ÒÏÇÒÁÍÍÎÏÇÏ ÏÂÅÓÅÞÅÎÉÑ. ï ÌÏËÁÌØÎÙÈ ×ÅÌÉÞÉÎÁÈ, ÏÒÅ ÄÅÌÅÎÎÙÈ × ÍÏÄÕÌÅ, ÇÏ×ÏÒÑÔ, ÞÔÏ ÏÎÉ ¾ÉÎËÁÓÕÌÉÒÏ×ÁÎÙ × ÍÏÄÕÌÅ¿.
ÍÏÄÕÌÉ
publi
private
5.2. íÏÄÕÌÉ: ÜËÓÏÒÔ É ÉÍÏÒÔ
ÍÏÄÕÌÅÊ
ðÒÏÇÒÁÍÍÁ ÎÁ ÑÚÙËÅ Haskell Ñ×ÌÑÅÔÓÑ ËÏÌÌÅË ÉÅÊ . ïÓÎÏ×ÎÏÅ ÎÁÚÎÁÞÅÎÉÅ ÍÏÄÕÌÅÊ ÓÏÓÔÏÉÔ × ÉÎËÁÓÕÌÉÒÏ×ÁÎÉÉ ÄÁÎ ÎÙÈ, ÞÔÏ ÏÚ×ÏÌÑÅÔ ÏÓÕÝÅÓÔ×ÌÑÔØ ËÏÎÔÒÏÌØ ÎÁÄ ÒÏÓÔÒÁÎÓÔ×ÏÍ ÉÍÅÎ É ÓÏÚÄÁ×ÁÔØ ÁÂÓÔÒÁËÔÎÙÅ ÔÉÙ ÄÁÎÎÙÈ. éÍÅÎÁ ÍÏÄÕÌÅÊ ÓÏÓÔÏÑÔ ÉÚ ÁÌÆÁ×ÉÔÎÙÈ ÓÉÍ×ÏÌÏ×, ÎÁÞÉÎÁÑÓØ ÒÉ ÜÔÏÍ Ó ÚÁÇÌÁ×ÎÏÊ ÂÕË×Ù. îÅÔ ÎÉËÁËÏÊ ÆÏÒÍÁÌØÎÏÊ Ó×ÑÚÉ ÍÅÖ ÄÕ ÉÍÅÎÁÍÉ ÍÏÄÕÌÅÊ É ÆÁÊÌÏ×ÏÊ ÓÉÓÔÅÍÏÊ. ÷ ÞÁÓÔÎÏÓÔÉ ÎÅÔ Ó×Ñ ÚÉ ÍÅÖÄÕ ÉÍÅÎÅÍ ÍÏÄÕÌÑ É ÉÍÅÎÅÍ ÆÁÊÌÁ, × ËÏÔÏÒÏÍ ÓÏÄÅÒÖÉÔÓÑ ÏÉÓÁÎÉÅ ÍÏÄÕÌÑ. îÏ ÏÂÙÞÎÏ ×ÓÅ ÖÅ ÒÉÄÅÒÖÉ×ÁÀÔÓÑ
ÓÏÇÌÁÛÅÎÉÑ Ï ×ÚÁÉÍÎÏ-ÏÄÎÏÚÎÁÞÎÏÍ ÓÏÏÔ×ÅÔÓÔ×ÉÉ ÍÅÖÄÕ ÉÍÅÎÁÍÉ ÍÏÄÕÌÑ É ÆÁÊÌÁ.
ðÏ ÄÏÇÏ×ÏÒÅÎÎÏÓÔÉ, ËÁÖÄÙÊ ÍÏÄÕÌØ ÒÁÚÍÅÝÁÀÔ × ÏÔÄÅÌØÎÏÍ ÆÁÊÌÅ, ÒÉÞÅÍ ÉÍÑ ÆÁÊÌÁ ÓÏ×ÁÄÁÅÔ Ó ÉÍÅÎÅÍ ÍÏÄÕÌÑ Ó ÔÏÞÎÏ ÓÔØÀ ÄÏ ÒÁÓÛÉÒÅÎÉÑ (ÄÏÂÁ×ÌÑÅÔÓÑ ÌÉÂÏ .hs, ÌÉÂÏ .lhs). ÁË, ÎÁ ÒÉÍÅÒ, ÍÏÄÕÌØ De imalNumerals ÄÏÌÖÅÎ ÒÁÚÍÅÝÁÔØÓÑ × ÆÁÊÌÅ De imalNumerals.hs (ÉÌÉ De imalNumerals.lhs). åÓÔØ ÅÄÉÎÓÔ×ÅÎ ÎÏÅ ÉÓËÌÀÞÅÎÉÅ: ÅÓÌÉ ÜÔÏ ÇÌÁ×ÎÙÊ ÍÏÄÕÌØ ÒÏÇÒÁÍÍÙ (Main), ÔÏ ÉÍÑ ÆÁÊÌÁ ÏÂÙÞÎÏ ÏÔÒÁÖÁÅÔ ÎÁÚÎÁÞÅÎÉÅ ÄÁÎÎÏÊ ÒÏÇÒÁÍÍÙ, ÉÎÁÞÅ ÉÍÅÌÏÓØ ÂÙ ÏÇÒÏÍÎÏÅ ÞÉÓÌÏ ÆÁÊÌÏ× Ó ÎÁÚ×ÁÎÉÅÍ Main.hs.
5. éÎËÁÓÕÌÑ ÉÑ ÄÁÎÎÙÈ × ÍÏÄÕÌÑÈ
225
÷ÅÌÉÞÉÎÙ É ÔÉÙ ÎÅ ÓÍÅÛÉ×ÁÀÔÓÑ × Haskell ÷ ÜÔÏÍ ÑÚÙËÅ ÅÓÔØ ÛÅÓÔØ ÒÏÄÏ× ÉÍÅÎ: ÄÌÑ ÅÒÅÍÅÎÎÙÈ É ËÏÎÓÔÒÕËÔÏÒÏ×, ÏÂÏÚÎÁÞÁÀÝÉÈ ×ÅÌÉÞÉ ÎÙ (ËÏÎÓÔÒÕËÔÏÒÏ× ÄÁÎÎÙÈ), ÄÌÑ ÔÉÏ×ÙÈ ÅÒÅÍÅÎÎÙÈ, ÄÌÑ ËÏÎÓÔÒÕËÔÏÒÏ× ÔÉÁ, ÄÌÑ ËÌÁÓÓÏ× ÔÉÏ× É ÉÍÅÎÁ ÍÏÄÕÌÅÊ. ðÒÉ ÉÈ ÉÓÏÌØÚÏ×ÁÎÉÉ ÒÉÄÅÒÖÉ×ÁÀÔÓÑ ÓÌÅÄÕÀÝÉÈ ÓÉÎÔÁË ÓÉÞÅÓËÉÈ ÒÁ×ÉÌ. éÍÅÎÁ ÅÒÅÍÅÎÎÙÈ (×ÅÌÉÞÉÎ) É ÔÉÏ×ÙÈ ÅÒÅÍÅÎÎÙÈ ÎÁÞÉ ÎÁÀÔÓÑ Ó ÍÁÌÅÎØËÏÊ ÌÁÔÉÎÓËÏÊ ÂÕË×Ù ÉÌÉ ÏÄÞÅÒËÉ×ÁÎÉÑ; ÄÒÕÇÉÅ ÞÅÔÙÒÅ ×ÉÄÁ ÉÍÅÎ ÎÁÞÉÎÁÀÔÓÑ Ó ÚÁÇÌÁ×ÎÏÊ ÂÕË×Ù. éÍÅÎÁ -ËÏÎÓÔÒÕËÔÏÒÏ× ÄÏÌÖÎÙ ÎÁÞÉÎÁÔØÓÑ Ó ÓÉÍ×ÏÌÁ : (Ä×ÏÅÔÏÞÉÅ), ÉÍÅÎÁ ÄÒÕÇÉÈ ÏÅÒÁÔÏÒÏ× ÎÅ ÄÏÌÖÎÙ ÎÁÞÉÎÁÔØÓÑ Ó Ä×ÏÅÔÏÞÉÑ.
ÏÅÒÁÔÏÒÏ×
ÜÔÏ ÓËÒÉÔ, ËÏÔÏÒÙÊ ÒÅÄÎÁÚÎÁÞÅÎ ÄÌÑ ÏÒÅÄÅÌÅ ÎÉÑ ÎÅËÏÔÏÒÙÈ ÓÕÝÎÏÓÔÅÊ, ÒÅÄÎÁÚÎÁÞÅÎÎÙÈ ÄÌÑ ÉÓÏÌØÚÏ×ÁÎÉÑ ( ) × ÄÒÕÇÉÈ ÓËÒÉÔÁÈ, É ÓËÒÙ×ÁÀÝÉÊ ÒÉ ÜÔÏÍ ×ÓÅ ÏÒÅ ÄÅÌÅÎÉÑ ×ÎÕÔÒÉ ÓÅÂÑ. äÒÕÇÏÊ ÍÏÄÕÌØ, ÏÄÏÂÎÙÅ ÓÕÝÎÏÓÔÉ, ÍÏÖÅÔ ÉÈ ÉÓÏÌØÚÏ×ÁÔØ, ÎÏ ÎÅ ÉÍÅÅÔ ÄÏÓÔÕÁ Ë ÉÈ ÏÒÅ ÄÅÌÅÎÉÑÍ. íÏÄÕÌØ ÎÁÞÉÎÁÅÔÓÑ Ó ËÌÀÞÅ×ÏÇÏ ÓÌÏ×Á module, ÚÁ ËÏÔÏÒÙÍ ÓÌÅ ÄÕÅÔ ÉÍÑ ÍÏÄÕÌÑ. ðÏÓÌÅ ÉÍÅÎÉ ÍÏÄÕÌÑ ÓÌÅÄÕÅÔ ÓÉÓÏË ÜËÓÏÒÔÁ, Ô. Å. ÅÒÅÞÅÎØ ÓÕÝÎÏÓÔÅÊ (ÔÉÏ× ÄÁÎÎÙÈ, ÆÕÎË ÉÊ), ËÏÔÏÒÙÅ ÂÕÄÕÔ ×ÉÄÎÙ ÒÉ ÉÍÏÒÔÅ ÜÔÏÇÏ ÍÏÄÕÌÑ, ÚÁËÌÀÞÅÎÎÙÊ × ËÒÕÇÌÙÅ ÓËÏ ËÉ. ÷ÓÅ ×ÅÌÉÞÉÎÙ, ÉÓÏÌØÚÕÅÍÙÅ × ÍÏÄÕÌÅ É ÎÅ ×ÏÛÅÄÛÉÅ × ÓÉ ÓÏË ÜËÓÏÒÔÁ, Ñ×ÌÑÀÔÓÑ ÌÏËÁÌØÎÙÍÉ É ÎÅ ÄÏÓÔÕÎÙ ÉÚ×ÎÅ ÍÏÄÕÌÑ. ëÌÀÞÅ×ÏÅ ÓÌÏ×Á where, ÓÌÅÄÕÀÝÅÅ ÓÒÁÚÕ ÚÁ ÓÉÓËÏÍ ÜËÓÏÒÔÁ, ÁË ÔÉ×ÉÒÕÅÔ ËÏÎÔÅËÓÔ, ÏÜÔÏÍÕ ×ÓÅ ÎÉÖÅÒÁÓÏÌÏÖÅÎÎÙÅ ÄÅËÌÁÒÁ ÉÉ (ËÁË ÒÁ ×ÉÌÏ, Ó ÅÒ×ÏÊ). ÷ÏÔ ÒÉÍÅÒ ÍÏÄÕÌÑ, ÎÏÓÑÝÅÇÏ ÎÁÚ×ÁÎÉÅ Tree. üÔÏÔ ÍÏÄÕÌØ Ñ×ÎÏ ÜËÓÏÒÔÉÒÕÅÔ ËÏÎÓÔÒÕËÔÏÒ ÔÉÁ Tree ×ÍÅÓÔÅ Ó ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÉÍÉ ËÏÎÓÔÒÕËÔÏÒÁÍÉ ÄÁÎÎÙÈ Leaf, Bran h É ÆÕÎË ÉÀ fringe: íÏÄÕÌØ
ÜËÓÏÒÔÁ
ÉÍÏÒÔÉÒÕÀÝÉÊ
ÄÏÌÖÎÙ ÎÁÞÉÎÁÔØÓÑ ÏÄÎÏÊ É ÔÏÊ ÖÅ ÏÚÉ ÉÉ ÓÔÒÏËÉ
module Tree ( Tree (Leaf, Bran h), fringe ) where data Tree a = Leaf a | Bran h (Tree a) (Tree a)
VII. Haskell ËÁË ÑÚÙË ïïð
226
fringe :: Tree a -> [a℄ fringe (Leaf x) = [x℄ fringe (Bran h left right) = fringe left ++ fringe right ïÉÓÁÎÎÙÊ ÚÄÅÓØ ÔÉ ÄÁÎÎÙÈ Tree ÈÒÁÎÉÔ ÉÎÆÏÒÍÁ ÉÀ × ÌÉÓÔØÑÈ; ÆÕÎË ÉÑ fringe ¾ÒÁÚÇÌÁÖÉ×ÁÅÔ¿ ÄÅÒÅ×Ï, ÒÅ×ÒÁÝÁÑ ÅÇÏ × ÓÉÓÏË. úÁÍÅÔÉÍ, ÞÔÏ ÚÄÅÓØ ÍÙ ÉÓÏÌØÚÏ×ÁÌÉ ÏÄÎÏ É ÔÏÖÅ ÉÍÑ ÄÌÑ ÏÂÏÚÎÁ ÞÅÎÉÑ ÍÏÄÕÌÑ É ÔÉÁ ÄÁÎÎÙÈ. ðÏÄÏÂÎÙÅ ÓÏ×ÁÄÅÎÉÑ ÄÏÕÓÔÉÍÙ, ÔÁË ËÁË ÏÎÉ ÎÅ ÒÉ×ÏÄÑÔ Ë ËÏÎÆÌÉËÔÁÍ ÉÍÅÎ. íÏÄÕÌÉ ÍÏÖÎÏ × ÄÒÕÇÉÅ ÍÏÄÕÌÉ É ÓËÒÉÔÙ. äÅËÌÁÒÁ ÉÑ ÉÍÏÒÔÁ ÄÏÌÖÎÁ ÂÙÔØ × ÆÁÊÌÅ, Ô. Å. ÒÁÚÍÅÝÁÔØÓÑ ÓÒÁÚÕ ÏÓÌÅ ÄÅËÌÁÒÁ ÉÉ ÍÏÄÕÌÑ (ÎÁÏÍÎÉÍ, ÞÔÏ ËÏÍÍÅÎÔÁÒÉÉ ÄÏÕÓËÁÀÔÓÑ × ÌÀÂÏÍ ÍÅÓÔÅ ÒÏÇÒÁÍ ÍÙ, ÇÄÅ ÍÏÖÎÏ ×ÓÔÁ×ÉÔØ ÒÏÂÅÌ):
ÉÍÏÒÔÉÒÏ×ÁÔØ
ÔÏÒÏÍ
ÅÒ×ÙÍ ×ÙÏÌÎÑÅÍÙÍ ÏÅÒÁ
module Main where {íÏÄÕÌØ Main ÉÍÏÒÔÉÒÕÅÔ ÍÏÄÕÌØ Tree -} import Tree (Tree( Leaf, Bran h), fringe) t1 :: Tree Int t1 = Bran h (Leaf 2) (Bran h (Leaf 3)(Leaf 4))
H
ó ÉÍÏÒÔÉÒÏ×ÁÎÎÙÍ ÔÉÏÍ ÄÁÎÎÙÈ É ÆÕÎË ÉÑÍÉ ÍÏÖÎÏ ÏÅÒÉÒÏ ×ÁÔØ ÔÁË, ÓÌÏ×ÎÏ ÏÎÉ ÏÒÅÄÅÌÅÎÙ × ÜÔÏÍ ÍÏÄÕÌÅ:
---> fringe t1 [2,3,4℄ éÍÏÒÔÉÒÏ×ÁÔØ ÍÏÄÕÌÉ ÍÏÖÎÏ ÎÅ ÔÏÌØËÏ × ÍÏÄÕÌÉ, ÎÏ É × ÓËÒÉ ÔÙ, Ñ×ÌÑÀÝÉÅÓÑ ÒÏÓÔÏ ÎÁÂÏÒÏÍ ÆÕÎË ÉÊ:
-- óËÒÉÔ ÉÍÏÒÔÉÒÕÅÔ ÍÏÄÕÌØ Tree import Tree (Tree( Leaf, Bran h), fringe) t2 :: Tree Int t2 = Bran h (Leaf 2) (Leaf 4)
H
÷ÙÚÏ× ÆÕÎË ÉÊ ÉÚ ÔÁËÏÇÏ ÓËÒÉÔÁ ÎÉÞÅÍ ÎÅ ÏÔÌÉÞÁÅÔÓÑ ÏÔ ÒÅÄÙ ÄÕÝÅÇÏ ÓÌÕÞÁÑ:
---> fringe t2 [2,4℄
5. éÎËÁÓÕÌÑ ÉÑ ÄÁÎÎÙÈ × ÍÏÄÕÌÑÈ
227
ÄÅËÌÁÒÁ ÉÑ
, ÒÁÚÍÅÝÁ
úÁ ÉÓËÌÀÞÅÎÉÅÍ ÔÏÇÏ ÆÁËÔÁ, ÞÔÏ import , ÏÓÔÁÌØÎÙÅ ÄÅËÌÁÒÁ ÉÉ (data, newtype É type ÄÅËÌÁ ÒÁ ÉÉ, lass É instan e ÄÅËÌÁÒÁ ÉÉ, ÓÉÇÎÁÔÕÒÙ ÔÉÏ×, ÏÒÅÄÅÌÅ ÎÉÑ ÆÕÎË ÉÊ É Ô. Ä.) ÍÏÇÕÔ ÒÁÚÍÅÝÁÔØÓÑ × ÒÏÉÚ×ÏÌØÎÏÍ ÏÒÑÄ ËÅ. íÏÖÎÏ ÓËÁÚÁÔØ, ÞÔÏ ÍÏÄÕÌØ × ÄÅÊÓÔ×ÉÔÅÌØÎÏÓÔÉ Ñ×ÌÑÅÔÓÑ ÏÄ ÎÏÊ ÂÏÌØÛÏÊ ÄÅËÌÁÒÁ ÉÅÊ, ËÏÔÏÒÁÑ ÎÁÞÉÎÁÅÔÓÑ Ó ËÌÀÞÅ×ÏÇÏ ÓÌÏ×Á module. åÓÌÉ ÜËÓÏÒÔÉÒÕÅÍÙÊ ÓÉÓÏË, ÓÌÅÄÕÀÝÉÊ ÚÁ ËÌÀÞÅ×ÙÍ ÓÌÏ×ÏÍ module ÏÔÓÕÔÓÔ×ÕÅÔ, ÔÏ ÉÍÅÎÁ × ÒÁÍËÁÈ ×ÅÒÈÎÅÇÏ ÕÒÏ×ÎÑ ÍÏ ÄÕÌÑ ÂÕÄÕÔ ÜËÓÏÒÔÉÒÏ×ÁÎÙ. ðÒÉ ÉÍÏÒÔÅ ÍÏÄÕÌÑ ÎÅ ÏÂÑÚÁÔÅÌØÎÏ ÉÍÏÒÔÉÒÏ×ÁÔØ ×ÓÅ ÅÇÏ ÆÕÎË ÉÉ, ×ËÌÀÞÅÎÎÙÅ × ÓÉÓÏË ÜËÓÏÒÔÁ: ÄÏÓÔÁÔÏÞÎÏ ÕËÁÚÁÔØ ÔÏÌØËÏ ÔÅ, ËÏÔÏÒÙÅ ÂÕÄÕÔ ÉÓÏÌØÚÏ×ÁÔØÓÑ.
ÅÔÓÑ ÅÒ×ÏÊ
×ÓÅ
I õÒÁÖÎÅÎÉÅ VII.5.1
ðÕÓÔØ ÍÏÄÕÌØ Ex1 ÓÏÄÅÒÖÉÔ ÓÌÅÄÕÀÝÉÅ ÏÒÅÄÅÌÅÎÉÑ:
module Ex1 (f, g) where f :: Int -> Int f x = (g . g) x g x = x * x ÁË ËÁË ×ÓÅ ÆÕÎË ÉÉ, ÏÒÅÄÅÌÅÎÎÙÅ × ÎÅÍ ×ËÌÀÞÅÎÙ × ÓÉÓÏË ÜËÓ ÏÒÔÁ, ÔÏ ÅÇÏ ÍÏÖÎÏ ÎÅ ÕËÁÚÙ×ÁÔØ:
module Ex1 where f :: Int -> Int f x = (g . g) x g x = x * x
÷ ÍÏÄÕÌØ MainEx1 ×ËÌÀÞÉÍ ÄÅËÌÁÒÁ ÉÀ ÉÍÏÒÔÁ ÍÏÄÕÌÑ Ex1, ÒÉ ÞÅÍ ÉÍÏÒÔÉÒÕÅÍ ÔÏÌØËÏ ÏÄÎÕ ÉÚ Ä×ÕÈ ÄÏÓÔÕÎÙÈ ÎÁÍ ÆÕÎË ÉÊ:
module MainEx1 where import Ex1 (f) ÅÅÒØ ÆÕÎË ÉÑ f ÄÏÓÔÕÎÁ, Á ÆÕÎË ÉÑ g ÎÅÔ:
---> f 3 81 ---> g 3 ERROR - Undefined variable "g"
H J
228
VII. Haskell ËÁË ÑÚÙË ïïð
éÍÅÎÁ, ×ËÌÀÞÅÎÎÙÅ × ÓÉÓÏË ÜËÓÏÒÔÁ, ÎÅ ÍÏÇÕÔ ÂÙÔØ ÌÏËÁÌØ ÎÙÍÉ ÏÒÅÄÅÌÅÎÉÑÍÉ.
I õÒÁÖÎÅÎÉÅ VII.5.2
ðÕÓÔØ × ÍÏÄÕÌÅ Ex2 ÏÒÅÄÅÌÅÎÉÅ ÆÕÎË ÉÉ f ÉÓÏÌØÚÕÅÔ ÌÏËÁÌØÎÕÀ ÅÒÅÍÅÎÎÕÀ g. ïÔÓÕÔÓÔ×ÉÅ ÓÉÓËÁ ÜËÓÏÒÔÁ ÏÚÎÁÞÁÅÔ ÜËÓÏÒÔ ×ÓÅÈ ÄÏÓÔÕÎÙÈ ÏÒÅÄÅÌÅÎÉÊ:
module Ex2 where f x = (g . g) x where g x = x * x
H
÷ ÍÏÄÕÌØ MainEx2 ÏÒÏÂÕÅÍ ÉÍÏÒÔÉÒÏ×ÁÔØ ÆÕÎË ÉÉ f É g:
module MainEx2 where import Ex2 (f, g) ðÒÉ ÏÙÔËÅ ÚÁÇÒÕÚÉÔØ ÜÔÏÔ ÍÏÄÕÌØ ÂÕÄÅÔ ×ÙÄÁÎÏ ÓÏÏÂÝÅÎÉÅ Ï ÏÛÉÂËÅ, ÉÎÆÏÒÍÉÒÕÀÝÅÅ Ï ÏÔÓÕÔÓÔ×ÉÉ ÆÕÎË ÉÉ g ÓÒÅÄÉ ×ÓÅÈ ÓÕÝ ÎÏÓÔÅÊ, ÜËÓÏÒÔÉÒÏ×ÁÎÎÙÈ ÉÚ ÍÏÄÕÌÑ Ex2:
ERROR "MainEx2.hs" - Unknown entity "g" imported from module "Ex2" ðÏÑ×ÌÅÎÉÅ ÜÔÏÇÏ ÓÏÏÂÝÅÎÉÑ Ó×ÑÚÁÎÏ Ó ÔÅÍ, ÞÔÏ ÌÏËÁÌØÎÏ ÏÒÅÄÅ ÌÅÎÎÁÑ ÆÕÎË ÉÑ g ÎÅ ×ÉÄÎÁ ÒÉ ÜËÓÏÒÔÅ.
J
üËÓÏÒÔÉÒÕÅÍÙÊ ÔÉ ÄÁÎÎÙÈ É ÅÇÏ ËÏÎÓÔÒÕËÔÏÒÙ ÄÏÌÖÎÙ ÂÙÔØ ÓÇÒÕÉÒÏ×ÁÎÙ ×ÍÅÓÔÅ, ÎÁÒÉÍÅÒ, Tree(Leaf, Bran h). ÷ ÂÏÌÅÅ ËÏÒÏÔËÏÊ ÆÏÒÍÅ ÜÔÏ ÍÏÖÅÔ ÂÙÔØ ÚÁÉÓÁÎÏ ÔÁË: Tree(..). üÓÏÒÔ ÔÏÌØËÏ ÎÅËÏÔÏÒÏÇÏ ÏÄÍÎÏÖÅÓÔ×Á (ÄÁÖÅ ÕÓÔÏÇÏ) ËÏÎÓÔÒÕËÔÏÒÏ× ÔÁËÖÅ ×ÏÚÍÏÖÅÎ. óÏËÒÙÔÉÅ ËÏÎÓÔÒÕËÔÏÒÏ× ÄÁÎÎÙÈ É ÜËÓÏÒÔ ÏÄÎÏ ÇÏ ÌÉÛØ ËÏÎÓÔÒÕËÔÏÒÁ ÔÉÁ ÉÓÏÌØÚÕÅÔÓÑ ÒÉ ÓÏÚÄÁÎÉÉ . óÉÓÏË ÉÍÏÒÔÁ ÍÏÖÅÔ ÓÏÄÅÒÖÁÔØ ÔÏÌØËÏ ÔÅ ÓÕÝÎÏÓÔÉ, ËÏÔÏÒÙÅ ×ËÌÀÞÅÎÙ × ÓÉÓÏË ÜËÓÏÒÔÁ ÄÁÎÎÏÇÏ ÍÏÄÕÌÑ. ÷ ÓÉÓÏË ÉÍÏÒÔÁ ÖÅÌÁÔÅÌØÎÏ ×ËÌÀÞÁÔØ ÔÏÌØËÏ ÔÅ ÓÕÝÎÏÓÔÉ, ËÏÔÏÒÙÅ ÄÅÊÓÔ×ÉÔÅÌØ ÎÏ ÏÔÒÅÂÕÀÔÓÑ × ÒÁÂÏÔÅ, ÎÅ ÏÂÑÚÁÔÅÌØÎÏ ÅÒÅÞÉÓÌÑÔØ × ÎÅÍ ×ÅÓØ ÓÉÓÏË ÜËÓÏÒÔÁ. óÉÓÏË ÉÍÏÒÔÁ ÍÏÖÅÔ ÂÙÔØ ÄÁÖÅ ÕÓÔÙÍ, × ÜÔÏÍ ÓÌÕÞÁÅ ÉÍÏÒÔÉÒÕÅÔÓÑ ×ÓÅ ÓÏÄÅÒÖÉÍÏÅ ÓÉÓËÁ ÜËÓÏÒÔÁ.
ÎÏÇÏ ÔÉÁ ÄÁÎÎÙÈ
ÁÂÓÔÒÁËÔ
5. éÎËÁÓÕÌÑ ÉÑ ÄÁÎÎÙÈ × ÍÏÄÕÌÑÈ
229
ÉÓËÌÀÞÅÎÙ
îÅËÏÔÏÒÙÅ ÓÕÝÎÏÓÔÉ ÍÏÇÕÔ ÂÙÔØ Ñ×ÎÏ ÉÚ ÓÉÓËÁ ÉÍ ÏÒÔÁ Ó ÏÍÏÝØÀ ËÏÎÓÔÒÕË ÉÉ hiding (name1, name2, ...), ÇÄÅ name1, name2 É ÔÁË ÄÁÌÅÅ, ÅÓÔØ ÉÍÅÎÁ ¾ÓËÒÙ×ÁÅÍÙÈ¿ ÓÕÝÎÏÓÔÅÊ. íÏÄÕÌØ Ó ÎÁÚ×ÁÎÉÅÍ Prelude Ï ÕÍÏÌÞÁÎÉÀ ÉÍÏÒÔÉÒÕÅÔÓÑ ×Ï ×ÓÅ ÒÏÇÒÁÍÍÙ. íÙ ÕÖÅ ÉÓÏÌØÚÏ×ÁÌÉ ÒÁÎÅÅ × ÎÁÛÉÈ ÒÏÇÒÁÍ ÍÁÈ ÓÔÒÏËÕ ÉÍÏÒÔÁ ÆÁÊÌÁ Prelude Ó ÕËÁÚÁÎÉÅÍ ËÌÀÞÅ×ÏÇÏ ÓÌÏ×Á hiding (hide ÒÑÔÁÔØ) ÄÌÑ ÔÏÇÏ, ÞÔÏÂÙ ÓËÒÙÔØ Á×ÔÏÍÁÔÉÞÅÓËÉ ÚÁÇÒÕÖÅÎÎÏÅ ÏÒÅÄÅÌÅÎÉÅ ÔÏÊ ÉÌÉ ÉÎÏÊ ÆÕÎË ÉÉ.
5.3. ëÏÎÔÒÏÌØ ÒÏÓÔÒÁÎÓÔ×Á ÉÍÅÎ åÓÔØ ÎÅËÏÔÏÒÁÑ ÒÏÂÌÅÍÁ, Ó×ÑÚÁÎÎÁÑ Ó ÉÍÏÒÔÏÍ ÉÍÅÎ ÏÄÎÏÇÏ ÍÏÄÕÌÑ × ÒÏÓÔÒÁÎÓÔ×Ï ÉÍÅÎ ÄÒÕÇÏÇÏ ÍÏÄÕÌÑ. þÔÏ ÒÏÉÚÏÊÄÅÔ, ÅÓ ÌÉ Ä×Á ÉÍÏÒÔÉÒÕÅÍÙÈ ÍÏÄÕÌÑ ÓÏÄÅÒÖÁÔ ÏÔÌÉÞÎÙÅ ÄÒÕÇ ÏÔ ÄÒÕÇÁ ÏÒÅÄÅÌÅÎÉÑ, ÎÏ ÎÁÚ×ÁÎÎÙÅ ÏÄÎÉÍ É ÔÅÍ ÖÅ ÉÍÅÎÅÍ? Haskell ÒÅÛÁ ÅÔ ÜÔÕ ÒÏÂÌÅÍÕ Ó ÏÍÏÝØÀ Ë×ÁÌÉÆÉËÁÔÏÒÁ ÉÍÅÎ qualified. ïÂßÑ×ÌÅÎÉÅ ÉÍÏÒÔÁ ÍÏÖÅÔ ÓÏÄÅÒÖÁÔØ ËÌÀÞÅ×ÏÅ ÓÌÏ×Ï qualified, ÏÚ×ÏÌÑÀÝÅÅ ÕËÁÚÁÔØ ÉÍÑ ÉÍÏÒÔÉÒÏ×ÁÎÎÏÇÏ ÍÏÄÕÌÑ ÅÒÅÄ ÉÍÅÎÅÍ ÍÅÔÏÄÁ, ÒÁÚÄÅÌÑÑ ÉÈ ÓÉÍ×ÏÌÏÍ . (ÔÏÞËÁ). ïÂÒÁÔÉÔÅ ×ÎÉÍÁÎÉÅ ÎÁ ÏÔÓÕÔÓÔ×ÉÅ ÒÏÂÅÌÏ× ÍÅÖÄÕ ÉÍÅÎÁÍÉ ÍÏÄÕÌÑ, ÍÅÔÏÄÁ É ÔÏÞËÏÊ. óÌÅÄÕÀÝÉÅ Ä×Å ÓÉÎÔÁËÓÉÞÅÓËÉÅ ËÏÎÓÔÒÕË ÉÉ ÉÍÅÀÔ ÓÏ ×ÅÒÛÅÎÎÏ ÒÁÚÎÙÊ ÓÍÙÓÌ: A.x ÅÓÔØ ÏÇÒÁÎÉÞÅÎÉÅ ÉÍÅÎÉ, × ÔÏ ×ÒÅÍÑ ËÁË A . x ÒÉÍÅÎÅÎÉÅ ÉÎÆÉËÓÎÏÊ ÆÕÎË ÉÉ . (ËÏÍÏÚÉ ÉÑ). ðÏÓÍÏÔÒÉÍ ÎÁ ÒÉÍÅÒ ÉÓÏÌØÚÏ×ÁÎÉÑ Ë×ÁÌÉÆÉËÁÔÏÒÁ × ÄÅËÌÁ ÒÁ ÉÉ ÉÍÏÒÔÁ. ðÕÓÔØ × ÍÏÄÕÌÅ Fringe, ÔÁËÖÅ, ËÁË É × ÍÏÄÕÌÅ Tree, ÏÒÅÄÅÌÅÎÁ ÆÕÎË ÉÑ fringe:
module Fringe(fringe) where import Tree(Tree(..))
fringe :: Tree a -> [a℄ -- ÄÒÕÇÏÅ ÏÒÅÄÅÌÅÎÉÅ fringe fringe (Leaf x) = [x℄ fringe (Bran h x y) = fringe x íÏÄÕÌØ Main
ÉÍÏÒÔÉÒÕÅÔ ÆÕÎË ÉÀ fringe ÉÚ Ä×ÕÈ ÍÏÄÕÌÅÊ:
module Main where import Tree ( Tree(Leaf,Bran h), fringe ) import qualified Fringe ( fringe ) l1 = fringe (Bran h (Leaf 1) (Leaf 2)) l2 = Fringe.fringe (Bran h (Leaf 1) (Leaf 2))
VII. Haskell ËÁË ÑÚÙË ïïð
230
H
óÉÓÏË l1 ÏÌÕÞÅÎ Ó ÏÍÏÝØÀ ÆÕÎË ÉÉ fringe ÉÚ ÍÏÄÕÌÑ Tree, Á ÓÉÓÏË l2 Ó ÏÍÏÝØÀ ÆÕÎË ÉÉ fringe ÉÚ ÍÏÄÕÌÑ Fringe:
---> :l Reading Reading Reading Reading
Qualified.hs file "Qualified.hs": file "Tree.hs": file "Fringe.hs": file "Qualified.hs":
Hugs session for: /usr/share/hugs/lib/Prelude.hs Tree.hs Fringe.hs Qualified.hs ---> l1 [1,2℄ ---> l2 [1℄ ëÁË ×ÉÄÉÍ, ÎÅÓÍÏÔÒÑ ÎÁ ÏÄÉÎÁËÏ×ÙÅ ÉÍÅÎÁ ÆÕÎË ÉÊ, ×ÙÏÌÎÑÅ ÍÙÅ ÉÍÉ ÄÅÊÓÔ×ÉÑ ÓÏ×ÅÒÛÅÎÎÏ ÒÁÚÌÉÞÎÙ. îÅËÏÔÏÒÙÅ ÒÏÇÒÁÍÍÉÓÔÙ ÒÅÄÏÞÉÔÁÀÔ ÉÓÏÌØÚÏ×ÁÔØ ÓÅ É ÆÉËÁÔÏÒÙ ÉÍÅÎ ×Ï ×ÓÅÈ ÄÅËÌÁÒÁ ÉÑÈ ÉÍÏÒÔÁ, ÞÔÏ ÏÚ×ÏÌÑÅÔ ÏÌ ÎÏÓÔØÀ ÉÚÂÅÖÁÔØ ÎÅÑÓÎÏÓÔÅÊ × ×ÙÚÏ×Å ÍÅÔÏÄÏ×. äÒÕÇÉÅ ÒÅÄÏÞÉÔÁ ÀÔ ËÏÒÏÔËÉÅ ÉÍÅÎÁ É ÉÓÏÌØÚÕÀÔ ÓÅ ÉÆÉËÁÔÏÒÙ ÔÏÌØËÏ × ÓÌÕÞÁÅ ÎÅÏÂÈÏÄÉÍÏÓÔÉ. ÷ÏÚÍÏÖÎÏÓÔØ ÉÓÏÌØÚÏ×ÁÎÉÑ Ë×ÁÌÉÆÉ ÉÒÏ×ÁÎÎÙÈ ÉÍÅÎ ÏÚ×Ï ÌÑÅÔ ÏÌÎÏÓÔØÀ ËÏÎÔÒÏÌÉÒÏ×ÁÔØ ÄÏÓÔÕ Ë ÔÒÅÂÕÅÍÏÍÕ ÏÂßÅËÔÕ, ÞÔÏ ÄÁÅÔ ×ÏÚÍÏÖÎÏÓÔØ ÏÒÅÄÅÌÑÔØ × ÍÏÄÕÌÅ ÆÕÎË ÉÉ É ÄÒÕÇÉÅ ×ÅÌÉÞÉ ÎÙ Ó ÔÅÍÉ ÖÅ ÉÍÅÎÁÍÉ, ÞÔÏ É ÉÍÏÒÔÉÒÕÅÍÙÅ ÓÕÝÎÏÓÔÉ.
I õÒÁÖÎÅÎÉÅ VII.5.3
éÍÏÒÔÉÒÕÅÍ ÍÏÄÕÌØ Prelude, ÕËÁÚÁ× ÒÉ ÜÔÏÍ ËÌÀÞÅ×ÏÅ ÓÌÏ ×Ï qualified. ðÏÓÌÅ ÏÄÏÂÎÏÊ ÄÅËÌÁÒÁ ÉÉ, ÉÍÅÎÁ ×ÓÅÈ ÆÕÎË ÉÊ, ÏÒÅÄÅÌÅÎÎÙÈ × ÒÅÌÀÄÉÉ, ÓÌÅÄÕÅÔ ÕËÁÚÙ×ÁÔØ Ó ÏÍÏÝØÀ ÒÅÆÉË ÓÁ, ÎÏ ÚÁÔÏ ÏÑ×ÉÌÁÓØ ×ÏÚÍÏÖÎÏÓÔØ ÏÒÅÄÅÌÑÔØ ÎÏ×ÙÅ ÆÕÎË ÉÉ (ÉÌÉ ÏÅÒÁÔÏÒÙ) Ó ÔÅÍÉ ÖÅ ÉÍÅÎÁÍÉ:
import qualified Prelude import List xs + ys = xs ++ ys su
= (Prelude.+ 1)
5. éÎËÁÓÕÌÑ ÉÑ ÄÁÎÎÙÈ × ÍÏÄÕÌÑÈ
231
ÅÅÒØ ÄÌÑ ÏÅÒÁ ÉÉ ÓÏÅÄÉÎÅÎÉÑ (¾ÓÌÏÖÅÎÉÑ¿) Ä×ÕÈ ÓÉÓËÏ× ÍÏÖ ÎÏ ÉÓÏÌØÚÏ×ÁÔØ ÒÉ×ÙÞÎÙÊ ÓÉÍ×ÏÌ +. îÏ ÒÉ ÜÔÏÍ ÏÓÔÁÌÁÓØ ×ÏÚ ÍÏÖÎÏÓÔØ ÉÓÏÌØÚÏ×ÁÎÉÑ ÓÔÁÎÄÁÒÔÎÏÇÏ ÏÅÒÁÔÏÒÁ +, ÄÌÑ ÞÅÇÏ ÄÏ ÓÔÁÔÏÞÎÏ ÕËÁÚÁÔØ Ë×ÁÌÉÆÉËÁÔÏÒ ÅÒÅÄ ÅÇÏ ÉÍÅÎÅÍ.
---> [1..3℄ + [3..6℄ [1,2,3,3,4,5,6℄ ---> su
5 6
H
J
ðÒÉ ÉÍÏÒÔÅ ÍÏÖÎÏ ÄÁÔØ ÎÏ×ÏÅ (ÎÁÒÉÍÅÒ, ÂÏÌÅÅ ËÏÒÏÔËÏÅ) ÉÍÑ ÉÍÏÒÔÉÒÕÅÍÏÍÕ ÍÏÄÕÌÀ, ÄÏÂÁ×É× Ë ÄÅËÌÁÒÁ ÉÉ ÉÍÏÒÔÁ ËÌÀÞÅ ×ÏÅ ÓÌÏ×Ï as, ÏÓÌÅ ËÏÔÏÒÏÇÏ ÕËÁÚÙ×ÁÅÔÓÑ ÓÅ×ÄÏÎÉÍ (alias) ÍÏÄÕÌÑ, ÎÁÒÉÍÅÒ:
import qualified Complex as C ðÏÓÌÅ ÔÁËÏÇÏ ÏÂßÑ×ÌÅÎÉÑ ÍÏÖÎÏ ÕÏÔÒÅÂÌÑÔØ ÂÏÌÅÅ ËÏÒÏÔËÉÊ ÒÅ ÆÉËÓ C. ×ÍÅÓÔÏ Complex. ÓÔÁÎÄÁÒÔÎÏÇÏ ÒÅÆÉËÓÁ. äÏÕÓÔÉÍÏ ÉÓ ÏÌØÚÏ×ÁÎÉÅ ÓÅ×ÄÏÎÉÍÏ× É × ÎÅË×ÁÌÉÆÉ ÉÒÏ×ÁÎÎÙÈ ÄÅËÌÁÒÁ ÉÑÈ:
import Foo(f) as A ÅÅÒØ Ë ÉÍÏÒÔÉÒÕÅÍÏÊ ÆÕÎË ÉÉ ÍÏÖÎÏ ÏÂÒÁÝÁÔØÓÑ ËÁË f, ÔÁË É A.f. äÅËÌÁÒÁ ÉÉ ÜËÚÅÍÌÑÒÁ (instan e) ÎÅ ÍÏÇÕÔ ÂÙÔØ ×ËÌÀÞÅÎÙ × ÓÉÓÏË ÜËÓÏÒÔÁ ÉÌÉ ÉÍÏÒÔÁ, ÔÁË ËÁË ×ÓÅ ÔÁËÉÅ ÄÅËÌÁÒÁ ÉÉ, ÓÏÄÅÒ ÖÁÝÉÅÓÑ × ÍÏÄÕÌÅ, É ×ÓÅ ÏÎÉ ÂÕÄÕÔ ×ÉÄÎÙ ÏÓÌÅ ÉÍÏÒÔÁ ÔÁËÏÇÏ ÍÏÄÕÌÑ. îÁÒÑÄÕ Ó ÜËÚÅÍÌÑÒÁÍÉ ËÌÁÓÓÏ×, ÎÅ ÍÏÇÕÔ ÂÙÔØ ÓËÒÙÔÙ ÒÉ ÉÍÏÒÔÅ É ËÌÁÓÓÙ, ÏÒÅÄÅÌÅÎÎÙÅ × ÒÅÌÀ ÄÉÉ (ÓÔÒ. 170). ë×ÁÌÉÆÉËÁÔÏÒ ÉÍÅÎÉ ÔÏÌØËÏ ÉÄÅÎÔÉÆÉ ÉÒÕÅÔ ÍÏÄÕÌØ, ÉÚ ËÏÔÏ ÒÏÇÏ ÒÏÉÚ×ÏÄÉÔÓÑ ÉÍÏÒÔ; ÜÔÏ ÉÍÑ ÍÏÖÅÔ ÏÔÌÉÞÁÔØÓÑ ÏÔ ÉÍÅÎÉ ÔÏÇÏ ÍÏÄÕÌÑ, ÇÄÅ ÄÅÊÓÔ×ÉÔÅÌØÎÏ ÏÒÅÄÅÌÅÎÁ ÜËÓÏÒÔÉÒÕÅÍÁÑ ÓÕÝ ÎÏÓÔØ. îÁÒÉÍÅÒ, ÅÓÌÉ ÍÏÄÕÌØ A ÜËÓÏÒÔÉÒÕÅÔ B. , ÔÏ ÄÌÑ ÄÏÓÔÕÁ Ë ÜÔÏÊ ×ÅÌÉÞÉÎÅ ÓÌÅÄÕÅÔ ÕËÁÚÙ×ÁÔØ A. , Á ÎÅ A.B. .
×ÓÅÇÄÁ ÜËÓÏÒÔÉÒÕÀÔÓÑ
5.4. íÏÄÕÌØ ËÁË ÓÏÓÏ ÒÅÁÌÉÚÁ ÉÉ áä ëÒÏÍÅ ËÏÎÔÒÏÌÉÒÏ×ÁÎÉÑ ÒÏÓÔÒÁÎÓÔ×Á ÉÍÅÎ, ÍÏÄÕÌÉ ÒÅÄÏÓÔÁ ×ÌÑÀÔ ÓÏÓÏ ÏÓÔÒÏÅÎÉÑ ÁÂÓÔÒÁËÔÎÙÈ ÔÉÏ× ÄÁÎÎÙÈ, ÓÏËÒÁÝÅÎÎÏ áä (abstra t data types, ADT). èÁÒÁËÔÅÒÎÏÊ ÞÅÒÔÏÊ ÁÂÓÔÒÁËÔÎÏÇÏ ÔÉÁ ÄÁÎÎÙÈ ÍÏÖÅÔ ÓÞÉÔÁÔØÓÑ ÓÏËÒÙÔÉÅ ÒÅÄÓÔÁ×ÌÅÎÉÑ ÔÉÁ, ×ÓÅ
VII. Haskell ËÁË ÑÚÙË ïïð
232
ÏÅÒÁ ÉÉ Ó áä ÏÓÕÝÅÓÔ×ÌÑÀÔÓÑ ÎÁ ÁÂÓÔÒÁËÔÎÏÍ ÕÒÏ×ÎÅ, ÓËÒÙ×Á ÀÝÉÍ ÒÅÁÌØÎÏÅ ÒÅÄÓÔÁ×ÌÅÎÉÅ ÄÁÎÎÙÈ. ÁË, ÎÁÒÉÍÅÒ, ÈÏÔÑ ÔÉ Tree ÄÏÓÔÁÔÏÞÎÏ ÒÏÓÔ, ÎÏ ÍÙ ÅÇÏ ÅÝÅ ÎÅ ÍÏÖÅÍ ÓÞÉÔÁÔØ ÁÂÓÔÒÁËÔ ÎÙÍ, ÏÔÏÍÕ ÞÔÏ ÒÉ ÒÁÂÏÔÅ Ó ×ÅÌÉÞÉÎÁÍÉ ÜÔÏÇÏ ÔÉÁ ÎÁÍ Ñ×ÎÏ ÒÉÈÏÄÉÔÓÑ ÕËÁÚÙ×ÁÔØ ËÁËÉÅ ËÏÎÓÔÒÕËÔÏÒÙ ÄÁÎÎÙÈ ÔÒÅÂÕÀÔÓÑ ÄÌÑ ÓÏÚÄÁÎÉÑ É ÉÓÏÌØÚÏ×ÁÎÉÑ ×ÅÌÉÞÉÎÙ ÄÁÎÎÏÇÏ ÔÉÁ. ¾èÏÒÏÛÉÊ¿ ÁÂÓÔÒÁËÔÎÙÊ ÔÉ ÏÔÒÁÖÁÅÔ ×ÁÖÎÅÊÛÉÅ Ó×ÏÊÓÔ×Á ÏÂßÅËÔÏ×, ÎÅ ÒÉ×ÌÅËÁÑ ×ÎÉÍÁÎÉÑ Ë ÎÅÓÕÝÅÓÔ×ÅÎÎÙÍ ÄÅÔÁÌÑÍ ÒÅ ÁÌÉÚÁ ÉÉ. äÒÕÇÉÍÉ ÓÌÏ×ÁÍÉ, ÈÏÒÏÛÁÑ ÁÂÓÔÒÁË ÉÑ Ñ×ÎÏ ÏÔÒÁÖÁ ÅÔ ÏÔÒÅÂÎÏÓÔÉ ÏÌØÚÏ×ÁÔÅÌÑ É ÓËÒÙ×ÁÅÔ ÏÓÏÂÅÎÎÏÓÔÉ ÒÅÁÌÉÚÁ ÉÉ. ðÏÄÈÏÄÑÝÉÊ áä, ÒÅÄÎÁÚÎÁÞÅÎÎÙÊ ÄÌÑ ÒÁÂÏÔÙ Ó ÄÒÅ×Ï×ÉÄÎÏÊ ÓÔÒÕËÔÕÒÏÊ, ÍÏÖÅÔ ×ËÌÀÞÁÔØ ÓÌÅÄÕÀÝÉÅ ÏÅÒÁ ÉÉ (ÉÚ ÅÒÅÞÎÑ ËÏ ÔÏÒÙÈ É ÆÏÒÍÉÒÕÅÔÓÑ ÓÉÓÏË ÜËÓÏÒÔÁ):
data Tree a leaf bran h
ell left, right isLeaf
-:: :: :: :: ::
ÔÏÌØËÏ ÉÍÑ ÔÉÁ a -> Tree a Tree a -> Tree a -> Tree a Tree a -> a Tree a -> Tree a Tree a -> Bool
íÏÄÕÌØ, ÏÚ×ÏÌÑÀÝÉÊ ÒÁÂÏÔÁÔØ Ó ÜÔÉÍ áä, ÍÏÖÅÔ ×ÙÇÌÑÄÅÔØ ÔÁË:
module TreeADT (Tree, leaf, bran h, ell, left, right, isLeaf) where data Tree a = Leaf a | Bran h (Tree a) (Tree a) leaf = Leaf bran h = Bran h
ell (Leaf a) = a left (Bran h l r) = l right (Bran h l r) = r isLeaf (Leaf _) = True isLeaf _ = False ïÂÒÁÔÉÔÅ ×ÎÉÍÁÎÉÅ, ÞÔÏ ÓÉÓÏË ÜËÓÏÒÔÉÒÕÅÍÙÈ ÆÕÎË ÉÊ ÓÏÄÅÒ ÖÉÔ ÔÏÌØËÏ ÉÍÑ ÔÉÁ Tree, Ô. Å. ÂÅÚ ËÏÎÓÔÒÕËÔÏÒÏ× ÄÁÎÎÙÈ. ÁË ËÁË Leaf É Bran h ÎÅ ÜËÓÏÒÔÉÒÏ×ÁÎÙ, ÔÏ ÉÈ ÎÅÌØÚÑ ÕÖÅ ÉÓÏÌØ ÚÏ×ÁÔØ ÄÌÑ ÏÓÔÒÏÅÎÉÑ ÉÌÉ ×ÙÄÅÌÅÎÉÑ ÞÁÓÔÅÊ ÄÅÒÅ×ØÅ×, ÄÌÑ ÜÔÉÈ ÅÌÅÊ ÓÌÅÄÕÅÔ ÉÓÏÌØÚÏ×ÁÔØ ÏÒÅÄÅÌÅÎÎÙÅ × ÍÏÄÕÌÅ ÆÕÎË ÉÉ, ÏÂÅÓ ÅÞÉ×ÁÀÝÉÅ ÄÏÓÔÕ Ë ËÏÎÓÔÒÕËÔÏÒÁÍ ÄÁÎÎÙÈ ÔÉÁ Tree.
5. éÎËÁÓÕÌÑ ÉÑ ÄÁÎÎÙÈ × ÍÏÄÕÌÑÈ
233
ðÏÒÏÂÕÅÍ ÏÒÅÄÅÌÉÔØ ÆÕÎË ÉÉ ÄÌÑ ÒÁÂÏÔÙ Ó ÔÉÏÍ Tree ÔÁË, ËÁË ÍÙ ÜÔÏ ÄÅÌÁÌÉ ÒÁÎØÛÅ Ó ÏÍÏÝØÀ ÏÂÒÁÚ Ï×, ÓÏÄÅÒÖÁÝÉÈ ËÏÎÓÔÒÕËÔÏÒÙ ÄÁÎÎÙÈ:
module MainADT1 () where
import TreeADT fringe :: Tree a -> [a℄ fringe (Leaf x) = [x℄ fringe (Bran h left right) = fringe left ++ fringe right îÏ ËÏÎÓÔÒÕËÔÏÒÙ ÔÉÁ Tree ÓËÒÙÔÙ, ÏÜÔÏÍÕ ÓÏÏÓÔÁ×ÌÅÎÉÅ Ó ÏÂÒÁÚ ÁÍÉ ÎÅ×ÏÚÍÏÖÎÏ:
Dependen y analysis ERROR "MainADT1.hs":6 - Undefined
onstru tor fun tion "Leaf" äÌÑ ÔÏÇÏ ÞÔÏÂÙ ÚÁÄÁÔØ ×ÅÌÉÞÉÎÕ ÔÉÁ Tree, ÍÏÖÎÏ ÉÓÏÌØÚÏ×ÁÔØ ÔÏÌØËÏ ÔÅ ÆÕÎË ÉÉ, ËÏÔÏÒÙÅ ×ËÌÀÞÅÎÙ × ÓÉÓÏË ÜËÓÏÒÔÁ:
module MainADT () where import TreeADT
H
fringe :: Tree a -> [a℄ fringe x = if isLeaf x then [ ell x℄ else fringe (left x) ++ fringe (right x) ÅÅÒØ ÍÏÖÎÏ ÒÁÂÏÔÁÔØ Ó ÄÁÎÎÙÍ ÔÉÏÍ, ËÁË Ó ÁÂÓÔÒÁËÔÎÙÍ:
---> fringe (bran h (bran h (leaf 3) (leaf 2)) (leaf 1)) [3,2,1℄ îÅÓÏÍÎÅÎÎÙÍ ÒÅÉÍÕÝÅÓÔ×ÏÍ ÔÁËÏÇÏ ÒÅÄÓÔÁ×ÌÅÎÉÑ ÄÁÎÎÙÈ Ñ×ÌÑÅÔÓÑ ÔÏ, ÞÔÏ × ÄÁÌØÎÅÊÛÅÍ ÍÏÖÎÏ ÌÅÇËÏ ÉÚÍÅÎÉÔØ ×ÎÕÔÒÅÎÎÅÅ ÒÅÄÓÔÁ×ÌÅÎÉÅ ÔÉÁ Tree ÂÅÚ ÅÒÅÉÓÙ×ÁÎÉÑ ×ÓÅÇÏ ÒÏÇÒÁÍÍÎÏÇÏ ÏÂÅÓÅÞÅÎÉÑ, ËÏÔÏÒÏÅ ÅÇÏ ÉÓÏÌØÚÕÅÔ.
I õÒÁÖÎÅÎÉÅ VII.5.4
ïÄÎÏÊ ÉÚ ÛÉÒÏËÏ ÉÚ×ÅÓÔÎÙÈ ÁÂÓÔÒÁËÔÎÙÈ ÓÔÒÕËÔÕÒ ÄÁÎÎÙÈ Ñ×ÌÑ ÅÔÓÑ . üÌÅÍÅÎÔÙ ÏÍÅÝÁÀÔÓÑ × ÓÔÅË Ï ÏÄÎÏÍÕ. ÏÌØËÏ Ï ÓÌÅÄÎÉÊ ÜÌÅÍÅÎÔ ÓÔÅËÁ ÄÏÓÔÕÅÎ × ËÁÖÄÙÊ ÍÏÍÅÎÔ. éÎÏÇÄÁ ÓÔÅË ÓÒÁ×ÎÉ×ÁÀÔ Ó ËÏÒÏÂËÏÊ, ÓÏÄÅÒÖÁÝÅÊ ÌÉÓÔÙ ÂÕÍÁÇÉ. îÏ×ÙÊ ÌÉÓÔ ËÌÁÄÅÔÓÑ × ÓÔÏËÕ Ï×ÅÒÈ ÏÓÔÁÌØÎÙÈ. ÏÌØËÏ ×ÅÒÈÎÉÊ ÌÉÓÔ ÍÏÖÅÔ ÂÙÔØ ÒÏÞÉÔÁÎ ÉÌÉ ÉÚ×ÌÅÞÅÎ ÉÚ ËÏÒÏÂËÉ. äÌÑ ÔÏÇÏ ÞÔÏÂÙ ÉÚ×ÌÅÞØ
ÓÔÅË
H
VII. Haskell ËÁË ÑÚÙË ïïð
234
ÎÅËÏÔÏÒÙÊ ÌÉÓÔ ÉÚ ËÏÒÏÂËÉ, ÎÅÏÂÈÏÄÉÍÏ ÓÎÁÞÁÌÁ ÉÚ×ÌÅÞØ ×ÓÅ ÌÅÖÁ ÝÉÅ ÎÁÄ ÎÉÍ ÌÉÓÔÙ. óÔÅË ÆÕÎË ÉÏÎÉÒÕÅÔ ÁÎÁÌÏÇÉÞÎÏ. îÏ×ÙÊ ÜÌÅÍÅÎÔ ÏÍÅÝÁÅÔÓÑ × ×ÅÒÛÉÎÕ ÓÔÅËÁ Ó ÏÍÏÝØÀ ÏÅÒÁ ÉÉ push (×ÔÏÌËÎÕÔØ). ÷ÉÄÅÎ × ÓÔÅËÅ ÔÏÌØËÏ ÅÇÏ ×ÅÒÈÎÉÊ ÜÌÅÍÅÎÔ, ÚÎÁÞÅÎÉÅ ËÏÔÏÒÏÇÏ ÍÏÖÅÔ ÂÙÔØ ÏÌÕÞÅÎÏ Ó ÏÍÏÝØÀ ÏÅÒÁ ÉÉ top (×ÅÒÛÉÎÁ). îÁËÏÎÅ , ×ÅÒÈÎÉÊ ÜÌÅÍÅÎÔ ÍÏÖÅÔ ÂÙÔØ ÉÚ×ÌÅÞÅÎ ÉÚ ÓÔÅËÁ ÏÅÒÁ ÉÅÊ pop (×ÙÔÏÌË ÎÕÔØ). éÎÏÇÄÁ ÏÅÒÁ ÉÉ top É pop ÏÂßÅÄÉÎÑÀÔ ÒÉ ÒÅÁÌÉÚÁ ÉÉ. ï ÓÔÅËÅ ÔÁËÖÅ ÇÏ×ÏÒÑÔ ËÁË Ï ÏÞÅÒÅÄÉ ÔÉÁ LIFO (Last In First Out, ÏÓÌÅÄÎÉÊ ÒÉÛÅÌ ÅÒ×ÙÊ ×ÙÛÅÌ). ïÒÅÄÅÌÅÎÉÅ ÓÔÅËÁ ËÁË áä ÎÁÞÉÎÁÅÔÓÑ Ó ÏÉÓÁÎÉÑ ÅÇÏ ÏÅÒÁ ÉÊ ÎÁ ÁÂÓÔÒÁËÔÎÏÍ ÕÒÏ×ÎÅ:
emptySta k push pop top isEmpty showSta k
:: :: :: :: :: ::
Sta k a a -> Sta k a -> Sta k a Sta k a -> Sta k a Sta k a -> a Sta k a -> Bool (a -> [Char℄) -> Sta k a -> [Char℄
ë ÔÒÅÍ ÏÓÎÏ×ÎÙÍ ÏÅÒÁ ÉÑÍ ÏÂÙÞÎÏ ÄÏÂÁ×ÌÑÀÔ ÅÝÅ ÎÅÓËÏÌØËÏ ÆÕÎË ÉÊ, ËÏÔÏÒÙÅ ÄÅÌÁÀÔ ÒÁÂÏÔÕ ÓÏ ÓÔÅËÏÍ ÂÏÌÅÅ ÕÄÏÂÎÏÊ, ÎÁÒÉ ÍÅÒ, emptySta k, ÓÏÚÄÁÀÝÕÀ ÕÓÔÏÊ ÓÔÅË, isEmpty, ÒÏ×ÅÒÑÀÝÕÀ, ÕÓÔ ÌÉ ÓÔÅË, É showSta k, ÅÞÁÔÁÀÝÕÀ ÓÏÄÅÒÖÉÍÏÅ ÓÔÅËÁ. ðÒÅÄÏÌÏÖÉÍ, ÞÔÏ áä, ÏÉÓÙ×ÁÀÝÉÊ ÓÔÅË ÕÖÅ ÒÅÁÌÉÚÏ×ÁÎ, É ÒÁÚÒÁÂÏÔÁÅÍ ÍÏÄÕÌØ ÄÌÑ ÒÁÂÏÔÙ Ó ÜÔÉÍ ÔÉÏÍ. ÁË ËÁË ÒÉ×ÅÄÅÎ ÎÙÊ ×ÙÛÅ ÉÎÔÅÒÆÅÊÓ ÓÔÅËÁ ÏÌÉÍÏÒÆÅÎ, ÓÏÚÄÁÄÉÍ ÓÔÅËÉ, ÒÅÄÎÁ ÚÎÁÞÅÎÎÙÅ ÄÌÑ ÈÒÁÎÅÎÉÑ ÉÎÆÏÒÍÁ ÉÉ ÒÁÚÌÉÞÎÙÈ ×ÉÄÏ×: ÓÉÍ×ÏÌÏ×, ÅÌÙÈ ÞÉÓÅÌ É ÚÁÉÓÅÊ, ÓÏÄÅÒÖÁÝÉÈ ÉÎÆÏÒÍÁ ÉÀ Ï ÉÍÅÎÉ É ×ÏÚ ÒÁÓÔÅ ÄÅÔÅÊ:
module Main where import Sta k (Sta k, emptySta k, push, pop, top, isEmpty, showSta k ) -- ÓÔÅË ÓÉÍ×ÏÌÏ× -sta k1 :: Sta k Char sta k1 = push 'd' (push 'f' (push 'k' emptySta k))
5. éÎËÁÓÕÌÑ ÉÑ ÄÁÎÎÙÈ × ÍÏÄÕÌÑÈ
235
s1 = putStr(showSta k show sta k1) -- ÓÔÅË ÅÌÙÈ ÞÉÓÅÌ -sta k2 :: Sta k Int sta k2 = emptySta k sta k3 = push 5 (push 5 (push 2 sta k2)) sta k4 = pop sta k3 s4 = putStr(showSta k show sta k4) -- ÓÔÅË ÁÒ (éÍÑ, ÷ÏÚÒÁÓÔ) -sta k5 :: Sta k Re ord type Age = Int type Name = [Char℄ type Re ord = (Name,Age) showRe (name,age) = "(" ++ name ++ "," ++ show age ++ ")" sta k5 = push ("Kate",6) (push ("Jan",5) (push ("Ann",10) emptySta k)) s5 = putStr(showSta k showRe sta k5) ðÒÉÓÔÕÉÍ Ë ÒÁÚÒÁÂÏÔËÅ ÍÏÄÕÌÑ Sta k. îÁ×ÅÒÎÏÅ, ÏÄÎÏÊ ÉÚ ÓÁ ÍÙÈ ÒÏÓÔÙÈ ÅÇÏ ÒÅÁÌÉÚÁ ÉÊ Ñ×ÌÑÅÔÓÑ ÒÅÁÌÉÚÁ ÉÑ ÎÁ ÂÁÚÅ ÓÉÓËÁ:
module Sta k (Sta k, emptySta k, push, pop, top, isEmpty, showSta k ) where -- ÒÅÁÌÉÚÁ ÉÑ ÎÁ ÂÁÚÅ ÓÉÓËÁ -type Sta k a = [a℄ ----------------------isEmpty :: Sta k a -> Bool emptySta k :: Sta k a push :: a -> Sta k a -> Sta k a top :: Sta k a -> a pop :: Sta k a -> Sta k a showSta k :: (a -> [Char℄) -> Sta k a -> [Char℄
236
VII. Haskell ËÁË ÑÚÙË ïïð
----------------------isEmpty [℄ = True isEmpty _ = False emptySta k = [℄ push item oldlist = item:oldlist top (first:_) = first pop (_:rest) = rest pop [℄ = error "pop:empty sta k" showSta k f [℄ ="Bottom" showSta k f (x:xs) = f x ++ " , " ++ showSta k f xs
H
úÁÇÒÕÚÉ× ÍÏÄÕÌØ Main ÍÏÖÎÏ ÒÉÓÔÕÁÔØ Ë ÒÁÂÏÔÅ Ó ÁÂÓÔÒÁËÔÎÙÍ ÔÉÏÍ Sta k:
---> s1 'd' , 'f' , 'k' , Bottom ---> s4 5 , 2 , Bottom ---> s5 (Kate,6) , (Jan,5) , (Ann,10) , Bottom ÅÅÒØ ÒÅÄÓÔÁ×ÉÍ, ÞÔÏ ÄÁÎÎÙÅ, ÏÍÅÝÁÅÍÙÅ × ÓÔÅË, ÏÓÔÕÁÀÔ ÓÅÒÉÑÍÉ ÉÚ Ï×ÔÏÒÑÀÝÉÈÓÑ ×ÅÌÉÞÉÎ, ÎÁÒÉÍÅÒ, ÎÁ ××ÏÄ ÏÓÔÕÁÀÔ ÎÕÌÉ É ÅÄÉÎÉ Ù × ÓÌÅÄÕÀÝÅÍ ÏÒÑÄËÅ: 1,1,1,0,1,0,0,0,1,1,1,1,1,0,0,0. üÔÕ ÖÅ ÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔØ ÍÏÖÎÏ ÚÁÉÓÁÔØ × ×ÉÄÅ ÁÒ (×ÅÌÉÞÉÎÁ, ËÏÌÉÞÅÓÔ×Ï): (1,3), (0,1), (1,1), (0,3), (1,5), (0,3). ÁËÏÊ ÍÅÔÏÄ ÈÒÁ ÎÅÎÉÑ ÚÎÁÞÉÔÅÌØÎÏ ÜÆÆÅËÔÉ×ÎÅÅ, ÅÓÌÉ ÓÒÅÄÎÑÑ ÄÌÉÎÁ Ï×ÔÏÒÑÀ ÝÉÈÓÑ ÇÒÕ ÄÏÓÔÁÔÏÞÎÏ ×ÅÌÉËÁ. îÉÖÅ ÒÅÄÓÔÁ×ÌÅÎÁ ÒÅÁÌÉÚÁ ÉÑ ÓÔÅËÁ, ÉÓÏÌØÚÕÀÝÁÑ ÄÌÑ ÈÒÁ ÎÅÎÉÑ ÄÁÎÎÙÈ ÓÉÓÏË ÁÒ:
module Sta k' (Sta k, emptySta k, push, pop, top, isEmpty,
5. éÎËÁÓÕÌÑ ÉÑ ÄÁÎÎÙÈ × ÍÏÄÕÌÑÈ
237
showSta k ) where -- ÒÅÁÌÉÚÁ ÉÑ ÎÁ ÂÁÚÅ ÓÉÓËÁ ÁÒ -type Sta k a = [(a, Int)℄ ----------------------isEmpty :: Sta k a -> Bool emptySta k :: Sta k a push :: Eq a => a -> Sta k a -> Sta k a top :: Sta k a -> a pop :: Sta k a -> Sta k a showSta k :: (a -> [Char℄) -> Sta k a -> [Char℄ ----------------------isEmpty [℄ = True isEmpty _ = False emptySta k = [℄ push item [℄ = [(item,1)℄ push item oldlist | top_item == item =((item,top_ nt+1):rest) | otherwise = ((item,1):oldlist) where (top_item,top_ nt):rest = oldlist top (( top_item,_):_) = top_item top _ = error "top:empty sta k" pop ((top_item,1):rest) = rest pop ((top_item,n):rest) = ((top_item,n-1):rest) pop _ = error "pop:empty sta k" showSta k f [℄ ="Bottom" showSta k f ((x,1):xs) = f x ++ " , " ++ showSta k f xs showSta k f ((x,n):xs) = f x ++ " , " ++ showSta k f ((x,n-1):xs)
J
VII. Haskell ËÁË ÑÚÙË ïïð
238
5.5. âÉÂÌÉÏÔÅËÉ ÒÏÇÒÁÍÍ íÎÏÇÏÌÅÔÎÉÊ ÏÙÔ ÍÎÏÇÉÈ ÔÙÓÑÞ ÒÏÇÒÁÍÍÉÓÔÏ× ÏËÁÚÁÌ, ÞÔÏ ÎÁÉÓÁÎÉÅ ÂÏÌØÛÏÊ ÒÏÇÒÁÍÍÎÏÊ ÓÉÓÔÅÍÙ ÚÎÁÞÉÔÅÌØÎÏ ÏÔÌÉÞÁÅÔ ÓÑ ÏÔ ÒÁÚÒÁÂÏÔËÉ ÏÔÄÅÌØÎÙÈ ÎÅÂÏÌØÛÉÈ ÒÏÇÒÁÍÍ. ÷ ÜÔÉÈ ÓÌÕÞÁ ÑÈ ÔÒÅÂÕÀÔÓÑ ÒÉÍÅÎÅÎÉÅ ÄÏÏÌÎÉÔÅÌØÎÙÈ ÍÅÔÏÄÏ× É ÉÎÓÔÒÕÍÅÎ ÔÁÌØÎÙÈ ÓÒÅÄÓÔ×, ×ÙÈÏÄÑÝÉÈ ÚÁ ÒÁÍËÉ ÒÏÓÔÏÇÏ ÒÏÇÒÁÍÍÉÒÏ×Á ÎÉÑ. ÅÒÍÉÎ (software ingineering) ÉÓÏÌØÚÕÅÔÓÑ ÄÌÑ ÏÂÏÚÎÁÞÅÎÉÑ ÍÅÔÏÄÏ× É ÉÎÓÔÒÕÍÅÎ ÔÁÌØÎÙÈ ÓÒÅÄÓÔ×, ÒÅÄÎÁÚÎÁÞÅÎÎÙÈ ÄÌÑ ÒÏÅËÔÉÒÏ×ÁÎÉÑ, ËÏÎÓÔÒÕ ÉÒÏ×ÁÎÉÑ É ÕÒÁ×ÌÅÎÉÑ ÒÉ ÓÏÚÄÁÎÉÉ ÒÏÇÒÁÍÍÎÙÈ ÓÉÓÔÅÍ.
ÒÏÅËÔÉÒÏ×ÁÎÉÅ ÒÏÇÒÁÍÍÎÏÇÏ ÏÂÅÓÅÞÅÎÉÑ
ìÀÂÏÊ ÉÎÖÅÎÅÒ ÚÎÁÅÔ Ï ÒÅÉÍÕÝÅÓÔ×ÁÈ, Ó×ÑÚÁÎÎÙÈ Ó ÉÓÏÌØ ÚÏ×ÁÎÉÅÍ ÇÏÔÏ×ÙÈ ËÏÍÏÎÅÎÔ ÒÉ ÒÁÚÒÁÂÏÔËÅ ÔÏÇÏ ÉÌÉ ÉÎÏÇÏ ÒÏ ÅËÔÁ. ðÏÄÏÂÎÏÅ ÒÉÍÅÎÅÎÉÅ ÚÁÉÍÓÔ×Ï×ÁÎÎÙÈ ËÏÍÏÎÅÎÔ Ñ×ÌÑÅÔÓÑ ÒÁÓÒÏÓÔÒÁÎÅÎÎÏÊ ÒÁÚÎÏ×ÉÄÎÏÓÔØÀ ÉÎÖÅÎÅÒÎÏÊ ÄÅÑÔÅÌØÎÏÓÔÉ. ÷ ÉÎÖÅÎÅÒÉÉ ÒÏÇÒÁÍÍ ÔÁËÖÅ ×ÅÓØÍÁ ÏÌÅÚÎÙ ÚÁÉÍÓÔ×Ï×ÁÎÎÙÅ ËÏÍ ÏÎÅÎÔÙ, ÎÁÚÙ×ÁÅÍÙÅ × ÒÁÚÌÉÞÎÙÈ ÑÚÙËÁÈ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÑ ÍÏ ÄÕÌÑÍÉ (Haskell, Modula), ÁËÅÔÁÍÉ (Ada) ÉÌÉ ËÌÁÓÓÁÍÉ (× C++, Java). éÓÏÌØÚÏ×ÁÎÉÅ ÒÏÇÒÁÍÍÎÙÈ ÍÏÄÕÌÅÊ ÄÁÅÔ ÒÑÄ ÒÅÉÍÕ ÝÅÓÔ×. üÔÉ ÓÒÅÄÓÔ×Á ÓÔÒÕËÔÕÒÉÒÏ×ÁÎÉÑ ÒÏÇÒÁÍÍ ÄÁÀÔ ×ÏÚÍÏÖ ÎÏÓÔØ ÉÎËÁÓÕÌÑ ÉÉ ÄÁÎÎÙÈ É ÍÅÔÏÄÏ× × ÂÏÌÅÅ ËÒÕÎÙÅ ÅÄÉÎÉ Ù. åÝÅ ÏÄÎÉÍ ÒÅÉÍÕÝÅÓÔ×ÏÍ ÍÏÄÕÌÅÊ Ñ×ÌÑÅÔÓÑ ÔÏ, ÞÔÏ ÉÈ ÓÏÇÌÁÓÏ ×ÁÎÉÅ ÍÏÖÎÏ ÒÏ×ÅÒÉÔØ ÒÉ ËÏÍÉÌÑ ÉÉ, ÞÔÏÂÙ ÒÅÄÏÔ×ÒÁÔÉÔØ ÏÛÉÂËÉ É ÎÅÄÏÒÁÚÕÍÅÎÉÑ. ðÅÒ×ÙÅ ÑÚÙËÉ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÑ ÎÅ ÏÚ×ÏÌÑÌÉ ÒÁÚÂÉ×ÁÔØ ÒÏ ÇÒÁÍÍÙ ÎÁ ÏÔÄÅÌØÎÙÅ ÞÁÓÔÉ, ÞÔÏ ÒÉ×ÏÄÉÍÏ Ë ÓÌÏÖÎÏÓÔÑÍ ÉÈ ×ÏÓ ÒÉÑÔÉÑ É ÏÔÌÁÄËÉ. ïÙÔ ÏËÁÚÁÌ, ÞÔÏ, ×ÏÚÍÏÖÎÏ, 10000 ÓÔÒÏË Ñ×ÌÑÅÔÓÑ ×ÅÒÈÎÉÍ ÒÅÄÅÌÏÍ ÄÌÑ ÍÏÎÏÌÉÔÎÏÊ ÒÏÇÒÁÍÍÙ. ÷ ÓÔÁÎ ÄÁÒÔÅ ÑÚÙËÁ Pas al, ÎÁÒÉÍÅÒ, ÎÅ ÏÒÅÄÅÌÅÎÏ ÎÉËÁËÏÇÏ ÍÅÔÏÄÁ ÄÌÑ ÒÁÚÄÅÌØÎÏÊ ËÏÍÉÌÑ ÉÉ ÉÌÉ ÄÅËÏÍÏÚÉ ÉÉ ÒÏÇÒÁÍÍ. ðÅÒ×ÙÊ Pas al-ËÏÍÉÌÑÔÏÒ ÂÙÌ ÅÄÉÎÏÊ ÒÏÇÒÁÍÍÏÊ, ÓÏÄÅÒÖÁÝÅÊ Ó×ÙÛÅ 8000 ÓÔÒÏË ËÏÄÁ ÎÁ ÑÚÙËÅ Pas al. ÷ÍÅÓÔÏ ÔÏÇÏ, ÞÔÏÂÙ ÉÚÍÅÎÑÔØ Pas al, ÅÇÏ ÓÏÚÄÁÔÅÌØ îÉËÌÁÕÓ ÷ÉÒÔ ÒÁÚÒÁÂÏÔÁÌ ÎÏ×ÙÊ (ÈÏÔÑ É Ï ÈÏÖÉÊ) ÑÚÙË, ÎÁÚ×ÁÎÎÙÊ Modula, ÔÁË ËÁË ÅÎÔÒÁÌØÎÙÍ ÏÎÑÔÉÅÍ × ÎÅÍ, Ñ×ÌÑÅÔÓÑ ÍÏÄÕÌØ.1 åÇÏ ÉÄÅÉ ÎÁÛÌÉ ÏÔÒÁÖÅÎÉÅ ×Ï ÍÎÏÇÉÈ ÑÚÙËÁÈ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÑ, × ÔÏÍ ÞÉÓÌÅ É × Haskell. 1ëÏÍÉÌÑÔÏÒÙ
Pas al, ÉÓÏÌØÚÕÅÍÙÅ ÎÁ ÒÁËÔÉËÅ, ÏÄÄÅÒÖÉ×ÁÀÔ ÄÅËÏÍ
ÏÚÉ ÉÀ ÎÁ ÍÏÄÕÌÉ, ÎÏ ÎÉËÁËÉÈ ÓÔÁÎÄÁÒÔÎÙÈ ÍÅÔÏÄÏ× ÄÌÑ ÜÔÏÇÏ ÎÅ ÓÕÝÅÓÔ×ÕÅÔ, ÔÁË ÞÔÏ ÂÏÌØÛÉÅ ÒÏÇÒÁÍÍÙ ÎÁ Pa kal ÎÅ ÅÒÅÎÏÓÉÍÙ Ó ÏÄÎÏÊ ÌÁÔÆÏÒÍÙ ÎÁ ÄÒÕÇÕÀ.
5. éÎËÁÓÕÌÑ ÉÑ ÄÁÎÎÙÈ × ÍÏÄÕÌÑÈ
239
ðÏ×ÔÏÒÎÏÅ ÉÓÏÌØÚÏ×ÁÎÉÅ ÒÏÇÒÁÍÍÎÏÇÏ ËÏÄÁ ×Ï ×ÎÏ×Ø ÓÏÚÄÁ×Á ÅÍÙÈ ÒÉÌÏÖÅÎÉÑÈ ÉÍÅÅÔ ÒÑÄ ÒÅÉÍÕÝÅÓÔ×. ðÒÏÇÒÁÍÍÉÓÔÕ ÎÅ ÔÒÅÂÕÅÔÓÑ ÒÁÚÒÁÂÁÔÙ×ÁÔØ ÕÖÅ ÓÕÝÅÓÔ×ÕÀÝÉÊ ÁÌÇÏÒÉÔÍ. ïÒÇÁÎÉÚÁ ÉÑ-ÒÁÚÒÁÂÏÔÞÉË ÜËÏÎÏÍÉÔ ÒÅÓÕÒÓÙ. ðÒÏÇÒÁÍÍÙ, ËÁË ÒÁ×ÉÌÏ, ÓÔÁÎÏ×ÑÔÓÑ ÎÁÄÅÖÎÅÅ. ðÒÏÇÒÁÍÍÙ, ËÁË ÒÁ×ÉÌÏ, ÓÔÁÎÏ×ÑÔÓÑ ÜÆÆÅËÔÉ×ÎÅÅ. âÏÌØÛÉÎÓÔ×Ï ÓÏ×ÒÅÍÅÎÎÙÈ ÑÚÙËÏ× ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÑ ÏÓÔÁ ×ÌÑÀÔÓÑ Ó ÎÁÂÏÒÏÍ ¾ÓÔÁÎÄÁÒÔÎÙÈ¿ ÂÉÂÌÉÏÔÅË ÒÏÇÒÁÍÍ, É Haskell ÎÅ Ñ×ÌÑÅÔÓÑ ÉÓËÌÀÞÅÎÉÅÍ. ïÂÙÞÎÏ × ÔÏÊ ÖÅ ÄÉÒÅËÔÏÒÉÉ, ÇÄÅ ÒÁÓÏ ÌÁÇÁÅÔÓÑ ÆÁÊÌ Prelude.hs (×Ï ÍÎÏÇÉÈ Linux-ÓÉÓÔÅÍÁÈ ÜÔÏ ÄÉÒÅËÔÏ ÒÉÑ /usr/share/hugs/lib/) ÎÁÈÏÄÑÔÓÑ ÓËÒÉÔÙ, ÓÏÄÅÒÖÁÝÉÅ ÒÏ ÇÒÁÍÍÎÙÅ ÍÏÄÕÌÉ, ÒÅÁÌÉÚÕÀÝÉÅ ÍÎÏÇÉÅ ÛÉÒÏËÏ ÉÚ×ÅÓÔÎÙÅ ÁÌÇÏ ÒÉÔÍÙ É ÓÔÒÕËÔÕÒÙ ÄÁÎÎÙÈ.
I õÒÁÖÎÅÎÉÅ VII.5.5
óÒÅÄÉ ÂÉÂÌÉÏÔÅÞÎÙÈ ÍÏÄÕÌÅÊ ÎÁÈÏÄÉÔÓÑ ÍÏÄÕÌØ Complex, ÒÅÄÎÁ ÚÎÁÞÅÎÎÙÊ ÄÌÑ ÒÁÂÏÔÙ Ó ËÏÍÌÅËÓÎÙÍÉ ÞÉÓÌÁÍÉ. ìÀÂÏÅ ËÏÍÌÅËÓ ÎÏÅ ÞÉÓÌÏ ÒÅÄÓÔÁ×ÉÍÏ × ×ÉÄÅ z = x + i y = r ei' , ÇÄÅ i ÅÓÔØ ÍÎÉÍÁÑ ÅÄÉÎÉ Á (i2 = 1). ÷ÅÌÉÞÉÎÙ x É y ÎÁÚÙ×ÁÀÔÓÑ ÄÅÊÓÔ×ÉÔÅÌØÎÏÊ É ÍÎÉÍÏÊ ÞÁÓÔØÀ ÞÉÓÌÁ É ÚÁÄÁÀÔ ËÏÏÒÄÉÎÁÔÙ ÔÏÞËÉ ÎÁ ÌÏÓËÏÓÔÉ, ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÅÊ ÄÁÎÎÏÍÕ ÞÉÓÌÕ; r ÒÁ×ÎÏ ÒÁÓÓÔÏÑÎÉÀ ÏÔ ÜÔÏÊ ÔÏÞ ËÉ ÄÏ ÎÁÞÁÌÁ ËÏÏÒÄÉÎÁÔ, Á ' ÕÇÌÕ ÍÅÖÄÕ ÏÓØÀ 0x É ×ÅËÔÏÒÏÍ Ó ËÏÏÒÄÉÎÁÔÁÍÉ (x; y ). ðÒÏÓÍÁÔÒÉ×ÁÑ ÓÉÓÏË ÜËÓÏÒÔÁ ÄÁÎÎÏÇÏ ÍÏÄÕÌÑ, ÍÙ ×ÓÔÒÅÞÁÅÍ ×ÓÅ ÓÔÁÎÄÁÒÔÎÙÅ ÆÕÎË ÉÉ ÄÌÑ ÒÁÂÏÔÙ Ó ËÏÍÌÅËÓÎÙÍÉ ÞÉÓÌÁÍÉ. ÁÂÌÉ Á ÏÑÓÎÑÅÔ ÉÈ ÎÁÚÎÁÞÅÎÉÅ. íÅÔÏÄ
(:+)
îÁÚÎÁÞÅÎÉÅ
ïÅÒÁÔÏÒ ÓÏÚÄÁÎÉÑ ËÏÍÌÅËÓÎÏÇÏ ÞÉÓÌÁ Ï ÚÁ ÄÁÎÎÙÍ x É y realPart ÷ÙÄÅÌÅÎÉÅ ÄÅÊÓÔ×ÉÔÅÌØÎÏÊ ÞÁÓÔÉ ÞÉÓÌÁ imagPart ÷ÙÄÅÌÅÎÉÅ ËÏÍÌÅËÓÎÏÊ ÞÁÓÔÉ ÞÉÓÌÁ
onjugate ÷ÙÞÉÓÌÅÎÉÅ ÓÏÒÑÖÅÎÎÏÇÏ ËÏÍÌÅËÓÎÏÇÏ ÞÉÓÌÁ (ÅÓÌÉ z = x + iy , ÔÏ ÓÏÒÑÖÅÎÎÏÅ ÞÉÓÌÏ ÒÁ×ÎÏ x iy) mkPolar ÷ÙÞÉÓÌÅÎÉÅ ËÏÍÌÅËÓÎÏÇÏ ÞÉÓÌÁ, ÚÁÄÁÎÎÏÇÏ Ï ÌÑÒÎÙÍÉ ËÏÏÒÄÉÎÁÔÁÍÉ r É '
240
VII. Haskell ËÁË ÑÚÙË ïïð
is
ðÏÌÕÞÅÎÉÅ ¾ÎÏÒÍÉÒÏ×ÁÎÎÏÇÏ¿ ËÏÍÌÅËÓÎÏÇÏ ÞÉ ÓÌÁ (x=r + i y=r = os ' + i sin ') polar ÷ÙÞÉÓÌÅÎÉÅ ÏÌÑÒÎÙÈ ËÏÏÒÄÉÎÁÔ ÔÏÞËÉ, ÓÏÏÔ ×ÅÔÓÔ×ÕÀÝÅÊ ÚÁÄÁÎÎÏÍÕ ËÏÍÌÅËÓÎÏÍÕ ÞÉÓÌÕ p magnitude ÷ÙÞÉÓÌÅÎÉÅ r = x2 + y 2 ÍÏÄÕÌÑ ËÏÍÌÅËÓ ÎÏÇÏ ÞÉÓÌÁ phase ÷ÙÞÉÓÌÅÎÉÅ ' ÁÒÇÕÍÅÎÔÁ ËÏÍÌÅËÓÎÏÇÏ ÞÉÓÌÁ
îÅ ÚÎÁÑ, ËÁË ÒÅÁÌÉÚÏ×ÁÎ ÁÂÓÔÒÁËÔÎÙÊ ÔÉ ÄÁÎÎÙÈ Complex, É ÏÌØ ÚÕÑÓØ ÌÉÛØ ÒÅÄÏÓÔÁ×ÌÅÎÎÙÍ ÜÔÉÍ ÍÏÄÕÌÅÍ ÉÎÔÅÒÆÅÊÓÏÍ, ÍÙ ÌÅÇ ËÏ ÍÏÖÅÍ ÒÁÚÒÁÂÏÔÁÔØ ÒÏÇÒÁÍÍÕ, ÉÓÏÌØÚÕÀÝÕÀ ËÏÍÌÅËÓÎÙÅ ÞÉ ÓÌÁ. îÁÒÉÍÅÒ,
module Main where import Complex
1 = 2 :+ 3 x1 = realPart 1 y1 = imagPart 1
2 = onjugate 1
3 = mkPolar (sqrt 2) (pi/4) p1 = polar ((-1) :+ 0)
H
÷ÙÞÉÓÌÉÍ ÚÎÁÞÅÎÉÑ ×ÅÌÉÞÉÎ ÏÒÅÄÅÌÅÎÎÙÈ × ÄÁÎÎÏÍ ÍÏÄÕÌÅ:
---> 1 2.0 :+ 3.0 ---> x1 2.0 ---> y1 3.0 ---> 2 2.0 :+ (-3.0) ---> 3 1.0 :+ 1.0 ---> p1 (1.0,3.14159)
J
5. éÎËÁÓÕÌÑ ÉÑ ÄÁÎÎÙÈ × ÍÏÄÕÌÑÈ
241
÷ÏÒÏÓÙ É ÚÁÄÁÎÉÑ VII.5.1
íÎÏÖÅÓÔ×Ï Ñ×ÌÑÅÔÓÑ ÂÁÚÏ×ÏÊ ÓÔÒÕËÔÕÒÏÊ, ËÏÔÏÒÁÑ ÌÅÖÉÔ × ÏÓÎÏ ×ÁÎÉÉ ×ÓÅÊ ÍÁÔÅÍÁÔÉËÉ. ðÒÉ ÒÁÚÒÁÂÏÔËÅ ÁÌÇÏÒÉÔÍÏ× ÍÎÏÖÅÓÔ×Á ÉÓÏÌØÚÕÀÔÓÑ ËÁË ÏÓÎÏ×Á ÄÌÑ ÍÎÏÇÉÈ ×ÁÖÎÙÈ ÁÂÓÔÒÁËÔÎÙÈ ÔÉÏ× ÄÁÎÎÙÈ (ÎÁÒÉÍÅÒ, ÔÁËÏÇÏ ËÁË ÓÌÏ×ÁÒØ).
íÎÏÖÅÓÔ×ÏÍ ÎÁÚÙ×ÁÅÔÓÑ ÓÏ×ÏËÕÎÏÓÔØ ÜÌÅÍÅÎÔÏ×, ËÁÖÄÙÊ ÜÌÅÍÅÎÔ ËÏÔÏÒÏÇÏ ÉÌÉ ÓÁÍ Ñ×ÌÑÅÔÓÑ ÍÎÏÖÅÓÔ×ÏÍ ÉÌÉ Ñ×ÌÑÅÔ ÓÑ ÒÉÍÉÔÉ×ÎÙÍ ÜÌÅÍÅÎÔÏ×, ÎÁÚÙ×ÁÅÍÙÍ ÁÔÏÍÏÍ. ÷ÓÅ ÜÌÅÍÅÎ ÔÙ ÌÀÂÏÇÏ ÍÎÏÖÅÓÔ×Á ÒÁÚÌÉÞÎÙ, ÔÁË ËÁË × ÍÎÏÖÅÓÔ×Å ÎÅ ÍÏÖÅÔ
ÓÏÄÅÒÖÁÔØÓÑ Ä×ÕÈ ËÏÉÊ ÏÄÎÏÇÏ É ÔÏÇÏ ÖÅ ÜÌÅÍÅÎÔÁ. ðÒÅÄÌÏÖÉÔÅ ÎÅÓËÏÌØËÏ ÒÅÁÌÉÚÁ ÉÊ ÜÔÏÇÏ áä. ÷ ÔÁÂÌÉ Å Å ÒÅÞÉÓÌÅÎÙ ÏÅÒÁÔÏÒÙ, ×ÙÏÌÎÑÅÍÙÅ ÎÁÄ ÍÎÏÖÅÓÔ×ÁÍÉ, ËÏÔÏÒÙÅ ÞÁÓÔÏ ×ËÌÀÞÁÀÔ × ÒÅÁÌÉÚÁ ÉÀ. íÅÔÏÄ
îÁÚÎÁÞÅÎÉÅ
union interse tion differen e merge
ïÂßÅÄÉÎÅÎÉÅ Ä×ÕÈ ÍÎÏÖÅÓÔ× ðÅÒÅÓÅÞÅÎÉÅ Ä×ÕÈ ÍÎÏÖÅÓÔ× òÁÚÎÏÓÔØ ÍÎÏÖÅÓÔ× ïÂßÅÄÉÎÅÎÉÅ ÎÅÅÒÅÓÅËÁÀÝÉÈÓÑ ÍÎÏÖÅÓÔ× (ÓÌÉ ÑÎÉÅ) ÷ÏÚ×ÒÁÝÁÅÔ True, ÅÓÌÉ ÜÌÅÍÅÎÔ ÒÉÎÁÄÌÅÖÉÔ ÍÎÏÖÅÓÔ×Õ óÏÚÄÁÅÔ ÕÓÔÏÅ ÍÎÏÖÅÓÔ×Ï äÏÂÁ×ÌÑÅÔ ÜÌÅÍÅÎÔ × ÍÎÏÖÅÓÔ×Ï (ÅÓÌÉ ÜÌÅÍÅÎÔ ÕÖÅ ÒÉÓÕÔÓÔ×ÕÅÔ × ÍÎÏÖÅÓÔ×Å, ÔÏ ÍÎÏÖÅÓÔ×Ï ÎÅ ÉÚÍÅÎÑÅÔÓÑ) õÄÁÌÑÅÔ ÜÌÅÍÅÎÔ ÉÚ ÍÎÏÖÅÓÔ×Á (ÅÓÌÉ ÜÌÅÍÅÎÔÁ ÎÅÔ × ÍÎÏÖÅÓÔ×Å, ÔÏ ÍÎÏÖÅÓÔ×Ï ÎÅ ÍÅÎÑÅÔÓÑ) ÷ÏÚ×ÒÁÝÁÅÔ True, ÅÓÌÉ Ä×Á ÍÎÏÖÅÓÔ×Á ÓÏÓÔÏÑÔ ÉÚ ÏÄÎÉÈ É ÔÅÈ ÖÅ ÜÌÅÍÅÎÔÏ×
member makeNull insert delete equal VII.5.2
åÝÅ ÏÄÎÉÍ ÛÉÒÏËÏ ÒÁÓÒÏÓÔÒÁÎÅÎÎÙÍ ÁÂÓÔÒÁËÔÎÙÍ ÔÉÏÍ ÄÁÎ ÎÙÈ Ñ×ÌÑÅÔÓÑ Queue. ïÎÁ ÒÅÁÌÉÚÕÅÔ ÓÔÒÕËÔÕÒÕ ×ÉÄÁ FIFO (First In, First Out ÅÒ×ÙÍ ÒÉÛÅÌ, ÅÒ×ÙÍ ×ÙÛÅÌ). ðÒÉÍÅÒÙ ÏÞÅÒÅÄÅÊ ×ÓÔÒÅÞÁÀÔÓÑ ÏÞÅÎØ ÞÁÓÔÏ ËÁË × ÏËÒÕÖÁÀÝÅÊ ÎÁÓ ÖÉÚÎÉ, ÔÁË É × ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÉ. ïÞÅÒÅÄØ ÍÏÖÎÏ ÒÁÓÓÍÁÔÒÉ×ÁÔØ ËÁË Ï ÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔØ ÏÂßÅËÔÏ×. ïÂßÅËÔÙ ÓÔÁÎÏ×ÑÔÓÑ ÔÏÌØËÏ × ËÏÎÅ
ÏÞÅÒÅÄØ
VII. Haskell ËÁË ÑÚÙË ïïð
242
ÏÞÅÒÅÄÉ, Á ÏÂÓÌÕÖÉ×ÁÀÔÓÑ É ÕÄÁÌÑÀÔÓÑ ÔÏÌØËÏ ÉÚ ÅÅ ÎÁÞÁÌÁ. ïÂÙÞ ÎÏ ÎÁÄ ÏÞÅÒÅÄØÀ ×ÙÏÌÎÑÅÔÓÑ ÔÒÉ ÏÅÒÁ ÉÉ. ïÅÒÁ ÉÑ ÏÓÔÁÎÏ×ËÉ × ÏÞÅÒÅÄØ, ÞÁÓÔÏ ÎÁÚÙ×ÁÅÍÁÑ ¾××ÅÓÔÉ¿ (enqueue). ïÅÒÁ ÉÑ ÉÚ×ÌÅ ÞÅÎÉÑ ÉÚ ÏÞÅÒÅÄÉ, ÉÍÅÎÕÅÍÁÑ ¾×Ù×ÅÓÔÉ¿ (dequeue). úÎÁÞÅÎÉÅ ÅÒ ×ÏÇÏ ÏÂßÅËÔÁ ÏÌÕÞÁÅÔÓÑ Ó ÏÍÏÝØÀ ÏÅÒÁ ÉÉ ¾ÅÒ×ÙÊ¿ (front). ðÒÅÄÌÏÖÉÔÅ ÎÅÓËÏÌØËÏ ÒÅÁÌÉÚÁ ÉÊ ÄÁÎÎÏÇÏ áä É ÎÁÉÛÉÔÅ ÍÏ ÄÕÌØ, ÉÓÏÌØÚÕÀÝÉÊ ÏÞÅÒÅÄØ. äÏÂÁ×ØÔÅ Ë ÉÎÔÅÒÆÅÊÓÕ ÔÁËÖÅ ÆÕÎË ÉÉ makeNull, ÏÞÉÝÁÀÝÕÀ ÏÞÅÒÅÄØ, ÄÅÌÁÑ ÅÅ ÕÓÔÏÊ, É isEmpty ×ÏÚ×ÒÁÝÁÀÝÕÀ ÚÎÁÞÅÎÉÅ True ÔÏÇÄÁ É ÔÏÌØËÏ ÔÏÇÄÁ, ËÏÇÄÁ ÏÞÅÒÅÄØ ÕÓÔÁ. VII.5.3
òÁÓÓÍÏÔÒÉÍ ÓÔÒÕËÔÕÒÕ, ÒÅÄÎÁÚÎÁÞÅÎÎÕÀ ÄÌÑ ÒÅÄÓÔÁ×ÌÅÎÉÑ ÍÎÏ ÖÅÓÔ×, ÓÏÓÔÏÑÝÉÈ ÉÚ ÓÉÍ×ÏÌØÎÙÈ ÓÔÒÏË, É ÎÁÚÙ×ÁÅÍÕÀ ¾ÎÁÇÒÕÖÅÎ ÎÏÅ ÄÅÒÅ×Ï¿ (trie). 2 óÔÒÕËÔÕÒÁ ÎÁÇÒÕÖÅÎÎÏÇÏ ÄÅÒÅ×Á ÏÄÄÅÒÖÉ×Á ÅÔ ÏÅÒÁÔÏÒÙ ÍÎÏÖÅÓÔ×, Õ ËÏÔÏÒÙÈ ÜÌÅÍÅÎÔÙ Ñ×ÌÑÀÔÓÑ ÓÌÏ×ÁÍÉ, Ô. Å. ÓÉÍ×ÏÌØÎÙÍÉ ÓÔÒÏËÁÍÉ.
1 ’t’ 0 ’s’ 11111 00000 00000 11111 00000 11111 00000 11111 000 111 000 111 0 1 00000 11111 00000 1 0 1 0 000 111 000 11111 111 0 1 000 111 000 111 0 1 ’h’ ’i’ ’i’ 000 111 000 111 0 1 000 111 000 111 0 1 1 0 1 0 1 0 000 00 0 111 11 1 ’e’ ’i’ 000 111 00 11 0 1 ’n’ ’n’ 000 111 00 11 0 1 000 111 00 11 0 1 1 0 1 0 1 0 1 0 0 1 00 11 00 11 0 1 0 1 00 11 00 11 0 1 ’n’ ’n’ ’s’ ’g’ 0 1 00 11 00 11 0 1 0 1 00 11 00 11 0 1 1 0 1 0 0 1 1 0 ÷ ÎÁÇÒÕÖÅÎÎÏÍ ÄÅÒÅ×Å ËÁÖÄÙÊ ÕÔØ ÏÔ ËÏÒÎÑ Ë ÌÉÓÔÕ ÓÏÏÔ ×ÅÔÓÔ×ÕÅÔ ÏÄÎÏÍÕ ÓÌÏ×Õ ÉÚ ÍÎÏÖÅÓÔ×Á. ðÒÉ ÔÁËÏÍ ÏÄÈÏÄÅ ÕÚÌÙ ÄÅÒÅ×Á ÓÏÏÔ×ÅÔÓÔ×ÕÀÔ ÒÅÆÉËÓÁÍ ÓÌÏ×. îÁ ÒÉÓÕÎËÅ ÒÅÄÓÔÁ×ÌÅÎÏ ÎÁÇÒÕÖÅÎÎÏÅ ÄÅÒÅ×Ï ÄÌÑ ÓÌÏ× the, then, thin, this, tin, sin, sing: þÔÏÂÙ ÉÚÂÅÖÁÔØ ÒÏÂÌÅÍ, Ó×ÑÚÁÎÎÙÈ Ó ÓÏ×ÁÄÅÎÉÅÍ ÒÅÆÉËÓÏ× É ÓÌÏ×, ÏÄÏÂÎÙÈ ÎÁÌÉÞÉÀ ÓÌÏ×Á "the"É ÒÅÆÉËÓÁ "the"Õ ÓÌÏ×Á "then", ××ÅÄÅÍ ÓÅ ÉÁÌØÎÙÊ ÓÉÍ×ÏÌ * ÍÁÒËÅÒ ËÏÎ Á, ÕËÁÚÙ×ÁÀ ÝÉÊ ÏËÏÎÞÁÎÉÅ ÌÀÂÏÇÏ ÓÌÏ×Á. ÏÌØËÏ ÔÏÇÄÁ ÓÌÏ×Á ÂÕÄÕÔ ÓÌÏ×ÁÍÉ, Á ÎÅ ÒÅÆÉËÓÁÍÉ. îÁÛÅ ÄÅÒÅ×Ï ÔÅÅÒØ ×ÙÇÌÑÄÉÔ ÔÁË:
2áÎÇÌÏÑÚÙÞÎÏÅ
ÎÁÚ×ÁÎÉÅ ÜÔÏÇÏ ÔÉÁ trie (ÒÏÉÚÎÏÓÉÔÓÑ ËÁË try) ÏÂÒÁÚÏ×Á
ÎÏ ÓÒÅÄÎÉÍÉ ÂÕË×ÁÍÉ ÓÌÏ×Á retrieval (ÏÉÓË, ×ÙÂÏÒËÁ, ×ÏÚ×ÒÁÔ). õÓÔÏÑ×ÛÅÇÏÓÑ ÔÅÒÍÉÎÁ ÄÌÑ ÜÔÏÊ ÓÔÒÕËÔÕÒÙ × ÒÕÓÓËÏÊ ÌÉÔÅÒÁÔÕÒÅ ÏËÁ ÎÅÔ.
5. éÎËÁÓÕÌÑ ÉÑ ÄÁÎÎÙÈ × ÍÏÄÕÌÑÈ
243
1 ’t’ 0 ’s’ 11111 00000 00000 11111 00000 11111 00000 11111 000 111 000 111 0 1 00000 11111 00000 1 0 1 0 000 111 000 11111 111 0 1 000 111 000 111 0 1 ’h’ ’i’ ’i’ 000111 111 000 0 1 000 111 000 111 0 1 1 0 1 0 1 0 000 111 00 11 0 1 ’e’ ’i’ 000 111 00 11 0 1 ’n’ ’n’ 000 111 00 11 0 1 000 111 00 11 0 1 1 0 1 0 1 0 1 0 00 11 00 11 11 00 00 11 00 11 00 11 ’g’ 00 00 11 00 11 00 11 00 11 00 11 ’n’ ’n’ ’s’ ’*’11 ’*’ 00 11 00 11 11 00 00 11 00 11 00 11 ’*’ 0 1 0 1 00 11 00 11 00 11 00 11 00 11 00 11 1 0 1 0 0 1 1 0 1 1 0 1 0 0 0 1 0 1 0 1 0 1 ’*’ 0 1 0 1 ’*’0 ’*’ ’*’ 0 1 0 1 1 0 1 0 1 1 0 òÅÁÌÉÚÕÊÔÅ áä Trie É ÎÁÂÏÒ ÍÅÔÏÄÏ× ÄÌÑ ÒÁÂÏÔÙ Ó ÎÅÊ: Ç íÅÔÏÄ
îÁÚÎÁÞÅÎÉÅ
add isMember
äÏÂÁ×ÌÑÅÔ ÎÏ×ÙÊ ÜÌÅÍÅÎÔ × ÄÅÒÅ×Ï ÷ÏÚ×ÒÁÝÁÅÔ ÚÎÁÞÅÎÉÅ True, ÅÓÌÉ ÜÌÅÍÅÎÔ ÓÏÄÅÒ ÖÉÔÓÑ × ÓÔÒÕËÔÕÒÅ remove õÄÁÌÑÅÔ ÜÌÅÍÅÎÔ ÉÚ ÄÅÒÅ×Á isEmpty ðÒÏ×ÅÒÑÅÔ ÕÓÔÏ ÌÉ ÄÅÒÅ×Ï emptyTrie óÏÚÄÁÅÔ ÕÓÔÏÅ ÄÅÒÅ×Ï showTrie ÷ÙÄÁÅÔ ÓÉÓÏË ×ÓÅÈ ÓÌÏ×, ÓÏÄÅÒÖÁÝÉÈÓÑ × ÄÅÒÅ×Å VII.5.4
ðÒÅÄÌÏÖÉÔÅ ÄÒÕÇÕÀ ÒÅÁÌÉÚÁ ÉÀ ÎÁÇÒÕÖÅÎÎÏÇÏ ÄÅÒÅ×Á, ÈÒÁÎÑÝÕÀ × ÕÚÌÁÈ ËÏÒÔÅÖ ÔÉÁ (Bool, Char). ðÅÒ×ÙÊ ÜÌÅÍÅÎÔ ËÏÒÔÅÖÁ ÒÉ ÎÉÍÁÅÔ ÚÎÁÞÅÎÉÅ True, ÅÓÌÉ ÕÚÅÌ Ñ×ÌÑÅÔÓÑ ÏËÏÎÞÁÎÉÅÍ ÓÌÏ×Á, É False × ÒÏÔÉ×ÎÏÍ ÓÌÕÞÁÅ. VII.5.5
îÁÉÛÉÔÅ ÒÏÇÒÁÍÍÕ, ÉÓÏÌØÚÕÀÝÕÀ áä Trie ÉÚ ÒÅÄÙÄÕÝÉÈ ÕÒÁÖÎÅÎÉÊ, ÒÅÄÎÁÚÎÁÞÅÎÎÕÀ ÄÌÑ ÒÏ×ÅÒËÉ ÓÉÎÔÁËÓÉÓÁ ÓÔÒÏË ÔÅËÓÔÁ. óÔÒÏËÁ ÓÏÓÔÏÉÔ ÉÚ ÓÌÏ×, ÒÁÚÄÅÌÅÎÎÙÈ ÒÏÂÅÌÁÍÉ. óÌÏ×Ï ÓÞÉÔÁÅÔÓÑ ÎÁÉÓÁÎÎÙÍ ÒÁ×ÉÌØÎÏ, ÅÓÌÉ ÏÎÏ ÅÓÔØ × ÓÌÏ×ÁÒÅ, ÒÅÁÌÉ ÚÏ×ÁÎÎÏÍ Ó ÏÍÏÝØÀ ÎÁÇÒÕÖÅÎÎÏÇÏ ÄÅÒÅ×Á.
çÌÁ×Á VIII
÷×ÏÄ É ×Ù×ÏÄ ÉÎÆÏÒÍÁ ÉÉ 1. éÎÔÅÒÁËÔÉ×ÎÙÊ ××ÏÄ É ×Ù×ÏÄ
H
÷×ÏÄ É ×Ù×ÏÄ ËÏÎÔÒÏÌÉÒÕÀÔÓÑ ÏÅÒÁ ÉÏÎÎÏÊ ÓÉÓÔÅÍÏÊ. Haskell ÏÂÝÁÅÔÓÑ Ó ÏÅÒÁ ÉÏÎÎÏÊ ÓÉÓÔÅÍÏÊ ÄÌÑ ×ÙÏÌÎÅÎÉÑ ÏÅÒÁ ÉÊ ××Ï ÄÁ-×Ù×ÏÄÁ, ÉÓÏÌØÚÕÑ ÎÁÂÏÒ ×ÎÕÔÒÅÎÎÉÈ ÆÕÎË ÉÊ, ËÏÔÏÒÙÅ ÏÅÒÉ ÒÕÀÔ ×ÅÌÉÞÉÎÁÍÉ IO ÔÉÁ. Haskell ÉÎÔÅÒÒÅÔÉÒÕÅÔ ×ÅÌÉÞÉÎÙ ÜÔÏÇÏ ÔÉÁ, ÏÂÒÁÝÁÑÓØ Ó ÚÁÒÏÓÁÍÉ Ï ××ÏÄÅ É ×Ù×ÏÄÅ Ë ÏÅÒÁ ÉÏÎÎÏÊ ÓÉ ÓÔÅÍÅ. ÁË, ÓÌÅÄÕÀÝÉÊ ÓËÒÉÔ ÉÓÏÌØÚÕÅÔ ×ÓÔÒÏÅÎÎÕÀ ÆÕÎË ÉÀ putStr ÄÌÑ ×Ù×ÏÄÁ ÓÔÒÏËÉ "ðÒÉ×ÅÔ, ÍÉÒ!" ÎÁ ÜËÒÁÎ.
main = putStr "ðÒÉ×ÅÔ, ÍÉÒ!\n" ðÏ ÓÏÇÌÁÛÅÎÉÀ, ÓËÒÉÔ ÎÁ ÑÚÙËÅ Haskell, ËÏÔÏÒÙÊ ÏÓÕÝÅÓÔ×ÌÑÅÔ ÏÅÒÁ ÉÉ ××ÏÄÁ-×Ù×ÏÄÁ, ÄÏÌÖÅÎ ÓÏÄÅÒÖÁÔØ ÏÒÅÄÅÌÅÎÉÅ ÅÒÅÍÅÎ ÎÏÊ main × Ó×ÏÅÍ ÇÌÁ×ÎÏÍ ÍÏÄÕÌÅ. ÷Ï ×ÒÅÍÑ ÅÅ ×ÙÞÉÓÌÅÎÉÑ Haskell ÉÓÏÌØÚÕÅÔ ÏÅÒÁ ÉÏÎÎÕÀ ÓÉÓÔÅÍÕ ÄÌÑ ÒÏ×ÅÄÅÎÉÑ ÏÅÒÁ ÉÊ ××Ï ÄÁ-×Ù×ÏÄÁ.
---> main ðÒÉ×ÅÔ, ÍÉÒ! éÍÅÎÎÏ ÜÔÁ ×ÅÌÉÞÉÎÁ É Ñ×ÌÑÅÔÓÑ ÒÅÚÕÌØÔÁÔÏÍ ×ÙÏÌÎÅÎÉÑ ÏÔËÏÍ ÉÌÉÒÏ×ÁÎÎÏÊ ÒÏÇÒÁÍÍÙ ÎÁ Haskell. äÏ ÓÉÈ ÏÒ ÍÙ ÏÌØÚÏ×Á ÌÉÓØ ÔÏÌØËÏ ÉÎÔÅÒÒÅÔÁÔÏÒÏÍ Hugs ÄÌÑ ÏÌÕÞÅÎÉÑ ÒÅÚÕÌØÔÁÔÏ× ÒÏÇÒÁÍÍ. äÌÑ ÚÁÕÓËÁ ËÏÍÉÌÑÔÏÒÁ É ÏÌÕÞÅÎÉÑ ×ÙÏÌÎÑÅÍÏÇÏ ÆÁÊÌÁ, ÓÏÄÅÒÖÁÝÅÇÏ ÒÏÇÒÁÍÍÕ ÎÁ ÑÚÙËÅ Haskell, ÓÌÅÄÕÅÔ ÓÎÁÞÁÌÁ ÏÔËÏÍÉÌÉÒÏ×ÁÔØ ÍÏÄÕÌØ Ó ÏÍÏÝØÀ, ÎÁÒÉÍÅÒ, ËÏÍÉÌÑÔÏÒÁ gh , Á ÚÁÔÅÍ ×ÙÏÌÎÉÔØ ÏÌÕÞÅÎÎÙÊ ÏÔËÏÍÉÌÉÒÏ×ÁÎÎÙÊ ÆÁÊÌ, ÎÁÚÙ ×ÁÅÍÙÊ Ï ÕÍÏÌÞÁÎÉÀ a.out:
$ gh Hello.hs $ ./a.out ðÒÉ×ÅÔ, ÍÉÒ! 244
1. éÎÔÅÒÁËÔÉ×ÎÙÊ ××ÏÄ É ×Ù×ÏÄ
245
úÄÅÓØ ÓÉÍ×ÏÌ $ ÅÓÔØ ÒÉÇÌÁÛÅÎÉÅ Ë ÒÁÂÏÔÅ, ×Ù×ÏÄÉÍÏÅ ÏËÎÏÍ shell. ðÒÉ ËÏÍÉÌÑ ÉÉ ÍÏÖÎÏ ÕËÁÚÁÔØ ÉÍÑ ×ÙÈÏÄÎÏÇÏ ÆÁÊÌÁ Ó ÏÍÏ ÝØÀ ËÌÀÞÁ -o:
$ gh Hello.hs -o hello $ ./hello ðÒÉ×ÅÔ, ÍÉÒ! ëÏÍÁÎÄÙ ××ÏÄÁ ÄÁÎÎÙÈ ÄÁÀÔ ×ÏÚÍÏÖÎÏÓÔØ ÁÓÓÏ ÉÉÒÏ×ÁÔØ ÄÁÎ ÎÙÅ, ××ÅÄÅÎÎÙÅ Ó ËÌÁ×ÉÁÔÕÒÙ, Ó ÅÒÅÍÅÎÎÏÊ × ÒÏÇÒÁÍÍÅ ÎÁ Haskell, ÏÓÌÅ ÞÅÇÏ ÜÔÁ ÅÒÅÍÅÎÎÁÑ ÍÏÖÅÔ ÂÙÔØ ÉÓÏÌØÚÏ×ÁÎÁ × ËÏ ÍÁÎÄÁÈ ×Ù×ÏÄÁ. óËÒÉÔ ÍÏÖÅÔ ÓÏÄÅÒÖÁÔØ ÎÅÓËÏÌØËÏ ×ÈÏÄÎÙÈ É ×ÙÈÏÄÎÙÈ ÄÉÒÅËÔÉ×. ÷ Haskell ÌÀÂÁÑ ÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔØ ËÏÍÁÎÄ ××ÏÄÁ-×Ù×ÏÄÁ ÏÒÅÄÅÌÑÅÔÓÑ do-×ÙÒÁÖÅÎÉÅÍ. òÁÓÓÍÏÔÒÉÍ ÓËÒÉÔ, ÚÁÒÁÛÉ×ÁÀÝÉÊ Ó ËÌÁ×ÉÁÔÕÒÙ ÉÍÑ ÏÌØ ÚÏ×ÁÔÅÌÑ, ÏÓÌÅ ÞÅÇÏ ÏÎÏ ÉÓÏÌØÚÕÅÔÓÑ × ËÏÍÁÎÄÅ ×Ù×ÏÄÁ.
main = do putStr "÷×ÅÄÉÔÅ ÷ÁÛÅ ÉÍÑ, ÏÖÁÌÕÊÓÔÁ:\n" name <- getLine putStr ("úÄÒÁ×ÓÔ×ÕÊÔÅ, " ++ name ++ ".\n" ++ "óÅÇÏÄÎÑ ÚÁÍÅÞÁÔÅÌØÎÙÊ ÄÅÎØ! (:-)\n")
ðÏÄÏÂÎÙÊ ÓËÒÉÔ ÍÏÖÎÏ ÏÔËÏÍÉÌÉÒÏ×ÁÔØ É ×ÙÏÌÎÉÔØ ÏÌÕÞÅÎ ÎÙÊ ÆÁÊÌ:
$ gh enterName.hs -o enterName $ ./enterName ÷×ÅÄÉÔÅ ÷ÁÛÅ ÉÍÑ, ÏÖÁÌÕÊÓÔÁ: é×ÁÎ úÄÒÁ×ÓÔ×ÕÊÔÅ, é×ÁÎ. óÅÇÏÄÎÑ ÚÁÍÅÞÁÔÅÌØÎÙÊ ÄÅÎØ! (:-) ëÏÎÅÞÎÏ, ÍÏÖÎÏ ×ÏÓÏÌØÚÏ×ÁÔØÓÑ É ÉÎÔÅÒÒÅÔÁÔÏÒÏÍ:
---> main ÷×ÅÄÉÔÅ ÷ÁÛÅ ÉÍÑ, ÏÖÁÌÕÊÓÔÁ: é×ÁÎ úÄÒÁ×ÓÔ×ÕÊÔÅ, é×ÁÎ. óÅÇÏÄÎÑ ÚÁÍÅÞÁÔÅÌØÎÙÊ ÄÅÎØ! (:-) ðÅÒ×ÁÑ ÓÔÒÏËÁ, ÎÁÅÞÁÔÁÎÎÁÑ × ÒÏ ÅÓÓÅ ×ÙÏÌÎÅÎÉÑ ÆÕÎË ÉÉ main, Ñ×ÌÑÅÔÓÑ ÒÅÚÕÌØÔÁÔÏÍ ×ÙÏÌÎÅÎÉÑ ÏÅÒÁ ÉÉ ×Ù×ÏÄÁ, ×ÔÏ ÒÁÑ ÏÔÒÁÖÅÎÉÅÍ ÏÅÒÁ ÉÏÎÎÏÊ ÓÉÓÔÅÍÏÊ ××ÏÄÁ, ÒÏÉÚ×ÅÄÅÎÎÏ ÇÏ Ó ËÌÁ×ÉÁÔÕÒÙ, ÔÒÅÔØÑ É ÞÅÔ×ÅÒÔÁÑ ÓÎÏ×Á Ñ×ÌÑÀÔÓÑ ÒÅÚÕÌØÔÁÔÏÍ ×ÙÏÌÎÅÎÉÑ ÏÅÒÁ ÉÊ ×Ù×ÏÄÁ.
VIII. ÷×ÏÄ É ×Ù×ÏÄ ÉÎÆÏÒÍÁ ÉÉ
246
úÁ ËÌÀÞÅ×ÙÍ ÓÌÏ×ÏÍ do ÄÏÌÖÎÁ ÓÌÅÄÏ×ÁÔØ ÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔØ ÏÅÒÁ ÉÊ ××ÏÄÁ-×Ù×ÏÄÁ. ÷ ÜÔÏÍ ÒÉÍÅÒÅ ÉÈ ÂÙÌÏ ÔÒÉ. ðÅÒ×ÁÑ ÉÚ ÎÉÈ ×Ù×ÅÌÁ ÓÔÒÏËÕ "÷×ÅÄÉÔÅ ÷ÁÛÅ ÉÍÑ, ÏÖÁÌÕÊÓÔÁ:\n"ÎÁ ÜËÒÁÎ. ÁË ËÁË × ËÏÎ Å ÓÔÒÏËÉ ÄÏÂÁ×ÌÅÎ ÓÉÍ×ÏÌ "\n", ÔÏ ÏÓÌÅ ÏËÏÎÞÁÎÉÑ ×Ù×ÏÄÁ ËÕÒÓÏÒ ÅÒÅÍÅÓÔÉÌÓÑ × ÎÁÞÁÌÏ ÓÌÅÄÕÀÝÅÊ ÓÔÒÏËÉ. ÷ÔÏÒÁÑ ËÏÍÁÎÄÁ (name <- getLine) ÞÉÔÁÅÔ ÓÔÒÏËÕ, ××ÅÄÅÎÎÕÀ Ó ËÌÁ×ÉÁ ÔÕÒÙ É ÁÓÓÏ ÉÉÒÕÅÔ ÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔØ ÏÌÕÞÅÎÎÙÈ ÓÉÍ×ÏÌÏ× Ó ÅÒÅÍÅÎÎÏÊ, ÕËÁÚÁÎÎÏÊ ÅÒÅÄ ÓÔÒÅÌËÏÊ (<-). ÷ ÎÁÛÅÍ ÒÉÍÅÒÅ Å ÒÅÍÅÎÎÁÑ ÎÏÓÉÔ ÉÍÑ name. ìÀÂÁÑ ÄÉÒÅËÔÉ×Á do-×ÙÒÁÖÅÎÉÑ ÍÏÖÅÔ ÏÅÒÉÒÏ ×ÁÔØ ÜÔÏÊ ÅÒÅÍÅÎÎÏÊ, ÎÏ ÏÎÁ do-×ÙÒÁÖÅÎÉÑ. é, ÎÁËÏÎÅ , ÔÒÅÔØÑ ËÏÍÁÎÄÁ ÏÓÙÌÁÅÔ ÎÁ ÜËÒÁÎ ÏÓÌÅÄÏ×ÁÔÅÌØ ÎÏÓÔØ ÓÉÍ×ÏÌÏ×, ×ËÌÀÞÁÀÝÕÀ Ä×Á ÓÉÍ×ÏÌÁ ÅÒÅÈÏÄÁ ÎÁ ÎÏ×ÕÀ ÓÔÒÏËÕ ('\n'). ðÒÉ ÉÓÏÌØÚÏ×ÁÎÉÉ ËÏÎÓÔÒÕË ÉÉ do ÓÌÅÄÕÅÔ ÏÍÎÉÔØ Ï Ä×ÕÍÅÒ ÎÏÍ ÓÉÎÔÁËÓÉÓÅ ÑÚÙËÁ: ÎÕÖÎÏ ×ÎÉÍÁÔÅÌØÎÏ ÓÌÅÄÉÔØ ÚÁ ÇÌÕÂÉÎÏÊ ÏÔ ÓÔÕÁ × ÓÔÒÏËÁÈ, Ñ×ÌÑÀÝÉÈÓÑ ÒÏÄÏÌÖÅÎÉÅÍ do-×ÙÒÁÖÅÎÉÑ. úÄÅÓØ ÒÉÍÅÎÑÀÔÓÑ ÔÅ ÖÅ ÒÁ×ÉÌÁ, ÞÔÏ É × ËÏÎÓÔÒÕË ÉÑÈ let É where. ðÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔØ ÄÉÒÅËÔÉ× ××ÏÄÁ-×Ù×ÏÄÁ ÍÏÖÅÔ, ËÏÎÅÞÎÏ, ÓÏÄÅÒÖÁÔØ ÎÅÓËÏÌØËÏ ÛÁÇÏ×. ÁË × ÓÌÅÄÕÀÝÅÍ ÓËÒÉÔÅ Ó ËÌÁ×ÉÁ ÔÕÒÙ ÚÁÒÁÛÉ×ÁÀÔÓÑ Ä×Å ×ÅÌÉÞÉÎÙ, ÚÁÔÅÍ ÏÓÕÝÅÓÔ×ÌÑÅÔÓÑ ×Ù×ÏÄ, ÏÓÌÅ ÞÅÇÏ ÚÁÒÁÛÉ×ÁÅÔÓÑ ÓÉÇÎÁÌ ÏÄÔ×ÅÒÖÄÁÀÝÉÊ ÏËÏÎÞÁÎÉÅ ××Ï ÄÁ:
ÓÌÅÄÕÀÝÁÑ
ÎÅ ×ÉÄÎÁ ×ÎÅ
main = do putStr "÷×ÅÄÉÔÅ ÷ÁÛÅ ÉÍÑ, ÏÖÁÌÕÊÓÔÁ:\n" name <- getLine putStr "÷×ÅÄÉÔÅ ÷ÁÛ e-mail ÁÄÒÅÓ::\n" adress <- getLine putStr (unlines [ "úÄÒÁ×ÓÔ×ÕÊÔÅ, " ++ name ++ ".", "íÙ ×ÙÛÌÅÍ ×ÁÍ ÓÏÏÂÝÅÎÉÅ ÎÁ ÁÄÒÅÓ " ++ adress ++ ".", "îÁÖÍÉÔÅ Enter ÄÌÑ ÚÁ×ÅÒÛÅÎÉÑ ÒÁÂÏÔÙ"℄) signOff <- getLine return()
H
ïÂÍÅÎ ÓÏÏÂÝÅÎÉÑÍÉ ×Ï ×ÒÅÍÑ ÄÉÁÌÏÇÁ Ó ÆÕÎË ÉÅÊ main ÍÏÖÅÔ ×Ù ÇÌÑÄÅÔØ ÔÁË:
---> main
1. éÎÔÅÒÁËÔÉ×ÎÙÊ ××ÏÄ É ×Ù×ÏÄ
247
÷×ÅÄÉÔÅ ÷ÁÛÅ ÉÍÑ, ÏÖÁÌÕÊÓÔÁ: é×ÁÎ ÷×ÅÄÉÔÅ ÷ÁÛ e-mail ÁÄÒÅÓ:: pypkinqqq. om úÄÒÁ×ÓÔ×ÕÊÔÅ, é×ÁÎ. íÙ ×ÙÛÌÅÍ ×ÁÍ ÓÏÏÂÝÅÎÉÅ ÎÁ ÁÄÒÅÓ pypkinqqq. om. îÁÖÍÉÔÅ Enter ÄÌÑ ÏÄÔ×ÅÒÖÄÅÎÉÑ ÓÏÇÌÁÓÉÑ ðÕÓÔÁÑ ÓÔÒÏËÁ, ÏÑ×É×ÛÁÑÓÑ ÏÓÌÅ ÏÓÌÅÄÎÅÊ ÎÁÅÞÁÔÁÎÎÏÊ ÒÏ ÇÒÁÍÍÏÊ ÆÒÁÚÙ, Ñ×ÌÑÅÔÓÑ ÏÔÏÂÒÁÖÅÎÉÅÍ ÎÁÖÁÔÉÑ ËÌÁ×ÉÛÉ Enter. éÓÏÌØÚÕÅÍÁÑ × ÓËÒÉÔÅ ÆÕÎË ÉÑ unlines ÏÒÅÄÅÌÅÎÁ × ÒÅ ÌÀÄÉÉ É ÆÏÒÍÉÒÕÅÔ ÏÄÎÕ ÓÔÒÏËÕ ÉÚ ÓÉÓËÁ ÓÔÒÏË, ×ÓÔÁ×ÌÑÑ ÍÅÖÄÕ ÎÉÍÉ ÓÉÍ×ÏÌ ÅÒÅ×ÏÄÁ ÎÁ ÎÏ×ÕÀ ÓÔÒÏËÕ:
---> unlines ["line1", "line2", "line3"℄ "line1\nline2\nline3\n" ðÒÉ ×Ù×ÏÄÅ ÕÄÏÂÎÏ ÉÓÏÌØÚÏ×ÁÔØ ÆÕÎË ÉÀ putStrLn, ËÏÔÏÒÁÑ ÏÓÌÅ ÅÞÁÔÉ ÓÔÒÏËÉ ÄÏÂÁ×ÌÑÅÔ ÓÉÍ×ÏÌ '\n' ÄÌÑ ÅÒÅ×ÏÄÁ ËÕÒÓÏÒÁ ÎÁ ÎÏ×ÕÀ ÓÔÒÏËÕ:
main = do putStr "÷×ÅÄÉÔÅ ÞÔÏ-ÎÉÂÕÄØ: " str <- getLine putStrLn ("÷Ù ××ÅÌÉ: " ++ str) ---> main ÷×ÅÄÉÔÅ ÞÔÏ-ÎÉÂÕÄØ: 2+3 ÷Ù ××ÅÌÉ: 2+3
H
H
Haskell ÄÁÅÔ ×ÏÚÍÏÖÎÏÓÔØ ××ÏÄÁ ÉÌÉ ×Ù×ÏÄÁ ÏÄÎÏÇÏ ÅÄÉÎÓÔ×ÅÎ ÎÏÇÏ ÓÉÍ×ÏÌÁ, ÄÌÑ ÞÅÇÏ ÉÓÏÌØÚÕÀÔÓÑ ÆÕÎË ÉÉ getChar É putChar:
e1 = do <- getChar putChar ðÒÉ ×ÙÚÏ×Å ÆÕÎË ÉÉ e1 ××ÅÄÅÎÎÙÊ ÓÉÍ×ÏÌ ÏÔÏÂÒÁÚÉÔÓÑ Ä×ÁÖÄÙ: ÓÎÁÞÁÌÁ ËÁË ÜÈÏ ËÌÁ×ÉÁÔÕÒÎÏÇÏ ××ÏÄÁ, ÚÁÔÅÍ ËÁË ÒÅÚÕÌØÔÁÔ ÒÁÂÏÔÙ ÆÕÎË ÉÉ putChar.
---> e1 ww òÁÓÓÍÏÔÒÅÎÎÁÑ ×ÙÛÅ ÆÕÎË ÉÑ putStrLn ÏÒÅÄÅÌÅÎÁ × ÒÅÌÀÄÉÉ Ó ÏÍÏÝØÀ ÆÕÎË ÉÉ putChar:
H
VIII. ÷×ÏÄ É ×Ù×ÏÄ ÉÎÆÏÒÍÁ ÉÉ
248
putStrLn :: String -> IO () putStrLn s = do putStr s putChar '\n'
éÔÁË, ÍÙ ÍÏÖÅÍ ×ÙÏÌÎÑÔØ ÎÅËÏÔÏÒÙÅ ÄÅÊÓÔ×ÉÑ É ÉÓÏÌØÚÏ ×ÁÔØ ÏÌÕÞÅÎÎÙÊ ÒÅÚÕÌØÔÁÔ, ÎÏ ËÁË ÎÁÍ ×ÅÒÎÕÔØ ×ÅÌÉÞÉÎÕ, ÏÌÕ ÞÅÎÎÕÀ ÉÚ ÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔÉ ÄÅÊÓÔ×ÉÊ? ë ÒÉÍÅÒÕ, ÕÓÔØ ÆÕÎË ÉÑ ready, ÓÞÉÔÙ×ÁÅÔ ÓÉÍ×ÏÌ É ×ÏÚ×ÒÁÝÁÅÔ True, ÅÓÌÉ ××ÅÄÅÎÎÙÊ ÓÉÍ×ÏÌ ÒÁ×ÅÎ 'y':
ready = do <- getChar
== 'y' ïÒÅÄÅÌÅÎÎÁÑ ÔÁËÉÍ ÏÂÒÁÚÏÍ ÆÕÎË ÉÑ ÎÅ ÂÕÄÅÔ ÒÁÂÏÔÁÔØ ÉÎÔÅÒ ÒÅÔÁÔÏÒ ×ÙÄÁÓÔ ÏÛÉÂËÕ ÎÅÓÏÏÔ×ÅÔÓÔ×ÉÑ ÔÉÁ, ÔÁË ËÁË ×ÙÒÁÖÅÎÉÅ
== 'y' ÉÍÅÅÔ ÔÉ Bool, × ÔÏ ×ÒÅÍÑ ËÁË ÎÁÌÉÞÉÅ ËÏÎÓÔÒÕË ÉÉ do ÔÒÅÂÕÅÔ, ÞÔÏÂÙ ÒÅÚÕÌØÔÁÔ ÉÍÅÌ ÔÉ IO, Ô. Å. Ñ×ÌÑÌÓÑ ÂÙ ÄÅÊ ÓÔ×ÉÅÍ. ÷ ÏÄÏÂÎÏÊ ÓÉÔÕÁ ÉÉ ÔÒÅÂÕÅÔÓÑ ÓÏÚÄÁÔØ ×ÅÌÉÞÉÎÕ ÔÉÁ IO, ÂÅÒÕÝÕÀ ÌÏÇÉÞÅÓËÕÀ ×ÅÌÉÞÉÎÕ, É ÎÉÞÅÇÏ ÎÅ ÄÅÌÁÀÝÕÀ, ËÒÏÍÅ ×ÏÚ ×ÒÁÝÅÎÉÑ ÒÅÚÕÌØÔÁÔÁ ÌÏÇÉÞÅÓËÏÇÏ ÔÉÁ. äÌÑ ÒÅÛÅÎÉÑ ÒÏÂÌÅÍÙ ×ÏÓÏÌØÚÕÅÍÓÑ ÆÕÎË ÉÅÊ return, ×ËÌÀÞÅÎÎÏÊ × ÒÅÌÀÄÉÀ É ÉÍÅÀÝÅÊ ÔÉ a -> IO a. ïÔÍÅÔÉÍ, ÞÔÏ ÆÕÎË ÉÑ getLine, ÉÓÏÌØÚÕÅÍÁÑ ÎÁÍÉ × ÒÅÄÙÄÕÝÉÈ ÒÉÍÅÒÁÈ, ÏÒÅÄÅÌÅÎÁ × ÒÅÌÀÄÉÉ ÔÁËÖÅ Ó ÏÍÏÝØÀ ÆÕÎË ÉÉ return:
getLine getLine
:: IO String = do <- getChar if =='\n' then return "" else do s <- getLine return ( : s)
ïÂÒÁÔÉÔÅ ×ÎÉÍÁÎÉÅ ÎÁ ×ÔÏÒÏÅ ÕÔ×ÅÒÖÄÅÎÉÅ do, ×ÈÏÄÑÝÅÅ × ×ÅÔ×Ø else. ëÁÖÄÏÅ do-ÕÔ×ÅÒÖÄÅÎÉÅ Ñ×ÌÑÅÔÓÑ ÅÄÉÎÓÔ×ÅÎÎÏÊ ÅÏÞËÏÊ ÕÔ×ÅÒÖÄÅÎÉÊ. ìÀÂÁÑ ×ÎÅÄÒÑÀÝÁÑÓÑ × ÎÅÅ ËÏÎÓÔÒÕË ÉÑ, ÔÁËÁÑ ËÁË if, ÄÏÌÖÎÁ ÉÓÏÌØÚÏ×ÁÔØ ÎÏ×ÏÅ do-ÕÔ×ÅÒÖÄÅÎÉÅ ÄÌÑ ÉÎÉ ÉÁ ÉÉ ÄÁÌØÎÅÊÛÅÊ ÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔÉ ÄÅÊÓÔ×ÉÊ. æÕÎË ÉÑ return ÂÅÒÅÔ ÎÅËÕÀ ×ÅÌÉÞÉÎÕ É ÒÅ×ÒÁÝÁÅÔ ÅÅ × ÄÅÊ ÓÔ×ÉÅ, Ó×ÑÚÁÎÎÏÅ Ó ××ÏÄÏÍ-×Ù×ÏÄÏÍ ÄÁÎÎÙÈ. ëÁËÉÍ ÖÅ ÏÂÒÁÚÏÍ ÏÓÕÝÅÓÔ×ÉÔØ ÏÂÒÁÔÎÏÅ ÒÅÏÂÒÁÚÏ×ÁÎÉÅ? íÏÖÎÏ ÌÉ ÉÓÏÌØÚÏ×ÁÔØ ×ÅÌÉÞÉÎÙ ÔÉÁ IO × ÏÂÙÞÎÙÈ ×ÙÒÁÖÅÎÉÑÈ? ïÔ×ÅÔ ÎÁ ÏÓÌÅÄÎÉÊ ×ÏÒÏÓ ÏÔÒÉ ÁÔÅÌØÎÙÊ. îÅÌØÚÑ ÓÍÅÛÉ×ÁÔØ ÄÅÊÓÔ×ÉÑ É ×ÅÌÉÞÉ ÎÙ × ÏÄÎÏÍ ×ÙÒÁÖÅÎÉÉ.
1. éÎÔÅÒÁËÔÉ×ÎÙÊ ××ÏÄ É ×Ù×ÏÄ
249
I õÒÁÖÎÅÎÉÅ VIII.1.1
ïÒÅÄÅÌÉÔÅ ÆÕÎË ÉÀ ready Ó ÏÍÏÝØÀ return. äÌÑ ÅÞÁÔÉ ÒÅ ÚÕÌØÔÁÔÁ ÒÉÍÅÎÉÔÅ ÆÕÎË ÉÀ print (ÔÁËÖÅ ÓÏÄÅÒÖÁÝÕÀÓÑ × ÆÁÊ ÌÅ Prelude.hs), ËÏÔÏÒÁÑ ÒÅÏÂÒÁÚÕÅÔ Ó×ÏÊ ÁÒÇÕÍÅÎÔ × ÓÔÒÏËÕ É ÅÞÁÔÁÅÔ ÅÅ, ÄÏÂÁ×ÌÑÑ ÓÉÍ×ÏÌ '\n' × ËÏÎ Å.
ready = do <- getChar return ( == 'y')
e2 = do r <- ready print r ÅÅÒØ ÍÙ ÍÏÖÅÍ Õ×ÉÄÅÔØ ÒÅÚÕÌØÔÁÔÙ ÒÁÂÏÔÙ ÆÕÎË ÉÉ ready (True, ÅÓÌÉ ××ÅÄÅÎ ÓÉÍ×ÏÌ 'y' É False × ÒÏÔÉ×ÎÏÍ ÓÌÕÞÁÅ):
---> e2 dFalse
H
---> e2 yTrue ïÔÍÅÔÉÍ, ÞÔÏ ÆÕÎË ÉÀ ready ÎÅÌØÚÑ ÉÓÏÌØÚÏ×ÁÔØ ÁÎÁÌÏÇÉÞÎÏ ÏÂÙÞÎÙÍ ÌÏÇÉÞÅÓËÉÍ ×ÅÌÉÞÉÎÁÍ (ÎÁÒÉÍÅÒ, ×ËÌÀÞÉÔØ × ÌÏÇÉÞÅ ÓËÏÅ ×ÙÒÁÖÅÎÉÅ), ÔÁË ËÁË ÅÅ ÔÉ IO Bool:
---> ready && True ERROR - Type error *** Expression *** Term *** Type *** Does not mat h ---> print (ready) <> ---> :type ready ready :: IO Bool
in appli ation : ready && True : ready : IO Bool : Bool
J
æÕÎË ÉÑ print ×Ù×ÏÄÉÔ ÎÁ ÅÞÁÔØ Ó×ÏÊ ÁÒÇÕÍÅÎÔ, ÅÓÌÉ ÏÎ ÏÔ ÌÉÞÅÎ ÏÔ ÔÉÁ IO t ÄÌÑ ÌÀÂÏÇÏ t.
---> print True True ---> print"Hello" "Hello" ---> print 3 3
H
H
250
VIII. ÷×ÏÄ É ×Ù×ÏÄ ÉÎÆÏÒÍÁ ÉÉ
---> print(putChar 'p') <>
H
H
÷ÅÌÉÞÉÎÙ ÔÉÁ IO ÒÁÚÄÅÌÑÀÔ ÍÉÒ ÒÏÇÒÁÍÍ, ÎÁÉÓÁÎÎÙÈ ÎÁ ÑÚÙËÅ Haskell, ÎÁ ×ÅÌÉÞÉÎÙ É ÄÅÊÓÔ×ÉÑ. ÷ ÒÅÄÙÄÕÝÉÈ ÒÁÚÄÅÌÁÈ ËÎÉÇÉ ÍÙ ÉÓÏÌØÚÏ×ÁÌÉ ÔÏÌØËÏ ×ÅÌÉÞÉÎÙ, ÎÏ ÔÅÅÒØ Õ ÎÁÓ ÏÑ×É ÌÁÓØ ×ÏÚÍÏÖÎÏÓÔØ ×ÙÏÌÎÑÔØ ÔÅ ÉÌÉ ÉÎÙÅ ÄÅÊÓÔ×ÉÑ. Hugs ÄÁÅÔ ÎÁÍ ÉÎÆÏÒÍÁ ÉÀ Ï ÔÉÅ ×ÙÒÁÖÅÎÉÑ ÅÞÁÔÁÑ ÅÇÏ. ïÒÅÄÅÌÉÍ ÓÉÓÏË, ÓÏÄÅÒÖÁÝÉÊ ÔÒÉ ×ÅÌÉÞÉÎÙ ÔÉÁ IO, ÏÓÌÅ ÞÅÇÏ ×Ù×ÅÄÅÍ ÅÇÏ:
todoList :: [IO ()℄ todoList = [putChar 'a', do putChar 'b' putChar ' ', do <- getChar putChar ℄ ---> todoList [<>,<>,<>℄ ëÁËÉÍ ÖÅ ÏÂÒÁÚÏÍ ÍÏÖÎÏ ×ÙÏÌÎÉÔØ ÄÅÊÓÔ×ÉÑ, ÚÁÄÁÎÎÙÅ × ÓÉÓËÅ todoList? ÷ËÌÀÞÅÎÎÁÑ × ÒÅÌÀÄÉÀ ÆÕÎË ÉÑ sequen e_ ÏÚ×ÏÌÑÅÔ ×ÙÏÌÎÑÔØ ÄÅÊÓÔ×ÉÑ, ÚÁÄÁÎÎÙÅ ×ÅÌÉÞÉÎÁÍÉ ÔÉÁ IO (). åÓÌÉ ÅÅ ÒÉÍÅÎÉÔØ ×ÅÌÉÞÉÎÁÍ, ÁÎÁÌÏÇÉÞÎÙÍ ÓÉÓËÕ todoList, ÔÏ ÄÅÊÓÔ×ÉÑ ÂÕÄÕÔ ×ÙÏÌÎÅÎÙ:
---> sequen e_ todoList ab !! úÄÅÓØ ÓÎÁÞÁÌÁ ÂÙÌÉ ÎÁÅÞÁÔÁÎÙ ÓÉÍ×ÏÌÙ 'a', 'b', ' ', ÏÓÌÅ ÞÅÇÏ ÏÖÉÄÁÌÓÑ ××ÏÄ ÅÝÅ ÏÄÎÏÇÏ ÓÉÍ×ÏÌÁ. ÷ ÄÁÎÎÏÍ ÒÉÍÅÒÅ ÂÙÌ ××ÅÄÅÎ ÓÉÍ×ÏÌ ' !', ¾ÜÈÏ¿ ËÏÔÏÒÏÇÏ ÂÙÌÏ ÎÁÅÞÁÔÁÎÏ ÒÉ ××ÏÄÅ ÓÉÍ×ÏÌÁ, Á ÚÁÔÅÍ ÂÙÌÏ ×ÙÏÌÎÅÎÏ ÄÅÊÓÔ×ÉÅ putChar ÅÞÁÔØ ××ÅÄÅÎÎÏÇÏ ÓÉÍ×ÏÌÁ.
2. èÒÁÎÅÎÉÅ ÉÎÆÏÒÍÁ ÉÉ × ÆÁÊÌÁÈ íÙ ÎÁÕÞÉÌÉÓØ ÉÓÁÔØ ÒÏÇÒÁÍÍÙ, ÏÓÕÝÅÓÔ×ÌÑÀÝÉÅ ÉÎÔÅÒÁË ÔÉ×ÎÏÅ ×ÚÁÉÍÏÄÅÊÓÔ×ÉÅ Ó ÏÌØÚÏ×ÁÔÅÌÅÍ: ÉÎÆÏÒÍÁ ÉÑ ÏÔ ÏÌØÚÏ ×ÁÔÅÌÑ ÅÒÅÄÁÅÔÓÑ ÏÓÒÅÄÓÔ×ÏÍ ××ÏÄÁ ÄÁÎÎÙÈ Ó ÏÍÏÝØÀ ËÌÁ×ÉÁ ÔÕÒÙ, Á ÉÎÆÏÒÍÁ ÉÑ ÄÌÑ ÏÌØÚÏ×ÁÔÅÌÑ ×Ù×ÏÄÉÔÓÑ ÎÁ ÜËÒÁÎ. ïÄ ÎÁËÏ ÉÎÆÏÒÍÁ ÉÑ, ÏÔÏÂÒÁÖÁÅÍÁÑ ÎÁ ÜËÒÁÎÅ, ÓÌÉÛËÏÍ ÉÚÍÅÎÞÉ×Á É ÎÅ ÍÏÖÅÔ ÈÒÁÎÉÔÓÑ ÎÁ ÎÅÍ ÏÞÅÎØ ÄÏÌÇÏ ÏÎÁ ÓËÏÒÏ ¾ÚÁÔÉÒÁ ÅÔÓÑ¿ ÄÒÕÇÏÊ ÉÎÆÏÒÍÁ ÉÅÊ. ëÏÍØÀÔÅÒÎÙÅ ÓÉÓÔÅÍÙ ÒÅÄÌÁÇÁÀÔ
2. èÒÁÎÅÎÉÅ ÉÎÆÏÒÍÁ ÉÉ × ÆÁÊÌÁÈ
251
ÓÏÓÏ ÓÏÈÒÁÎÅÎÉÑ ÉÎÆÏÒÍÁ ÉÉ × ÔÅÞÅÎÉÉ ÒÏÄÏÌÖÉÔÅÌØÎÏÇÏ ×ÒÅ ÍÅÎÉ, ÏÓÎÏ×ÁÎÎÙÊ ÎÁ ÉÓÏÌØÚÏ×ÁÎÉÉ ÆÁÊÌÏ×ÏÊ ÓÉÓÔÅÍÙ. ÷ÚÁÉÍÏ ÄÅÊÓÔ×ÕÑ Ó ÆÁÊÌÁÍÉ, ÒÏÇÒÁÍÍÁ ÍÏÖÅÔ ÏÌÕÞÉÔØ ÉÎÆÏÒÍÁ ÉÀ ÉÚ ÆÁÊÌÁ, ËÁË ÔÏÌØËÏ ÏÎÁ ÏÔÒÅÂÕÅÔÓÑ. éÎÔÅÒÁËÔÉ×ÎÏ ×ÚÁÉÍÏÄÅÊÓÔ×ÕÑ Ó ÆÁÊÌÏ×ÏÊ ÓÉÓÔÅÍÏÊ, ÒÏÇÒÁÍÍÁ ÍÏÖÅÔ ×ÏÓÏÌØÚÏ×ÁÔØÓÑ ÉÎÆÏÒ ÍÁ ÉÅÊ ÉÚ ÆÁÊÌÁ, ÓÏÚÄÁÎÎÏÇÏ ÒÁÎÅÅ ÌÉÂÏ ÅÀ ÓÁÍÏÊ, ÌÉÂÏ ÄÒÕÇÉÍ ÒÏÇÒÁÍÍÎÙÍ ÓÒÅÄÓÔ×ÏÍ. ðÒÅÄÏÌÏÖÉÍ, ÞÔÏ ÔÒÅÂÕÅÔÓÑ ÎÁÉÓÁÔØ ÒÏÇÒÁÍÍÕ ÎÁ Haskell, ËÏÔÏÒÁÑ ÂÕÄÅÔ ÚÁÉÓÙ×ÁÔØ × ÆÁÊÌ ÓÔÒÏËÕ ÔÅËÓÔÁ, ××ÅÄÅÎÎÕÀ Ó ËÌÁ ×ÉÁÔÕÒÙ. ðÒÏÇÒÁÍÍÁ ÍÏÖÅÔ ×ÙÇÌÑÄÅÔØ ÔÁË:
main = do putStr (unlines["÷×ÅÄÉÔÅ ÏÄÎÕ ÓÔÒÏËÕ:"℄) lineFromKeyboard <- getLine writeFile filename lineFromKeyboard putStr ("÷×ÅÄÅÎÎÁÑ ÓÔÒÏËÁ ÚÁÉÓÁÎÁ × ÆÁÊÌ\""++ filename ++ "\"") where filename = "oneLiner.txt" úÁÉÓØ × ÆÁÊÌ ÏÓÕÝÅÓÔ×ÌÑÅÔÓÑ ÏÓÒÅÄÓÔ×ÏÍ ËÏÍÁÎÄÙ ×Ù×ÏÄÁ, ÎÁ ÚÙ×ÁÅÍÏÊ writeFile. ðÅÒ×ÙÊ ÁÒÇÕÍÅÎÔ ÜÔÏÊ ÆÕÎË ÉÉ ÓÔÒÏËÁ, ÓÏÄÅÒÖÁÝÁÑ ÉÍÑ ÓÏÚÄÁ×ÁÅÍÏÇÏ ÆÁÊÌÁ, Á ×ÔÏÒÏÊ ÓÔÒÏËÁ, ÚÁÉÓÙ ×ÁÅÍÁÑ × ÎÅÇÏ. ÷ ÄÁÎÎÏÍ ÓÌÕÞÁÅ ×Ù×ÏÄÉÍÁÑ ÓÔÒÏËÁ ÓÏÄÅÒÖÁÌÁ ×ÓÅÇÏ ÏÄÉÎ ÓÉÍ×ÏÌ ÏËÏÎÞÁÎÉÑ ÓÔÒÏËÉ, ÎÏ × ÏÂÝÅÍ ÓÌÕÞÁÅ ÉÈ ÍÏÖÅÔ ÂÙÔØ ÎÅÓËÏÌØËÏ. óÌÅÄÕÀÝÉÊ ÓËÒÉÔ ÓÏÚÄÁÅÔ ÆÁÊÌ, ÓÏÄÅÒÖÉÍÏÅ ËÏÔÏÒÏ ÇÏ ÒÁÚÄÅÌÅÎÏ ÎÁ ÔÒÉ ÓÔÒÏËÉ ÔÅËÓÔÁ:
main = writeFile "books.dat" (unlines books) where books = [ "á.ó. ðÕÛËÉÎ, \t \"óËÁÚËÁ Ï ÒÙÂÁËÅ É ÒÙÂËÅ\"", "ì.î. ÏÌÓÔÏÊ, \t \"÷ÏÊÎÁ É ÍÉÒ\", Þ.1", "÷.á. úÏÒÉÞ, \t \"íÁÔÅÍÁÔÉÞÅÓËÉÊ ÁÎÁÌÉÚ\", Ô.2" ℄ îÉÖÅ ÏËÁÚÁÎÁ ÒÁÂÏÔÁ ÜÔÏÊ ÒÏÇÒÁÍÍÙ. äÌÑ ÏÌÕÞÅÎÉÑ ×ÙÏÌÎÑÅ ÍÏÇÏ ËÏÄÁ ÉÓÏÌØÚÏ×ÁÌÓÑ ËÏÍÉÌÑÔÏÒ gh . ëÏÍÁÎÄÁ ls -l ×ÙÄÁÅÔ ÉÎÆÏÒÍÁ ÉÀ Ï ÒÁÚÍÅÒÅ ÆÁÊÌÁ É ÒÁ×ÁÈ ÄÏÓÔÕÁ Ë ÎÅÍÕ. íÙ ×É ÄÉÍ, ÞÔÏ ÆÁÊÌ writeBooks, ÏÌÕÞÅÎÎÙÊ × ÒÅÚÕÌØÔÁÔÅ ËÏÍÉÌÑ ÉÉ, Ñ×ÌÑÅÔÓÑ ÉÓÏÌÎÑÅÍÙÍ (× ÒÁ×ÁÈ ÄÏÓÔÕÁ ÓÏÄÅÒÖÉÔÓÑ ÓÉÍ×ÏÌ x). ëÁË ÕÖÅ ÏÔÍÅÞÁÌÏÓØ, ÏÔËÏÍÉÌÉÒÏ×ÁÎÎÁÑ ÒÏÇÒÁÍÍÁ ÒÉ ÅÅ ×ÙÚÏ ×Å ×ÙÞÉÓÌÑÅÔ ÆÕÎË ÉÀ main, ËÏÔÏÒÁÑ × ÄÁÎÎÏÊ ÒÏÇÒÁÍÍÅ ÓÏÚÄÁÅÔ
VIII. ÷×ÏÄ É ×Ù×ÏÄ ÉÎÆÏÒÍÁ ÉÉ
252
ÆÁÊÌ Ó ËÏÌÉÞÅÓÔ×ÏÍ ÓÔÒÏË, ÒÁ×ÎÙÍ ÄÌÉÎÅ ÓÉÓËÁ books. ëÏÍÁÎÄÁ
at ×Ù×ÏÄÉÔ ÓÏÄÅÒÖÉÍÏÅ ÆÁÊÌÁ ÏÓÔÒÏÞÎÏ ÎÁ ÜËÒÁÎ.
$ gh writeBooks.hs -o writeBooks $ ls -l writeBooks -rwxrwxr-x 1 test test 370558 îÏÑ 18 17:40 writeBooks $ ./writeBooks $ at books.dat á.ó. ðÕÛËÉÎ, "óËÁÚËÁ Ï ÒÙÂÁËÅ É ÒÙÂËÅ" ì.î. ÏÌÓÔÏÊ, "÷ÏÊÎÁ É ÍÉÒ", Þ.1 ÷.á. úÏÒÉÞ, "íÁÔÅÍÁÔÉÞÅÓËÉÊ ÁÎÁÌÉÚ", Ô.2 $ éÔÁË, ËÏÍÁÎÄÁ writeFile ÓÏÚÄÁÅÔ ÔÅËÓÔÏ×ÙÊ ÆÁÊÌ. ëÏÍÁÎÄÁ readFile ÏÓÕÝÅÓÔ×ÌÑÅÔ ÏÂÒÁÔÎÕÀ ÏÅÒÁ ÉÀ ÓÞÉÔÙ×ÁÅÔ ÄÁÎÎÙÅ ÉÚ ÓÕÝÅÓÔ×ÕÀÝÅÇÏ ÔÅËÓÔÏ×ÏÇÏ ÆÁÊÌÁ.
I õÒÁÖÎÅÎÉÅ VIII.2.1
îÁÉÛÅÍ ÒÏÇÒÁÍÍÕ, ÚÁÒÁÛÉ×ÁÀÝÕÀ ÉÍÅÎÁ ×ÈÏÄÎÏÇÏ É ×ÙÈÏÄÎÏ ÇÏ ÆÁÊÌÏ× É ËÏÉÒÕÀÝÕÀ ÔÅÓÔ, ÓÏÄÅÒÖÁÝÉÊÓÑ × ÅÒ×ÏÍ, ×Ï ×ÔÏÒÏÊ.
H
main = do
putStr "õËÁÖÉÔÅ ÉÍÑ ×ÈÏÄÎÏÇÏ ÆÁÊÌÁ: " ifile <- getLine putStr "õËÁÖÉÔÅ ÉÍÑ ×ÙÈÏÄÎÏÇÏ ÆÁÊÌÁ: " ofile <- getLine s <- readFile ifile writeFile ofile s putStr "æÁÊÌ ÓËÏÉÒÏ×ÁÎ\n"
éÎÔÅÒÁËÔÉ×ÎÙÊ ÒÏ ÅÓÓ ×ÚÁÉÍÏÄÅÊÓÔ×ÉÑ ÏÌØÚÏ×ÁÔÅÌÑ É ÒÏÇÒÁÍ ÍÙ ÍÏÖÅÔ ×ÙÇÌÑÄÅÔØ ÔÁË:
---> main õËÁÖÉÔÅ ÉÍÑ ×ÈÏÄÎÏÇÏ ÆÁÊÌÁ: test1.txt õËÁÖÉÔÅ ÉÍÑ ×ÙÈÏÄÎÏÇÏ ÆÁÊÌÁ: test2.txt æÁÊÌ ÓËÏÉÒÏ×ÁÎ ---> ðÏÌÕÞÅÎÎÙÊ ×ÙÈÏÄÎÏÊ ÆÁÊÌ ÉÄÅÎÔÉÞÅÎ ×ÈÏÄÎÏÍÕ (×ÏÓÏÌØÚÕÊÔÅÓØ, ÎÁÒÉÍÅÒ, ËÏÍÁÎÄÏÊ diff ÄÌÑ ÒÏ×ÅÒËÉ ÜÔÏÇÏ ÕÔ×ÅÒÖÄÅÎÉÑ).
2. èÒÁÎÅÎÉÅ ÉÎÆÏÒÍÁ ÉÉ × ÆÁÊÌÁÈ
253
éÚÍÅÎÉÍ ÒÏÇÒÁÍÍÕ, ÄÏÂÁ×É× × ÎÅÅ ÆÉÌØÔÒ, ËÏÉÒÕÀÝÉÊ ÉÚ ×ÈÏÄÎÏÇÏ ÆÁÊÌÁ ÔÏÌØËÏ ÂÕË×Ù É ÉÆÒÙ:
main = do
putStr "õËÁÖÉÔÅ ÉÍÑ ×ÈÏÄÎÏÇÏ ÆÁÊÌÁ: " ifile <- getLine putStr "õËÁÖÉÔÅ ÉÍÑ ×ÙÈÏÄÎÏÇÏ ÆÁÊÌÁ: " ofile <- getLine s <- readFile ifile writeFile ofile (filter isAlphaNum s) putStr "æÁÊÌ ÏÔÆÉÌØÔÒÏ×ÁÎ\n"
ÅÅÒØ ÒÉ ËÏÉÒÏ×ÁÎÉÉ, ÎÁÒÉÍÅÒ, ÆÁÊÌÁ, ÓÏÄÅÒÖÁÝÅÇÏ ÓÌÅÄÕÀ ÝÉÅ ÔÒÉ ÓÔÒÏËÉ
óÔÒÏËÁ 1. óÔÒÏËÁ 2. óÔÒÏËÁ 3. ÍÙ ÏÌÕÞÉÍ ÏÄÎÏÓÔÒÏÞÎÙÊ ÆÁÊÌ
óÔÒÏËÁ1óÔÒÏËÁ2óÔÒÏËÁ3
J
÷ÏÒÏÓÙ É ÚÁÄÁÎÉÑ VIII.2.1
ëÁËÏ× ÂÕÄÅÔ ÒÅÚÕÌØÔÁÔ ×ÙÏÌÎÅÎÉÑ ËÏÍÁÎÄÙ main, ÏÒÅÄÅÌÅÎÎÏÊ ÓÌÅÄÕÀÝÉÍ ÏÂÒÁÚÏÍ
main = do putStr ("÷×ÅÄÉÔÅ ×ÁÛÉ ÆÁÍÉÌÉÀ É ÉÍÑ " ++ "(ÎÁÒÉÍÅÒ, ðÅÔÒÏ× é×ÁÎ):") firstLast <- getLine putStr (reverse firstLast) Á) óÎÁÞÁÌÁ ÂÕÄÅÔ ×Ù×ÅÄÅÎÏ ÉÍÑ, Á ÚÁÔÅÍ ÆÁÍÉÌÉÑ. Â) âÕÄÅÔ ×Ù×ÅÄÅÎÏ ÔÏÌØËÏ ÉÍÑ, Á ÆÁÍÉÌÉÑ ÒÏÉÇÎÏÒÉÒÏ×ÁÎÁ. ×) âÕÄÅÔ ×Ù×ÅÄÅÎÏ ÉÍÑ, ÎÏ × ÏÂÒÁÔÎÏÍ ÏÒÑÄËÅ ÓÌÅÄÏ×ÁÎÉÑ ÂÕË×. Ç) âÕÄÅÔ ×Ù×ÅÄÅÎÏ ×ÓÅ, ÞÔÏ ××ÅÌÉ, ÎÏ × ÏÂÒÁÔÎÏÍ ÏÒÑÄËÅ ÓÌÅÄÏ×Á ÎÉÑ ÂÕË×.
254
VIII. ÷×ÏÄ É ×Ù×ÏÄ ÉÎÆÏÒÍÁ ÉÉ
VIII.2.2
ëÁË ÄÏÌÖÎÁ ×ÙÇÌÑÄÅÔØ ËÏÍÁÎÄÁ ××ÏÄÁ-×Ù×ÏÄÁ × ÒÅÄÙÄÕÝÅÍ ÒÉ ÍÅÒÅ, ÞÔÏÂÙ ÂÙÌÁ ÎÁÅÞÁÔÁÎÁ ÏÄÎÁ ÆÁÍÉÌÉÑ (ÂÅÚ ÉÍÅÎÉ): Á) putStr (take 1 firstLast) Â) putStr (drop 1 firstLast) ×) putStr (takeWhile (/=' ') firstLast) Ç) putStr (dropWhile (/=' ') firstLast)
3. çÒÁÆÉÞÅÓËÉÊ ÉÎÔÅÒÆÅÊÓ (GUI) òÁÂÏÔÁ × ÓÏ×ÒÅÍÅÎÎÙÈ ÏÅÒÁ ÉÏÎÎÙÈ ÓÉÓÔÅÍÁÈ ÎÅÍÙÓÌÉÍÁ ÂÅÚ ÉÓÏÌØÚÏ×ÁÎÉÑ ÒÁÚÌÉÞÎÙÈ ÏËÏÎÎÙÈ ÓÉÓÔÅÍ, ÒÅÄÏÓÔÁ×ÌÑÀÝÉÈ ÏÌØÚÏ×ÁÔÅÌÀ ÕÄÏÂÎÙÅ ÓÒÅÄÓÔ×Á ×ÚÁÉÍÏÄÅÊÓÔ×ÉÑ Ó ÒÏÇÒÁÍÍÁÍÉ É ÄÏÓÔÕÁ Ë ÒÅÓÕÒÓÁÍ ÓÉÓÔÅÍÙ (ÎÁÒÉÍÅÒ, ÆÁÊÌÁÍ). ïÒÇÁÎÉÚÁ ÉÑ ÔÁ ËÏÇÏ ÄÉÁÌÏÇÁ Ó ÏÌØÚÏ×ÁÔÅÌÅÍ ÏÓÕÝÅÓÔ×ÌÑÅÔÓÑ Ó ÏÍÏÝØÀ ÇÒÁÆÉ ÞÅÓËÏÇÏ ÉÎÔÅÒÆÅÊÓÁ ÏÌØÚÏ×ÁÔÅÌÑ (Graphi al User Interfa e, GUI), ÏÚ×ÏÌÑÀÝÅÇÏ ÕÒÁ×ÌÑÔØ ÒÉÌÏÖÅÎÉÅÍ Ó ÏÍÏÝØÀ ÍÙÛÉ ÉÌÉ ÕÔÅÍ ××ÏÄÁ ÉÎÆÏÒÍÁ ÉÉ × ÔÅ ÉÌÉ ÉÎÙÅ ÏÌÑ ÏËÏÎ. ðÏÄÏÂÎÙÅ ÇÒÁÆÉÞÅÓËÉÅ ÉÎÔÅÒÆÅÊÓÙ ÍÏÇÕÔ ÓÏÄÅÒÖÁÔØ ËÎÏËÉ, ÅÒÅËÌÀÞÁÔÅ ÌÉ, ÒÁÚÌÉÞÎÙÅ ÏÌÏÓÙ ÒÏËÒÕÔËÉ, ×ÙÁÄÁÀÝÉÅ ÍÅÎÀ É ÄÒÕÇÉÅ ÜÌÅ ÍÅÎÔÙ ÕÒÁ×ÌÅÎÉÑ. ÷ ÓÏ×ÒÅÍÅÎÎÏÍ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÉ ÔÁËÖÅ ÑÒËÏ ×ÙÒÁÖÅÎÁ ÔÅÎ ÄÅÎ ÉÑ Ë ÎÁÉÓÁÎÉÀ ÒÏÇÒÁÍÍ, ÉÎÔÅÒÁËÔÉ×ÎÏ ×ÚÁÉÍÏÄÅÊÓÔ×ÕÀÝÉÈ Ó ÏÌØÚÏ×ÁÔÅÌÅÍ ÞÅÒÅÚ ÇÒÁÆÉÞÅÓËÉÊ ÉÎÔÅÒÆÅÊÓ. ÁËÉÅ ÒÏÇÒÁÍÍÙ × ÏÂÝÅÍ ÓÌÕÞÁÅ Ñ×ÌÑÀÔÓÑ ÂÏÌÅÅ ÇÉÂËÉÍÉ, ÞÅÍ ÒÏÇÒÁÍÍÙ Ó ÔÅËÓÔÏ ×ÙÍ ÉÎÔÅÒÆÅÊÓÏÍ. ÒÁÄÉ ÉÏÎÎÏ, GUI-ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÅ ÄÏÍÉÎÉ ÒÏ×ÁÌÏ × ÉÍÅÒÁÔÉ×ÎÙÈ ÑÚÙËÁÈ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÑ. õÞÉÔÙ×ÁÑ ×ÁÖÎÏÓÔØ ÇÒÁÆÉÞÅÓËÏÇÏ ÉÎÔÅÒÆÅÊÓÁ ÄÌÑ ÑÚÙËÏ× ÆÕÎË ÉÏÎÁÌØÎÏÇÏ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÑ ÓÒÁÚÕ ÎÅÓËÏÌØËÏ ÇÒÕ ÒÏ ÇÒÁÍÍÉÓÔÏ× ÒÁÚÒÁÂÁÔÙ×ÁÀÔ ÄÌÑ ÎÉÈ ÓÒÅÄÓÔ×Á ÓÏÚÄÁÎÉÑ GUI. îÅËÏÔÏÒÙÅ ÉÚ ÜÔÉÈ ÓÒÅÄ ÒÁÚÒÁÂÏÔËÉ ÇÒÁÆÉÞÅÓËÏÇÏ ÉÎÔÅÒÆÅÊÓÁ ÏÓÎÏ×Ù×ÁÀÔÓÑ ÎÁ ÏÂÝÉÈ ÁÂÓÔÒÁË ÉÑÈ, ÚÁÌÏÖÅÎÎÙÈ × ÉÍÅÒÁÔÉ× ÎÙÅ ÓÒÅÄÙ ÒÁÚÒÁÂÏÔËÉ GUI, É ÔÅÒÑÔ ÎÅÕÄÁÞÕ ÒÉ ÏÙÔËÅ ÎÁÊ ÔÉ Ó×ÏÅ ÂÕÄÕÝÅÅ × ÆÕÎË ÉÏÎÁÌØÎÏÍ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÉ. äÒÕÇÉÅ ÖÅ ÒÁÚÒÁÂÏÔÁÎÙ × ÆÕÎË ÉÏÎÁÌØÎÏÍ ÓÔÉÌÅ, ÞÔÏ ÏÚ×ÏÌÑÅÔ ÉÓÏÌØ ÚÏ×ÁÔØ ÉÈ, ÏÓÔÁ×ÁÑÓØ × ÒÁÍËÁÈ ÆÕÎË ÉÏÎÁÌØÎÏÊ ÁÒÁÄÉÇÍÙ ÒÏ ÇÒÁÍÍÉÒÏ×ÁÎÉÑ. ðÅÒÅÞÉÓÌÉÍ ÒÏÇÒÁÍÍÎÙÅ ÓÒÅÄÓÔ×Á, ÏÚ×ÏÌÑÀÝÉÅ ÒÁÚÒÁÂÁÔÙ ×ÁÔØ ÇÒÁÆÉÞÅÓËÉÊ ÉÎÔÅÒÆÅÊÓ ÄÌÑ ÒÏÇÒÁÍÍ, ÎÁÉÓÁÎÎÙÈ ÎÁ ÆÕÎË ÉÏÎÁÌØÎÙÈ ÑÚÙËÁÈ:
3. çÒÁÆÉÞÅÓËÉÊ ÉÎÔÅÒÆÅÊÓ (GUI)
255
Fudgets FranTk T lHaskell FRUIT Gtk2HS Haggis Clean I/O Gtk+HS ïÓÏÂÏ ÏÔÍÅÔÉÍ Fudgets, FranTk, Haggis, Clean I/O, ËÏÔÏÒÙÅ Ñ×ÌÑ ÀÔÓÑ ÒÅÄÓÔÁ×ÉÔÅÌÑÍÉ ÆÕÎË ÉÏÎÁÌØÎÙÈ GUI. ÷ ÎÁÛÕ ÚÁÄÁÞÕ ÎÅ ×ÈÏÄÉÔØ ÏÂÕÞÅÎÉÅ ÒÉÎ ÉÁÍ ÒÁÚÒÁÂÏÔËÉ ÇÒÁÆÉÞÅÓËÏÇÏ ÉÎÔÅÒÆÅÊ ÓÁ, ÍÙ ÌÉÛØ ÒÏÄÅÍÏÎÓÔÒÉÒÕÅÍ ÉÈ ×ÏÚÍÏÖÎÏÓÔÉ ÎÁ ÂÁÚÅ ÏÄÎÏÇÏ ÉÚ ÎÉÈ, Á ÉÍÅÎÎÏ FranTk. FranTk (ÒÏÉÚÎÏÓÉÔÓÑ ËÁË ¾ÆÒÁÎÔÉË¿) ÏÄÎÏ ÉÚ ÓÒÅÄÓÔ× ÒÁÚ ÒÁÂÏÔËÉ GUI ÄÌÑ Haskell. ïÎÏ ÉÓÏÌØÚÕÅÔ ËÏÎ Å ÉÀ Ï×ÅÄÅÎÉÑ É ÓÏÂÙÔÉÊ, ÞÔÏ ÏÚ×ÏÌÑÅÔ ÍÏÄÅÌÉÒÏ×ÁÔØ ÒÁÂÏÔÕ ÓÉÓÔÅÍÙ × ÔÅÞÅÎÉÉ ÄÌÉÔÅÌØÎÏÇÏ ×ÒÅÍÅÎÉ. ë ÄÏÏÌÎÉÔÅÌØÎÙÍ ÒÅÉÍÕÝÅÓÔ×ÁÍ FranTk ÍÏÖÎÏ ÏÔÎÅÓÔÉ ÅÇÏ ÎÅÚÁ×ÉÓÉÍÏÓÔØ ÏÔ ÌÁÔÆÏÒÍÙ: Ó ÅÇÏ ÏÍÏÝØÀ ÍÏÖÎÏ ÓÏÚÄÁ×ÁÔØ ÒÏÇÒÁÍÍÙ Ó ÏËÏÎÎÙÍ ÉÎÔÅÒÆÅÊÓÏÍ, ÆÕÎË ÉÏÎÉ ÒÕÀÝÉÅ ËÁË × Linux, ÔÁË É × Winows.
óÏÂÙÔÉÑ (events) ÉÓÏÌØÚÕÀÔÓÑ ÄÌÑ ÏÉ ÓÁÎÉÑ ×ÅÌÉÞÉÎ, ËÏÔÏÒÙÅ ÒÏÉÓÈÏÄÑÔ ÄÉÓËÒÅÔ ÎÏ, ÎÁÒÉÍÅÒ, ÎÁÖÁÔÉÅ ËÎÏËÉ. ðÏ×ÅÄÅÎÉÅ
(behaviors) ÅÓÔØ ÎÅÒÅÒÙ×ÎÁÑ ×ÅÌÉÞÉÎÁ × ÔÅÞÅÎÉÅ ÒÏÄÏÌÖÉÔÅÌØÎÏÇÏ ×ÒÅÍÅÎÉ. ÷ÅÌÉ ÞÉÎÙ ÔÁËÏÇÏ ÒÏÄÁ ÉÓÏÌØÚÕÀÔÓÑ ÄÌÑ ÒÅÄ ÓÔÁ×ÌÅÎÉÑ ÓÏÓÔÏÑÎÉÑ ÒÉÌÏÖÅÎÉÑ. óÏÂÙÔÉÑ É Ï×ÅÄÅÎÉÑ ÍÏÇÕÔ ÂÙÔØ ÉÎÔÅÒÁËÔÉ×ÎÙÍÉ. îÁÒÉÍÅÒ, ÎÁÍ ÍÏÖÅÔ ÏÔÒÅÂÏ×ÁÔØÓÑ Ï×Å ÄÅÎÉÅ, ËÏÔÏÒÏÅ ÉÚÍÅÎÑÅÔÓÑ × ÚÁ×ÉÓÉÍÏÓÔÉ ÏÔ ÎÅËÏÔÏÒÏÇÏ ÓÏÂÙÔÉÑ. ðÏ ÓÕÔÉ, FranTk ÅÓÔØ ÒÉÍÅÎÅÎÉÅ ÛÉÒÏËÏ ÉÚ×ÅÓÔÎÙÈ ÓÒÅÄÓÔ× T l/Tk. îÉÖÅ ÒÉ×ÅÄÅÎ ËÏÄ ÒÏÇÒÁÍÍÙ ÎÁ ÑÚÙËÅ Haskell, ËÏÔÏ ÒÁÑ ÓÏÚÄÁÅÔ ÏËÎÏ, ÓÏÄÅÒÖÁÝÅÅ Ä×Å ËÎÏËÉ É ÏÌÏÓÕ ÒÏËÒÕÔËÉ (s rollbar). ðÒÉ ÎÁÖÁÔÉÉ ÎÁ ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÕÀ ËÎÏËÕ ÚÎÁÞÅÎÉÅ ÓÞÅÔÞÉËÁ Õ×ÅÌÉÞÉ×ÁÅÔÓÑ, ÌÉÂÏ ÕÍÅÎØÛÁÅÔÓÑ ÎÁ ÅÄÉÎÉ Õ:
module Main where import FranTk main :: IO () main = display $ withRootWindow [title "óÞÅÔÞÉË"℄
VIII. ÷×ÏÄ É ×Ù×ÏÄ ÉÎÆÏÒÍÁ ÉÉ
256
$ s aleAndButton s aleAndButton :: Component s aleAndButton = do { m <- mkBVar 0; omposite m}
omposite, s ale, ounterB, lbl, in r, de r :: BVar Int -> Component
omposite m = above ( ounterB m) (s ale m) s ale m = mkHS ale [s aleValB (bvarBehavior m)℄ (bvarInput m)
ounterB m = above (lbl m) (beside (in r m) (de r m)) lbl m = mkLabel [textB (lift1 show (bvarBehavior m))℄ in r m = mkButton [text " +1 "℄ (tellL (bvarUpdInput m) (+1)) de r m = mkButton [text " -1 "℄ (tellL (bvarUpdInput m) (subtra t 1)) äÌÑ ËÏÍÉ Ñ ÉÉ ×ÙÏÌÎÉÍ ËÏÍÁÎÄÕ
gh -O -pa kage FranTk -o exampleFranTk exampleFranTk.hs ÷
ÒÅÚÕÌØÔÁÔÅ
ËÏÍÉÌÑ ÉÉ ÏÌÕÞÁÅÔÓÑ ×ÙÏÌÎÑÅÍÙÊ ÆÁÊÌ exampleFranTk. ðÏÓÌÅ ÚÁÕÓËÁ ÒÏÇÒÁÍÍÙ ÏÑ×ÌÑÅÔÓÑ ÏËÎÏ, ÏÚ×ÏÌÑÀÝÅÅ ÌÉÂÏ ÎÁÖÁÔÉÅÍ ÎÁ ËÎÏËÕ, ÌÉÂÏ ÅÒÅÄ×ÉÖÅÎÉÅÍ ÂÅÇÕÎËÁ ÎÁ ÏÌÏÓÅ ÒÏËÒÕÔËÉ ÍÅÎÑÔØ ÚÎÁÞÅÎÉÅ ÓÞÅÔÞÉËÁ. âÏÌÅÅ ÏÄÒÏÂÎÕÀ ÉÎÆÏÒÍÁ ÉÀ Ï ×ÏÚÍÏÖÎÏÓÔÑÈ FranTk É ÄÒÕ ÇÉÈ ÓÒÅÄÓÔ×, ÒÅÄÎÁÚÎÁÞÅÎÎÙÈ ÄÌÑ ÓÏÚÄÁÎÉÑ ÇÒÁÆÉÞÅÓËÏÇÏ ÉÎÔÅÒ ÆÅÊÓÁ, ÍÏÖÎÏ ÎÁÊÔÉ × ÓÅÔÉ ÉÎÔÅÒÎÅÔ Ï ÓÌÅÄÕÀÝÉÍ ÁÄÒÅÓÁÍ:
http://www. s. halmers.se/Fudgets/Manual/ http://www.d s.gla.a .uk/~meurig http://www.d s.gla.a .uk/fp/software/haggis/ haggis-do /users_to .html
ìÉÔÅÒÁÔÕÒÁ ïÂßÅËÔÎÏ-ÏÒÉÅÎÔÉÒÏ×ÁÎÎÏÅ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÅ × ÄÅÊ ÓÔ×ÉÉ ñÚÙËÉ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÑ. ðÒÁËÔÉÞÅÓËÉÊ ÓÒÁ×ÎÉ ÔÅÌØÎÙÊ ÁÎÁÌÉÚ ÷×ÅÄÅÎÉÅ × ËÏÍØÀÔÅÒÎÙÅ ÎÁÕËÉ. ïÂÝÉÊ ÏÂÚÏÒ, 6-Å ÉÚÄÁÎÉÅ éÓËÕÓÓÔ×Ï ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÑ, ÔÏÍ 2. ðÏÌÕÞÉÓÌÅÎÎÙÅ ÁÌÇÏÒÉÔÍÙ, 3-Å ÉÚÄ.: õÞ. ÏÓ. æÕÎË ÉÏÎÁÌØÎÏÅ ÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÅ
[1℄ âÁÄÄ . óðÂ: ðÉÔÅÒ, 1997. [2℄ âÅÎ-áÒÉ í. í.: íÉÒ, 2000. [3℄ âÒÕËÛÉÒ, äÖ., çÌÅÎ. í.: éÚÄÁÔÅÌØÓËÉÊ ÄÏÍ ¾÷ÉÌØÑÍÓ¿, 2001. [4℄ ëÎÕÔ, äoÎÁÌØÄ, üÒ×ÉÎ í.: éÚÄÁÔÅÌØ ÓËÉÊ ÄÏÍ ¾÷ÉÌØÑÍÓ¿, 2000. [5℄ æÉÌÄ á., èÁÒÒÉÓÏÎ ð. í.: íÉÒ, 1993. [6℄ http://haskell.org ïÆÉ ÉÁÌØÎÙÊ ÓÁÊÔ ÑÚÙËÁ Haskell.
257
ðÒÅÄÍÅÔÎÙÊ ÕËÁÚÁÔÅÌØ ?, 15, 201
ÒÉÏÒÉÔÅÔ, 73
ÁÎÏÎÉÍÎÁÑ ÅÒÅÍÅÎÎÁÑ, 149
ÏÅÒÁÔÏÒÎÙÅ ÓÅË ÉÉ, 82
×ËÌÀÞÅÎÉÑ ÓÉÓËÏ×, 133
ÏÌÉÍÏÒÆÉÚÍ, 167
ÏÈÒÁÎÎÏÅ ÒÁ×ÉÌÏ, 134
ÓÅ×ÄÏÓÌÕÞÁÊÎÙÅ ÞÉÓÌÁ, 145
ÒÁ×ÉÌÏ ÇÅÎÅÒÁ ÉÉ, 134
ÓËÁÎÉÒÏ×ÁÎÉÅ ÓÉÓËÁ ÂÅÚ ×ËÌÀÞÅÎÉÑ ÕÓÔÏÇÏ ÓÉÓ
×ÙÚÏ×
ËÁ, 130
Ï ÚÎÁÞÅÎÉÀ, 14
ÓÌÅ×Á, 128
Ï ÎÅÏÂÈÏÄÉÍÏÓÔÉ, 14
ÓÒÁ×Á, 130
×ÙÞÉÓÌÅÎÉÑ
ÓÏÒÔÉÒÏ×ËÁ
ÌÅÎÉ×ÙÅ, 15
ÓÌÉÑÎÉÅÍ, 120
ÜÎÅÒÇÉÞÎÙÅ, 15
×ÓÔÁ×ËÏÊ, 119
Ä×ÕÍÅÒÎÙÊ ÓÉÎÔÁËÓÉÓ, 62
Ó×ÅÒÔËÁ
ËÁÒÒÉÎÇ, 78, 81 ËÌÁÓÓ, 169
ÂÅÚ ÎÁÞÁÌØÎÙÈ ÚÎÁÞÅÎÉÊ, 123
ËÌÀÞÅ×ÏÅ ÓÌÏ×Ï
ÓÌÅ×Á, 89 ÓÒÁ×Á, 87, 121
ase, 52
ÔÉ ÄÁÎÎÙÈ, 28
do, 248
ÁÂÓÔÒÁËÔÎÙÊ, 208, 233
else, 52 hiding, 40
Angle, 209
if, 52
Sta k, 236
import, 40
Tree, 234 ÓÉÎÏÎÉÍ, 153
let, 50 module, 227
Angle, 157
of, 52
Fra tion, 158, 161 Day, 182
then, 52
ÆÕÎË ÉÑ
where, 50 ËÏÍÏÚÉ ÉÑ ÆÕÎË ÉÊ, 14, 92
×ÙÓÛÅÇÏ ÏÒÑÄËÁ, 85
ËÏÒÔÅÖ, 148
ÏÒÅÄÅÌÅÎÎÁÑ × ËÎÉÇÅ
ÌÑÍÂÄÁ ÆÕÎË ÉÑ, 95
ab Formula, 48, 156
ÏÅÒÁÔÏÒ, 72
ab Formula', 49
ÁÓÓÏ ÉÁÔÉ×ÎÏÓÔØ, 74
ab Formula, 50
ÏÒÅÄÅÌÅÎÉÅ, 75
after, 92
258
259
apitalize, 39
myBuildRight, 43
ase', 186
myNot, 35
harValue, 53
ne, 113
hoose, 77
negative, 49
opy, 140
newSmallBig, 70, 72
ube, 48
nonde , 126, 127
ubi , 106
notElem, 118
day, 99, 101
offset, 39
daynumber, 100
pair, 128
dayofweek, 117
plus, 78
de imal, 90
plus , 78
denominators, 99
position, 140
diff, 102
positions, 140
digitChar, 53
power2, 60
distan eL, 149
pozitive, 49
distan eT, 149
primenums, 144
divisible, 98
primes, 99
eq, 112
quad, 80
exOr, 36
qui ksort, 147, 165
fa t, 60, 66
rand, 145
fa t', 60
root, 104, 106
flexDiff, 103
roots, 156
fra tionString, 160
se, 112
from, 137
sear h, 151
fst3, 149
signIntString, 161
ge, 113
simplify, 159
gt, 113
smallBig, 46
infinity, 16
smaller, 45, 78
inits, 129
smaller , 78
inits1, 130
snd3, 149
insert, 119
sp, 126, 127
intString, 143
spp, 127
inverse, 107
square, 16
isort, 120
st, 113
isZero, 49
su
essor, 79
leap, 101
sum', 61
length', 61
sumOfLastTwoDigits, 51
main, 247
tails, 130
maxlist, 123
thd3, 149
maxThree, 54
three, 16
merge, 120
triads, 135
months, 101
twi e, 79
move, 157
weekday, 99
msort, 120
zero, 106
myBuildLeft, 42
zipp, 127
ðÒÅÄÍÅÔÎÙÊ ÕËÁÚÁÔÅÌØ
260 zippWith, 127 ÏÒÅÄÅÌÅÎÎÁÑ × ÒÅÌÀÄÉÉ
repeat, 140 return, 251
abs, 34
reverse, 42, 117, 123
and, 86, 87, 118
round, 34
hr, 38
s anl, 128, 129
on at, 114
s anl1, 130, 131
urry, 80, 153
s anr, 130
div, 31
s anr1, 130
drop, 115
sequen e_, 253
dropWhile, 125
signum, 34
elem, 118, 122
snd, 45, 149
enumFromTo, 110
splitAt, 150
even, 33
sum, 86, 87
filter, 86, 121
tail, 42, 58, 114
foldl, 89, 122
take, 101, 115
foldl1, 124
takeWhile, 125
foldr, 87, 122
un urry, 80, 153
foldr1, 124
undefined, 68
fromInt, 33
unlines, 44
fromInteger, 33
until, 91
fst, 45, 149
unwords, 44
g d, 33, 159
unzip, 128
getLine, 249
words, 44
head, 42, 58, 114
zip, 125, 151
init, 115
zipWith, 127, 151
isAlpha, 40
ÒÉÍÉÔÉ×
isAlphaNum, 40
a os, 34
isDigit, 40
asin, 34
isLower, 40
atan, 34
isSpa e, 40
os, 34
isUpper, 40
error, 66
iterate, 141
exp, 34
last, 115
getChar, 250
length, 42, 117, 123
log, 34
lines, 44
putChar, 250
map, 68, 82, 86, 121
putStr, 155, 247
mod, 31, 98
sin, 34
not, 35
sqrt, 34
odd, 33
tan, 34
or, 122
ÓÔÒÏÇÁÑ, 15
ord, 38, 41 print, 252 produ t, 86, 87 putStrLn, 250 rem, 31, 97