Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π˜Π·ΡƒΡ‡Π°ΠΉ Haskell Π²ΠΎ имя Π΄ΠΎΠ±Ρ€Π°!Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 26

Автор ΠœΠΈΡ€Π°Π½ Π›ΠΈΠΏΠΎΠ²Π°Ρ‡Π°

["827–91-62","943–29-29","493–29-28"]

ΠŸΡ€Π΅Π²ΠΎΡΡ…ΠΎΠ΄Π½ΠΎ!

Π•Ρ‰Ρ‘ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹. Допустим, ΠΌΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ· ассоциативного списка чисСл ΠΈ ΠΏΡ€ΠΈ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰Π΅Π³ΠΎΡΡ ΠΊΠ»ΡŽΡ‡Π° Ρ…ΠΎΡ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΡ…Ρ€Π°Π½ΠΈΠ»ΠΎΡΡŒ наибольшСС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ:

ghci> Map.fromListWith max [(2,3),(2,100),(3,29),(3,11),(4,22),(4,15)]

fromList [(2,100),(3,29),(4,22)]

Или Ρ…ΠΎΡ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ значСния с ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΠΌΠΈΡΡ ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ ΡΠΊΠ»Π°Π΄Ρ‹Π²Π°Π»ΠΈΡΡŒ:

ghci> Map.fromListWith (+) [(2,3),(2,100),(3,29),(3,11),(4,22),(4,15)]

fromList [(2,103),(3,40),(4,37)]

Ну Ρ‡Ρ‚ΠΎ ΠΆ, ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Data.Map, Π΄Π° ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ΠΈΠ· стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ языка Haskell довольно Π½Π΅ΠΏΠ»ΠΎΡ…ΠΈ. Π”Π°Π»Π΅Π΅ посмотрим, ΠΊΠ°ΠΊ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ свой собствСнный ΠΌΠΎΠ΄ΡƒΠ»ΡŒ.

НаписаниС собствСнных ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ

ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈ всС языки программирования ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Ρ€Π°Π·Π΄Π΅Π»ΡΡ‚ΡŒ ΠΊΠΎΠ΄ Π½Π° нСсколько Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΈ Haskell – Π½Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. ΠŸΡ€ΠΈ написании ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΏΠΎΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Ρ‚ΠΈΠΏΡ‹, слуТащиС схоТим цСлям, Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ…, просто ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π² Π½ΡƒΠΆΠ½Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ.



ΠœΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ экспортируСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π΅Π³ΠΎ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ, Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ экспортируСмыС ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ΠœΠΎΠ΄ΡƒΠ»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ использования, Π½ΠΎ ΠΈΠ·Π²Π½Π΅ модуля ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ экспортируСт.

ΠœΠΎΠ΄ΡƒΠ»ΡŒ Geometry

Π”Π°Π²Π°ΠΉΡ‚Π΅ Ρ€Π°Π·Π±Π΅Ρ€Ρ‘ΠΌ процСсс создания ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Π½Π° простом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅. Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для вычислСния ΠΎΠ±ΡŠΡ‘ΠΌΠ° ΠΈ ΠΏΠ»ΠΎΡ‰Π°Π΄ΠΈ повСрхности Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… гСомСтричСских Ρ„ΠΈΠ³ΡƒΡ€. И Π½Π°Ρ‡Π½Ρ‘ΠΌ с создания Ρ„Π°ΠΉΠ»Π° Geometry.hs.

Π’ Π½Π°Ρ‡Π°Π»Π΅ модуля указываСтся Π΅Π³ΠΎ имя. Если ΠΌΡ‹ Π½Π°Π·Π²Π°Π»ΠΈ Ρ„Π°ΠΉΠ» Geometry.hs, Ρ‚ΠΎ имя нашСго модуля Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Geometry. Π—Π°Ρ‚Π΅ΠΌ слСдуСт ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ экспортируСмыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, послС Ρ‡Π΅Π³ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΈΡΠ°Ρ‚ΡŒ сами Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

module Geometry

