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

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

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

Loading package integer-gmp ... linking ... done.

Loading package base ... linking ... done.

Loading package ffi-1.0 ... linking ... done.

Prelude>

ΠŸΠΎΠ·Π΄Ρ€Π°Π²Π»ΡΡŽ – Π²Ρ‹ Π² GHCi!

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•. ΠŸΡ€ΠΈΠ³Π»Π°ΡˆΠ΅Π½ΠΈΠ΅ консоли Π²Π²ΠΎΠ΄Π° – Prelude>, Π½ΠΎ ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Π² процСссС Ρ€Π°Π±ΠΎΡ‚Ρ‹, ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ просто ghci>. Если Π²Ρ‹ Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρƒ вас Π±Ρ‹Π»ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΆΠ΅ ΠΏΡ€ΠΈΠ³Π»Π°ΡˆΠ΅Π½ΠΈΠ΅, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ :set prompt "ghci> ".

НСмного школьной Π°Ρ€ΠΈΡ„ΠΌΠ΅Ρ‚ΠΈΠΊΠΈ:

ghci> 2 + 15 17

ghci> 49 * 100

4900

ghci> 1892 – 1472 420

ghci> 5 / 2

2.5

Код Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ сам Π·Π° сСбя. Π’Π°ΠΊΠΆΠ΅ Π² ΠΎΠ΄Π½ΠΎΠΉ строкС ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ нСсколько ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ²; ΠΏΡ€ΠΈ этом Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ порядок вычислСний. МоТно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΊΡ€ΡƒΠ³Π»Ρ‹Π΅ скобки для облСгчСния читаСмости ΠΊΠΎΠ΄Π° ΠΈΠ»ΠΈ для измСнСния порядка вычислСний:

ghci> (50 * 100) – 4999 1

ghci> 50 * 100 – 4999

1

ghci> 50 * (100 – 4999)

–244950

Π—Π΄ΠΎΡ€ΠΎΠ²ΠΎ, ΠΏΡ€Π°Π²Π΄Π°? Π§ΡƒΠ²ΡΡ‚Π²ΡƒΡŽ, Π²Ρ‹ со ΠΌΠ½ΠΎΠΉ Π½Π΅ согласны, Π½ΠΎ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ тСрпСния! НСбольшая ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ кроСтся Π² использовании ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… чисСл. Если Π½Π°ΠΌ захочСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ числа, Ρ‚ΠΎ всСгда Π»ΡƒΡ‡ΡˆΠ΅ Π·Π°ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΈΡ… Π² скобки. ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° выполнСния 5 * –3 ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ ΠΊ ошибкС, Π·Π°Ρ‚ΠΎ 5 * (–3) сработаСт ΠΊΠ°ΠΊ Π½Π°Π΄ΠΎ.

Π‘ΡƒΠ»Π΅Π²Π° Π°Π»Π³Π΅Π±Ρ€Π° Π² Haskell ΡΡ‚ΠΎΠ»ΡŒ ΠΆΠ΅ проста. Как ΠΈ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… Π΄Ρ€ΡƒΠ³ΠΈΡ… языках программирования, Π² Haskell имССтся Π΄Π²Π° логичСских значСния True ΠΈ False, для ΠΊΠΎΠ½ΡŠΡŽΠ½ΠΊΡ†ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ опСрация && (логичСскоС «И»), для Π΄ΠΈΠ·ΡŠΡŽΠ½ΠΊΡ†ΠΈΠΈ – опСрация || (логичСскоС Β«Π˜Π›Π˜Β»), для отрицания – опСрация not.

ghci> True && False False

ghci> True && True True

ghci> False || True True

ghci> not False

True

ghci> not (True&&True)

False

МоТно ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π΄Π²Π° значСния Π½Π° равСнство ΠΈ нСравСнство с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ == ΠΈ /=, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

ghci> 5 == 5

True

ghci> 1 == 0

False

ghci> 5 /= 5

False

ghci> 5 /= 4

True

ghci> "ΠΏΡ€ΠΈΠ²Π΅Ρ‚" == "ΠΏΡ€ΠΈΠ²Π΅Ρ‚"