( sphereVolume

, sphereArea

, cubeVolume

, cubeArea

, cuboidArea

, cuboidVolume

) where

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ ΠΏΠ»ΠΎΡ‰Π°Π΄ΠΈ ΠΈ ΠΎΠ±ΡŠΡ‘ΠΌΡ‹ для сфСр (sphere), ΠΊΡƒΠ±ΠΎΠ² (cube) ΠΈ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½Ρ‹Ρ… ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»Π΅ΠΏΠΈΠΏΠ΅Π΄ΠΎΠ² (cuboid). Π‘Ρ„Π΅Ρ€Π° – это круглая ΡˆΡ‚ΡƒΠΊΠ° Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ Π³Ρ€Π΅ΠΉΠΏΡ„Ρ€ΡƒΡ‚Π°, ΠΊΡƒΠ± – квадратная ΡˆΡ‚ΡƒΠΊΠ°, похоТая Π½Π° ΠΊΡƒΠ±ΠΈΠΊ Π ΡƒΠ±ΠΈΠΊΠ°, Π° ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»Π΅ΠΏΠΈΠΏΠ΅Π΄ – Ρ‚ΠΎΡ‡ΡŒ-Π²-Ρ‚ΠΎΡ‡ΡŒ ΠΏΠ°Ρ‡ΠΊΠ° сигарСт. (Π”Π΅Ρ‚ΠΈ, ΠΊΡƒΡ€ΠΈΡ‚ΡŒ Π²Ρ€Π΅Π΄Π½ΠΎ!)

ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌ ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ наши Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

module Geometry

( sphereVolume , sphereArea

, cubeVolume

, cubeArea

, cuboidArea

, cuboidVolume

) where


sphereVolume :: Float –> Float

sphereVolume radius = (4.0 / 3.0) * pi * (radius 3)


sphereArea :: Float –> Float

sphereArea radius = 4 * pi * (radius 2)


cubeVolume :: Float –> Float

cubeVolume side = cuboidVolume side side side


cubeArea :: Float –> Float

cubeArea side = cuboidArea side side side


cuboidVolume :: Float –> Float –> Float –> Float

cuboidVolume a b c = rectArea a b * c


cuboidArea :: Float –> Float –> Float –> Float

cuboidArea a b c = rectArea a b * 2 + rectArea a c * 2 + rectArea c b * 2


rectArea :: Float –> Float –> Float

rectArea a b = a * b

Π”ΠΎΠ²ΠΎΠ»ΡŒΠ½ΠΎ стандартная гСомСтрия, Π½ΠΎ Π΅ΡΡ‚ΡŒ нСсколько Π²Π΅Ρ‰Π΅ΠΉ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ стоит ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΊΡƒΠ± – это Ρ€Π°Π·Π½ΠΎΠ²ΠΈΠ΄Π½ΠΎΡΡ‚ΡŒ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»Π΅ΠΏΠΈΠΏΠ΅Π΄Π°, ΠΌΡ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ Π΅Π³ΠΎ ΠΏΠ»ΠΎΡ‰Π°Π΄ΡŒ ΠΈ ΠΎΠ±ΡŠΡ‘ΠΌ, трактуя ΠΊΡƒΠ± ΠΊΠ°ΠΊ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»Π΅ΠΏΠΈΠΏΠ΅Π΄ с Ρ€Π°Π²Π½Ρ‹ΠΌΠΈ сторонами. Π’Π°ΠΊΠΆΠ΅ ΠΌΡ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ rectArea, которая вычисляСт ΠΏΠ»ΠΎΡ‰Π°Π΄ΡŒ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° ΠΏΠΎ Π΅Π³ΠΎ сторонам. Ѐункция ΠΎΡ‡Π΅Π½ΡŒ проста – ΠΎΠ½Π° просто ΠΏΠ΅Ρ€Π΅ΠΌΠ½ΠΎΠΆΠ°Π΅Ρ‚ стороны. Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ rectArea Π² функциях модуля (Π° ΠΈΠΌΠ΅Π½Π½ΠΎ Π² функциях cuboidArea ΠΈ cuboidVolume), Π½ΠΎ Π½Π΅ экспортируСм Π΅Ρ‘, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Ρ…ΠΎΡ‚ΠΈΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с Ρ‚Ρ€Ρ‘Ρ…ΠΌΠ΅Ρ€Π½Ρ‹ΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ.

ΠŸΡ€ΠΈ создании модуля ΠΌΡ‹ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ экспортируСм Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ слуТат интСрфСйсом нашСго модуля, ΠΈ скрываСм Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ наш ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π½Π°Ρ‚ΡŒ ΠΎ Ρ‚Π΅Ρ… функциях, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ Π½Π΅ экспортируСм. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈΡ… ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ вСрсии (скаТСм, ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ rectArea ΠΈ просто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅), ΠΈ Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΡ‚ΠΈΠ² – Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ ΡΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ наш ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, запишСм:

import Geometry

Π€Π°ΠΉΠ» Geometry.hs Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΏΠ°ΠΏΠΊΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‰Π°Ρ Π΅Π³ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°.

Π˜Π΅Ρ€Π°Ρ€Ρ…ΠΈΡ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ

ΠœΠΎΠ΄ΡƒΠ»ΡΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠ΄Π°Ρ‚ΡŒ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ структуру. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ нСсколько ΠΏΠΎΠ΄ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΌΠΎΠ΄ΡƒΠ»ΠΈ. Π”Π°Π²Π°ΠΉΡ‚Π΅ Ρ€Π°Π·Π΄Π΅Π»ΠΈΠΌ наш ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Geometry Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² Π½Π΅Π³ΠΎ Π²Ρ…ΠΎΠ΄ΠΈΠ»ΠΈ Ρ‚Ρ€ΠΈ подмодуля, ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ‚ΠΈΠΏ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

Π‘Π½Π°Ρ‡Π°Π»Π° создадим ΠΏΠ°ΠΏΠΊΡƒ с ΠΈΠΌΠ΅Π½Π΅ΠΌ Geometry. Π’ этой ΠΏΠ°ΠΏΠΊΠ΅ ΠΌΡ‹ размСстим Ρ‚Ρ€ΠΈ Ρ„Π°ΠΉΠ»Π°: Sphere.hs, Cuboid.hs ΠΈ Cube.hs. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅.

Π’ΠΎΡ‚ содСрТимоС Ρ„Π°ΠΉΠ»Π° Sphere.hs:

module Geometry.Sphere

( volume

, area

) where


volume :: Float –> Float

volume radius = (4.0 / 3.0) * pi * (radius 3)


area :: Float –> Float

area radius = 4 * pi * (radius 2)

Π€Π°ΠΉΠ» Cuboid.hs выглядит Ρ‚Π°ΠΊ:

module Geometry.Cuboid

( volume

, area

) where


volume :: Float –> Float –> Float –> Float

volume a b c = rectArea a b * c


area :: Float –> Float –> Float –> Float

area a b c = rectArea a b * 2 + rectArea a c * 2 + rectArea c b * 2


rectArea :: Float –> Float –> Float

rectArea a b = a * b

А Π²ΠΎΡ‚ ΠΈ содСрТимоС Ρ„Π°ΠΉΠ»Π° Cube.hs:

module Geometry.Cube

( volume

, area

) where


import qualified Geometry.Cuboid as Cuboid


volume :: Float –> Float

volume side = Cuboid.volume side side side


area :: Float –> Float

area side = Cuboid.area side side side

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ помСстили Ρ„Π°ΠΉΠ» Sphere.hs Π² ΠΏΠ°ΠΏΠΊΡƒ с ΠΈΠΌΠ΅Π½Π΅ΠΌ Geometry ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ имя модуля ΠΊΠ°ΠΊ Geometry.Sphere. Π’ΠΎ ΠΆΠ΅ самоС ΠΌΡ‹ сдСлали для ΠΊΡƒΠ±Π° ΠΈ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»Π΅ΠΏΠΈΠΏΠ΅Π΄Π°. Π’Π°ΠΊΠΆΠ΅ ΠΎΡ‚ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π²ΠΎ всСх Ρ‚Ρ€Ρ‘Ρ… модулях ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ. ΠœΡ‹ Π²ΠΏΡ€Π°Π²Π΅ Ρ‚Π°ΠΊ ΠΏΠΎΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ находятся Π² Ρ€Π°Π·Π½Ρ‹Ρ… модулях.

Π˜Ρ‚Π°ΠΊ, Ссли ΠΌΡ‹ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΡƒΠ΅ΠΌ Ρ„Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ находится Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅ с ΠΏΠ°ΠΏΠΊΠΎΠΉ Geometry, Ρ‚ΠΎ запишСм:

import Geometry.Sphere

послС Ρ‡Π΅Π³ΠΎ смоТСм Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ area ΠΈ volume, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ вычислят ΠΏΠ»ΠΎΡ‰Π°Π΄ΡŒ ΠΈ ΠΎΠ±ΡŠΡ‘ΠΌ сфСры. Если Π½Π°ΠΌ потрСбуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ нСсколько Π½Π°ΡˆΠΈΡ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΈΠΌΠΏΠΎΡ€Ρ‚, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΡΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ. Π”Π΅Π»Π°Π΅ΠΌ Ρ‚Π°ΠΊ:

import qualified Geometry.Sphere as Sphere

import qualified Geometry.Cuboid as Cuboid

import qualified Geometry.Cube as Cube

Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ смоТСм Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Sphere.area, Sphere.volume, Cuboid.area ΠΈ Ρ‚. Π΄., ΠΈ каТдая функция вычислит ΠΏΠ»ΠΎΡ‰Π°Π΄ΡŒ ΠΈΠ»ΠΈ ΠΎΠ±ΡŠΡ‘ΠΌ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΠΏΠΎΠΉΠΌΠ°Π΅Ρ‚Π΅ сСбя Π·Π° написаниСм ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° с ΠΊΡƒΡ‡Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΏΠΎΠΏΡ‹Ρ‚Π°ΠΉΡ‚Π΅ΡΡŒ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ слуТат Π½Π΅ΠΊΠΎΠ΅ΠΉ ΠΎΠ±Ρ‰Π΅ΠΉ Ρ†Π΅Π»ΠΈ, ΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΈΡ… Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ.

ПозднСС ΠΏΡ€ΠΈ написании ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ со схоТСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ Π²Ρ‹ смоТСтС просто ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ свой ΠΌΠΎΠ΄ΡƒΠ»ΡŒ.

7

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² ΠΈ классов Ρ‚ΠΈΠΏΠΎΠ²

Π’ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… Π³Π»Π°Π²Π°Ρ… ΠΌΡ‹ ΠΈΠ·ΡƒΡ‡ΠΈΠ»ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ ΠΈ классы Ρ‚ΠΈΠΏΠΎΠ² Π² языкС Haskell. Из этой Π³Π»Π°Π²Ρ‹ Π²Ρ‹ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΈ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ свои собствСнныС!

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² алгСбраичСскиС Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…


Π”ΠΎ сих ΠΏΠΎΡ€ ΠΌΡ‹ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°Π»ΠΈΡΡŒ со ΠΌΠ½ΠΎΠ³ΠΈΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… – Bool, Int, Char, Maybe ΠΈ Π΄Ρ€. Но ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ свой собствСнный Ρ‚ΠΈΠΏ? Один ΠΈΠ· способов – ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово data. Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим, ΠΊΠ°ΠΊ Π² стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½ Ρ‚ΠΈΠΏ Bool:

data Bool = False | True

ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово data ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ Π½ΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…. Π§Π°ΡΡ‚ΡŒ Π΄ΠΎ Π·Π½Π°ΠΊΠ° равСнства Π²Π²ΠΎΠ΄ΠΈΡ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Ρ‚ΠΈΠΏΠ°, Π² Π΄Π°Π½Π½ΠΎΠΌ случаС Bool. Π§Π°ΡΡ‚ΡŒ послС Π·Π½Π°ΠΊΠ° равСнства – это конструкторы Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ конструкторами Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. Они ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚, ΠΊΠ°ΠΊΠΈΠ΅ значСния ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Ρ‚ΠΈΠΏ. Π‘ΠΈΠΌΠ²ΠΎΠ» | ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Β«ΠΈΠ»ΠΈΒ». ОбъявлСниС ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‡Π΅ΡΡ‚ΡŒ Ρ‚Π°ΠΊ: Ρ‚ΠΈΠΏ Bool ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ значСния True ΠΈΠ»ΠΈ False. И имя Ρ‚ΠΈΠΏΠ°, ΠΈ конструкторы Π΄Π°Π½Π½Ρ‹Ρ… Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒΡΡ с прописной Π±ΡƒΠΊΠ²Ρ‹.

РассуТдая ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π΄ΡƒΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏ Int объявлСн Ρ‚Π°ΠΊ:

data Int = –2147483648 | –2147483647 | ... | –1 | 0 | 1 | 2 | ... | 2147483647

ΠŸΠ΅Ρ€Π²ΠΎΠ΅ ΠΈ послСднСС значСния – минимальноС ΠΈ максимальноС для Int. На самом Π΄Π΅Π»Π΅ Ρ‚ΠΈΠΏ Int объявлСн ΠΈΠ½Π°Ρ‡Π΅ – Π²ΠΈΠ΄ΠΈΡ‚Π΅, я пропустил ΡƒΠΉΠΌΡƒ чисСл – такая запись ΠΏΠΎΠ»Π΅Π·Π½Π° лишь Π² ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… цСлях.