True

А Ρ‡Ρ‚ΠΎ насчёт 5 + Π»Π°ΠΌΠ° ΠΈΠ»ΠΈ 5 == True? Если ΠΌΡ‹ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚, Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ большоС ΠΈ ΡΡ‚Ρ€Π°ΡˆΠ½ΠΎΠ΅ сообщСниС ΠΎΠ± ошибкС[1]!

No instance for (Num [Char])

arising from a use of `+' at <interactive>:1:0–9

Possible fix: add an instance declaration for (Num [Char]) In the expression: 5 + "Π»Π°ΠΌΠ°"

In the definition of `it': it = 5 + "Π»Π°ΠΌΠ°"

Π’Π°-Π°ΠΊ! GHCi Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ Π½Π°ΠΌ, Ρ‡Ρ‚ΠΎ Π»Π°ΠΌΠ° Π½Π΅ являСтся числом, ΠΈ нСпонятно, ΠΊΠ°ΠΊ это ΠΏΡ€ΠΈΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊ 5. Π”Π°ΠΆΠ΅ Ссли вмСсто Π»Π°ΠΌΠ° ΠΏΠΎΠ΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ ΠΈΠ»ΠΈ 4, Haskell всё Ρ€Π°Π²Π½ΠΎ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ это числом! ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ + ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ слСва ΠΈ справа Π±ΡƒΠ΄ΡƒΡ‚ числовыми. Если ΠΆΠ΅ ΠΌΡ‹ попытаСмся ΠΏΠΎΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ True == 5, GHCi ΠΎΠΏΡΡ‚ΡŒ скаТСт Π½Π°ΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏΡ‹ Π½Π΅ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚.

НСсмотря Π½Π° Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ опСрация + производится Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ элСмСнтов, воспринимаСмых ΠΊΠ°ΠΊ число, опСрация сравнСния (==), Π½Π°ΠΏΡ€ΠΎΡ‚ΠΈΠ², ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠ° ΠΊ любой ΠΏΠ°Ρ€Π΅ элСмСнтов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ. Ѐокус Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°. Π’Ρ‹ Π½Π΅ смоТСтС ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ яблоки ΠΈ Π°ΠΏΠ΅Π»ΡŒΡΠΈΠ½Ρ‹. Π’ подробностях ΠΌΡ‹ это обсудим Ρ‡ΡƒΡ‚ΡŒ ΠΏΠΎΠ·ΠΆΠ΅.

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•. Π—Π°ΠΏΠΈΡΡŒ 5 + 4.0 Π²ΠΏΠΎΠ»Π½Π΅ допустима, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ 5 ΠΌΠΎΠΆΠ΅Ρ‚ вСсти сСбя ΠΊΠ°ΠΊ Ρ†Π΅Π»ΠΎΠ΅ число ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ число с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ. 4.0 Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ Π² Ρ€ΠΎΠ»ΠΈ Ρ†Π΅Π»ΠΎΠ³ΠΎ числа, поэтому ΠΈΠΌΠ΅Π½Π½ΠΎ число 5 Π΄ΠΎΠ»ΠΆΠ½ΠΎ Β«ΠΏΠΎΠ΄ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒΡΡΒ».

Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ


Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Ρ‹ этого ΠΏΠΎΠΊΠ° Π½Π΅ осознали, Π½ΠΎ всё это врСмя ΠΌΡ‹ использовали Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. НапримСр, опСрация * – это функция, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π²Π° числа ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ½ΠΎΠΆΠ°Π΅Ρ‚ ΠΈΡ…. Как Π²Ρ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ, ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Π΅Ρ‘, вставляя символ * ΠΌΠ΅ΠΆΠ΄Ρƒ числами. Π­Ρ‚ΠΎ называСтся «инфиксной записью».

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ прСфиксными, поэтому Π² дальнСйшСм ΠΌΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ явно ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ функция ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΡ€Π΅Ρ„ΠΈΠΊΡΠ½ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ – это Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Ρ‚ΡŒΡΡ. Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ ΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… языков Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ ΠΈΠΌΠ΅Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π° Π·Π°Ρ‚Π΅ΠΌ Π΅Ρ‘ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² (ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Ρ€Π°Π·Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… запятыми) Π² скобках. Π’ языкС Haskell Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ ΠΈΠΌΠ΅Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ – Ρ‡Π΅Ρ€Π΅Π· ΠΏΡ€ΠΎΠ±Π΅Π» – ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π°Π·Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ±Π΅Π»Π°ΠΌΠΈ. Для Π½Π°Ρ‡Π°Π»Π° ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΈΠ· самых скучных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ языка:

ghci> succ 8 9

Ѐункция succ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π½Π° Π²Ρ…ΠΎΠ΄ любоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, послС Ρ‡Π΅Π³ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Как Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅, ΠΌΡ‹ отдСляСм имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠΌ. Π’Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с нСсколькими ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ просто.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ min ΠΈ max ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ ΠΏΠΎ Π΄Π²Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ (ΠΊΠ°ΠΊ ΠΈ числа!), ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ большСС ΠΈΠ»ΠΈ мСньшСС ΠΈΠ· Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ:

ghci> min 9 10

9

ghci> min 3.4 3.2

3.2

ghci> max 100 101 101

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ примСнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ списка ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ‡Π΅Ρ€Π΅Π· ΠΏΡ€ΠΎΠ±Π΅Π») ΠΈΠΌΠ΅Π΅Ρ‚ Π½Π°ΠΈΠ²Ρ‹ΡΡˆΠΈΠΉ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚. Для нас это Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π΄Π²Π° выраТСния эквивалСнтны:

ghci> succ 9 + max 5 4 + 1

16

ghci> (succ 9) + (max 5 4) + 1

16

Однако Ссли ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ Π·Π° ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ чисСл 9 ΠΈ 10, ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ succ 9 * 10, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ это даст Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ Π·Π° 9 (Ρ‚. Π΅. 10), ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ Π½Π° 10, Ρ‚. Π΅. 100. Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ succ (9 * 10), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ 91.

Если функция ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ€ΠΎΠ²Π½ΠΎ Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, ΠΌΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π΅Ρ‘ Π² инфиксной Ρ„ΠΎΡ€ΠΌΠ΅, Π·Π°ΠΊΠ»ΡŽΡ‡ΠΈΠ² Π΅Ρ‘ имя Π² ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹Π΅ апострофы. НапримСр, функция div ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π²Π° Ρ†Π΅Π»Ρ‹Ρ… числа ΠΈ выполняСт ΠΈΡ… цСлочислСнноС Π΄Π΅Π»Π΅Π½ΠΈΠ΅:

ghci> div 92 10

9

Но Ссли ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Π΅Ρ‘ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ Π½Π΅Ρ€Π°Π·Π±Π΅Ρ€ΠΈΡ…Π° с Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊΠΎΠ΅ ΠΈΠ· чисСл Π΄Π΅Π»ΠΈΠΌΠΎΠ΅, Π° ΠΊΠ°ΠΊΠΎΠ΅ Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² инфиксной Ρ„ΠΎΡ€ΠΌΠ΅, Ρ‡Ρ‚ΠΎ, ΠΊΠ°ΠΊ оказываСтся, Π³ΠΎΡ€Π°Π·Π΄ΠΎ понятнСС[2]:

ghci> 92 `div` 10

9

МногиС люди, ΠΏΠ΅Ρ€Π΅ΡˆΠ΅Π΄ΡˆΠΈΠ΅ Π½Π° Haskell с ΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… языков, ΠΏΡ€ΠΈΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ мнСния, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒΡΡ скобками. НапримСр, Π² языкС Π‘ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ скобки для Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π²Ρ€ΠΎΠ΄Π΅ foo(), bar(1) ΠΈΠ»ΠΈ baz(3, Ρ…Π°-Ρ…Π°). Однако, ΠΊΠ°ΠΊ ΠΌΡ‹ ΡƒΠΆΠ΅ ΠΎΡ‚ΠΌΠ΅Ρ‡Π°Π»ΠΈ, для примСнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² Haskell прСдусмотрСны ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π²Ρ‹Π·ΠΎΠ² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ производится ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ: foo, bar 1 ΠΈ baz 3 Ρ…Π°-Ρ…Π°. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ Ссли Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π²Ρ€ΠΎΠ΄Π΅ bar (bar 3), это Π½Π΅ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ bar вызываСтся с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ bar ΠΈ 3. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ сначала Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ bar с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ 3, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ число, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΎΠΏΡΡ‚ΡŒ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ bar с этим числом Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°. Π’ языкС Π‘ это выглядСло Π±Ρ‹ Ρ‚Π°ΠΊ: β€œbar(bar(3))”.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ: ΠΏΠ΅Ρ€Π²Ρ‹Π΅ шаги


ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ. Π—Π° ΠΈΠΌΠ΅Π½Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹[3], Ρ€Π°Π·Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π΅Π»Π°ΠΌΠΈ. Но ΠΏΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΅ΡΡ‚ΡŒ Π΅Ρ‰Ρ‘ символ =, Π° Π·Π° Π½ΠΈΠΌ – описаниС Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ функция Π΄Π΅Π»Π°Π΅Ρ‚. Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° напишСм ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΡƒΡŽ число ΠΈ ΡƒΠΌΠ½ΠΎΠΆΠ°ΡŽΡ‰ΡƒΡŽ Π΅Π³ΠΎ Π½Π° 2. ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ свой Π»ΡŽΠ±ΠΈΠΌΡ‹ΠΉ тСкстовый Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ ΠΈ Π½Π°Π±Π΅Ρ€ΠΈΡ‚Π΅ Π² Π½Ρ‘ΠΌ:

doubleMe x = x + x

Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚Π΅ этот Ρ„Π°ΠΉΠ», Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΠ΄ ΠΈΠΌΠ΅Π½Π΅ΠΌ baby.hs. Π—Π°Ρ‚Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π²Ρ‹ Π΅Π³ΠΎ сохранили, ΠΈ запуститС ΠΎΡ‚Ρ‚ΡƒΠ΄Π° GHCi. Π’ GHCi Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ :l baby. Π’Π΅ΠΏΠ΅Ρ€ΡŒ наш сцСнарий Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½, ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡƒΠΏΡ€Π°ΠΆΠ½ΡΡ‚ΡŒΡΡ c Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ:

ghci> :l baby

[1 of 1] Compiling Main     ( baby.hs, interpreted )

Ok, modules loaded: Main.

ghci> doubleMe 9

18

ghci> doubleMe 8.3

16.6

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ опСрация + ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠ° ΠΊΠ°ΠΊ ΠΊ Ρ†Π΅Π»Ρ‹ΠΌ числам, Ρ‚Π°ΠΊ ΠΈ ΠΊ числам с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ (Π½Π° самом Π΄Π΅Π»Π΅ – ΠΊΠΎ всСму, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ воспринято ΠΊΠ°ΠΊ число), наша функция ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с Π»ΡŽΠ±Ρ‹ΠΌΠΈ числами. А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ напишСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π²Π° числа, ΡƒΠΌΠ½ΠΎΠΆΠ°Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Π½Π° Π΄Π²Π° ΠΈ складываСт ΠΈΡ… Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ. Π”ΠΎΠΏΠΈΡˆΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ Π² Ρ„Π°ΠΉΠ» baby.hs:

doubleUs x y = x*2 + y*2

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² языкС Haskell ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π² любом порядкС. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½Π΅Π²Π°ΠΆΠ½ΠΎ, Π² ΠΊΠ°ΠΊΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Ρ„Π°ΠΉΠ»Π΅ baby.hs.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ сохранитС Ρ„Π°ΠΉΠ» ΠΈ Π²Π²Π΅Π΄ΠΈΡ‚Π΅ :l baby Π² GHCi, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π²ΠΏΠΎΠ»Π½Π΅ прСдсказуСмы:

ghci> doubleUs 4 9

26

ghci> doubleUs 2.3 34.2

73.0

ghci> doubleUs 28 88 + doubleMe 123

478

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ свои собствСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… созданных Π²Π°ΠΌΠΈ ΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Учитывая это, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ doubleUs ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

doubleUs x y = doubleMe x + doubleMe y

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