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

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

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

Π˜Π·Π²ΠΈΠ½ΠΈΡ‚Π΅, Π½ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚ 3

Π― Π·Π°Π΄ΡƒΠΌΠ°Π» число ΠΎΡ‚ 1 Π΄ΠΎ 10. КакоС?

10

ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ!

Π― Π·Π°Π΄ΡƒΠΌΠ°Π» число ΠΎΡ‚ 1 Π΄ΠΎ 10. КакоС?

2

Π˜Π·Π²ΠΈΠ½ΠΈΡ‚Π΅, Π½ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚ 4

Π― Π·Π°Π΄ΡƒΠΌΠ°Π» число ΠΎΡ‚ 1 Π΄ΠΎ 10. КакоС?

5

Π˜Π·Π²ΠΈΠ½ΠΈΡ‚Π΅, Π½ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚ 10

Π― Π·Π°Π΄ΡƒΠΌΠ°Π» число ΠΎΡ‚ 1 Π΄ΠΎ 10. КакоС?

МоТно Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ эту ΠΆΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΏΠΎ-Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ:

import System.Random

import Control.Monad (when)


main = do

   gen <- getStdGen

   let (randNumber, _) = randomR (1,10) gen :: (Int, StdGen)

   putStr "Π― Π·Π°Π΄ΡƒΠΌΠ°Π» число ΠΎΡ‚ 1 Π΄ΠΎ 10. КакоС? "

   numberString <- getLine

   when (not $ null numberString) $ do

      let number = read numberString

      if randNumber == number

        then putStrLn "ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ!"

        else putStrLn $ "Π˜Π·Π²ΠΈΠ½ΠΈΡ‚Π΅, Π½ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚ "

                         ++ show randNumber

      newStdGen

      main

Π­Ρ‚Π° вСрсия ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠ° Π½Π° ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΡƒΡŽ, Π½ΠΎ вмСсто создания Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ сама сСбя рСкурсивно с вновь ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΌ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ, ΠΌΡ‹ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠΌ всС дСйствия Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main. ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ ΠΎΡ‚Π²Π΅Ρ‚, ΡƒΠ³Π°Π΄Π°Π» Π»ΠΈ ΠΎΠ½ число, ΠΌΡ‹ ΠΎΠ±Π½ΠΎΠ²ΠΈΠΌ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΈ снова Π²Ρ‹Π·ΠΎΠ²Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ main. Оба ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° Ρ…ΠΎΡ€ΠΎΡˆΠΈ, Π½ΠΎ ΠΌΠ½Π΅ большС нравится ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ способ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ прСдусматриваСт мСньшС дСйствий Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main ΠΈ Π΄Π°Ρ‘Ρ‚ Π½Π°ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π»Π΅Π³ΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ.

Bytestring: Ρ‚ΠΎΡ‚ ΠΆΠ΅ String, Π½ΠΎ быстрСС

Бписок – полСзная ΠΈ удобная структура Π΄Π°Π½Π½Ρ‹Ρ…. ΠœΡ‹ использовали списки ΠΏΠΎΡ‡Ρ‚ΠΈ Ρ‡Ρ‚ΠΎ Π²Π΅Π·Π΄Π΅. БущСствуСт ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΡ… со списками, ΠΈ Π»Π΅Π½ΠΈΠ²ΠΎΡΡ‚ΡŒ языка Haskell позволяСт Π½Π°ΠΌ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ†ΠΈΠΊΠ»Ρ‹ Ρ‚ΠΈΠΏΠ° for ΠΈ while ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… языков программирования Π½Π° Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡŽ ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ списков, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ вычислСниС ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Ρ‘Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΎ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ понадобится. Π’ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ Ρ‚Π°ΠΊΠΈΠ΅ Π²Π΅Ρ‰ΠΈ, ΠΊΠ°ΠΊ бСсконСчныС списки (ΠΈ Π΄Π°ΠΆΠ΅ бСсконСчныС списки бСсконСчных списков!) для нас Π½Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°. По Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ списки ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ Π² качСствС ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Ρ‡ΠΈΡ‚Π°Π΅ΠΌ Π»ΠΈ ΠΌΡ‹ со стандартного Π²Π²ΠΎΠ΄Π° ΠΈΠ»ΠΈ ΠΈΠ· Ρ„Π°ΠΉΠ»Π°. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ„Π°ΠΉΠ» ΠΈ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΊΠ°ΠΊ строку, Π½ΠΎ Π½Π° самом Π΄Π΅Π»Π΅ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ нСобходимости.

Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΊΠ°ΠΊ строк ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ нСдостаток: ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠΉ. Как Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅, Ρ‚ΠΈΠΏ String – это просто синоним для Ρ‚ΠΈΠΏΠ° [Char]. Π£ символов Π½Π΅Ρ‚ фиксированного Ρ€Π°Π·ΠΌΠ΅Ρ€Π°, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ для прСдставлСния, скаТСм, символа Π² ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ΅ Unicode ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ нСсколько Π±Π°ΠΉΡ‚ΠΎΠ². Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, список – лСнивая структура. Если Ρƒ вас Π΅ΡΡ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, список [1,2,3,4], ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ вычислСн Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° это Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ. На самом Π΄Π΅Π»Π΅ список, Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ смыслС, – это ΠΎΠ±Π΅Ρ‰Π°Π½ΠΈΠ΅ списка. Вспомним, Ρ‡Ρ‚ΠΎ [1,2,3,4] – это всСго лишь синтаксичСский сахар для записи 1:2:3:4:[]. Когда ΠΌΡ‹ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ выполняСм вычислСниС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ элСмСнта списка (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ Π΅Π³ΠΎ Π½Π° экран), остаток списка 2:3:4:[] Ρ‚Π°ΠΊΠΆΠ΅ прСдставляСт собой Β«ΠΎΠ±Π΅Ρ‰Π°Π½ΠΈΠ΅ списка», ΠΈ Ρ‚. Π΄. Бписок всСго лишь ΠΎΠ±Π΅Ρ‰Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ элСмСнт Π±ΡƒΠ΄Π΅Ρ‚ вычислСн, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ½ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ понадобится, ΠΏΡ€ΠΈΡ‡Ρ‘ΠΌ вмСстС с элСмСнтом Π±ΡƒΠ΄Π΅Ρ‚ создано ΠΎΠ±Π΅Ρ‰Π°Π½ΠΈΠ΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ элСмСнта. НС Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠ»Π°Π³Π°Ρ‚ΡŒ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… умствСнных усилий, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° простого списка чисСл ΠΊΠ°ΠΊ сСрии ΠΎΠ±Π΅Ρ‰Π°Π½ΠΈΠΉ – Π½Π΅ самая эффСктивная Π²Π΅Ρ‰ΡŒ Π½Π° свСтС!



ВсС эти Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Π΅ расходы, связанныС со списками, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ нас Π½Π΅ Π²ΠΎΠ»Π½ΡƒΡŽΡ‚, Π½ΠΎ ΠΏΡ€ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠΈ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΈΠΌΠΈ это становится ΠΏΠΎΠΌΠ΅Ρ…ΠΎΠΉ. Π’ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π² языкС Haskell Π΅ΡΡ‚ΡŒ Π±Π°ΠΉΡ‚ΠΎΠ²Ρ‹Π΅ строки. Они ΠΏΠΎΡ…ΠΎΠΆΠΈ Π½Π° списки, Π½ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт ΠΈΠΌΠ΅Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΠ΄ΠΈΠ½ Π±Π°ΠΉΡ‚. Π’Π°ΠΊΠΆΠ΅ списки ΠΈ Π±Π°ΠΉΡ‚ΠΎΠ²Ρ‹Π΅ строки ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ Π»Π΅Π½ΠΈΠ²ΠΎΡΡ‚ΡŒ.

Π‘Ρ‚Ρ€ΠΎΠ³ΠΈΠ΅ ΠΈ Π»Π΅Π½ΠΈΠ²Ρ‹Π΅

Π‘Π°ΠΉΡ‚ΠΎΠ²Ρ‹Π΅ строки Π±Ρ‹Π²Π°ΡŽΡ‚ Π΄Π²ΡƒΡ… Π²ΠΈΠ΄ΠΎΠ²: строгиС ΠΈ Π»Π΅Π½ΠΈΠ²Ρ‹Π΅. Π‘Ρ‚Ρ€ΠΎΠ³ΠΈΠ΅ Π±Π°ΠΉΡ‚ΠΎΠ²Ρ‹Π΅ строки ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ Data.ByteString, ΠΈ ΠΎΠ½ΠΈ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π½Π΅ Π»Π΅Π½ΠΈΠ²Ρ‹Π΅. НС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Β«ΠΎΠ±Π΅Ρ‰Π°Π½ΠΈΠΉΒ», строгая строка Π±Π°ΠΉΡ‚ΠΎΠ² прСдставляСт собой ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π±Π°ΠΉΡ‚ΠΎΠ² Π² массивС. Подобная строка Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ бСсконСчной. Если Π²Ρ‹ вычисляСтС ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π±Π°ΠΉΡ‚ ΠΈΠ· строгой строки, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ Π΅Ρ‘ Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ. ΠŸΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ – мСньшС Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Ρ… расходов, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ «обСщания». ΠžΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ – Ρ‚Π°ΠΊΠΈΠ΅ строки заполнят ΠΏΠ°ΠΌΡΡ‚ΡŒ быстрСС, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ.

Π’Ρ‚ΠΎΡ€ΠΎΠΉ Π²ΠΈΠ΄ Π±Π°ΠΉΡ‚ΠΎΠ²Ρ‹Ρ… строк ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½ Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ Data.ByteString. Lazy. Они Π»Π΅Π½ΠΈΠ²Ρ‹ – Π½ΠΎ Π½Π΅ Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ, ΠΊΠ°ΠΊ списки. Как ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ Ρ€Π°Π½Π΅Π΅, Π² спискС ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΆΠ΅ Β«ΠΎΠ±Π΅Ρ‰Π°Π½ΠΈΠΉΒ», сколько элСмСнтов. Π’ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ это ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹ΠΌ для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ†Π΅Π»Π΅ΠΉ. Π›Π΅Π½ΠΈΠ²Ρ‹Π΅ строки Π±Π°ΠΉΡ‚ΠΎΠ² ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄: ΠΎΠ½ΠΈ хранятся Π±Π»ΠΎΠΊΠ°ΠΌΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ 64 Кб. Если Π²Ρ‹ вычисляСтС Π±Π°ΠΉΡ‚ Π² Π»Π΅Π½ΠΈΠ²ΠΎΠΉ Π±Π°ΠΉΡ‚ΠΎΠ²ΠΎΠΉ строкС (пСчатая ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌ способом), Ρ‚ΠΎ Π±ΡƒΠ΄ΡƒΡ‚ вычислСны ΠΏΠ΅Ρ€Π²Ρ‹Π΅ 64 Кб. ПослС этого Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Ρ€Π°Ρ‰Π΅Π½ΠΎ ΠΎΠ±Π΅Ρ‰Π°Π½ΠΈΠ΅ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ. Π›Π΅Π½ΠΈΠ²Ρ‹Π΅ Π±Π°ΠΉΡ‚ΠΎΠ²Ρ‹Π΅ строки ΠΏΠΎΡ…ΠΎΠΆΠΈ Π½Π° список строгих Π±Π°ΠΉΡ‚ΠΎΠ²Ρ‹Ρ… строк Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ 64 Кб. ΠŸΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Ρ„Π°ΠΉΠ»Π° Π»Π΅Π½ΠΈΠ²Ρ‹ΠΌΠΈ Π±Π°ΠΉΡ‚ΠΎΠ²Ρ‹ΠΌΠΈ строками Ρ„Π°ΠΉΠ» Π±ΡƒΠ΄Π΅Ρ‚ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒΡΡ Π±Π»ΠΎΠΊ Π·Π° Π±Π»ΠΎΠΊΠΎΠΌ. Π­Ρ‚ΠΎ ΡƒΠ΄ΠΎΠ±Π½ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ€Π΅Π·ΠΊΠΎΠ³ΠΎ увСличСния потрСблСния памяти, ΠΈ 64 Кб, вСроятно, Π²Π»Π΅Π·Π΅Ρ‚ Π² L2 – кэш вашСго процСссора.

Если Π²Ρ‹ посмотритС Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ Π½Π° ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Data.ByteString. Lazy, Ρ‚ΠΎ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ мноТСство Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ с Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ, ΠΊΠ°ΠΊ ΠΈ Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ Data.List, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² сигнатурах Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Π½ Ρ‚ΠΈΠΏ ByteString вмСсто [a] ΠΈ Word8 вмСсто a. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² этом ΠΌΠΎΠ΄ΡƒΠ»Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ со значСниями Ρ‚ΠΈΠΏΠ° ByteString Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΎΠ΄Π½ΠΎΠΈΠΌΡ‘Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ – со списками. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈΠΌΠ΅Π½Π° ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚, Π½Π°ΠΌ придётся ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΡƒΡ‚ΠΎΡ‡Π½Ρ‘Π½Π½Ρ‹ΠΉ ΠΈΠΌΠΏΠΎΡ€Ρ‚ Π² скриптС ΠΈ Π·Π°Ρ‚Π΅ΠΌ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ этот скрипт Π² ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ GHCi для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с Ρ‚ΠΈΠΏΠΎΠΌ ByteString.

import qualified Data.ByteString.Lazy as B

import qualified Data.ByteString as S

ΠœΠΎΠ΄ΡƒΠ»ΡŒ B содСрТит Π»Π΅Π½ΠΈΠ²Ρ‹Π΅ строки Π±Π°ΠΉΡ‚ΠΎΠ² ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΌΠΎΠ΄ΡƒΠ»ΡŒ S – строгиС. Π“Π»Π°Π²Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»Π΅Π½ΠΈΠ²ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ.

Ѐункция pack ΠΈΠΌΠ΅Π΅Ρ‚ сигнатуру pack :: [Word8] –> ByteString. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ список Π±Π°ΠΉΡ‚ΠΎΠ² Ρ‚ΠΈΠΏΠ° Word8 ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° ByteString. МоТно Π΄ΡƒΠΌΠ°Ρ‚ΡŒ, Π±ΡƒΠ΄Ρ‚ΠΎ функция ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π»Π΅Π½ΠΈΠ²Ρ‹ΠΉ список ΠΈ Π΄Π΅Π»Π°Π΅Ρ‚ Π΅Π³ΠΎ ΠΌΠ΅Π½Π΅Π΅ Π»Π΅Π½ΠΈΠ²Ρ‹ΠΌ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π»Π΅Π½ΠΈΠ² Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π±Π»ΠΎΠΊΠ°ΠΌΠΈ ΠΏΠΎ 64 ΠšΠ±.

Π§Ρ‚ΠΎ Π·Π° Ρ‚ΠΈΠΏ Word8? Он ΠΏΠΎΡ…ΠΎΠΆ Π½Π° Int, Π½ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ мСньший Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ 0 – 255. Π’ΠΈΠΏ прСдставляСт собой восьми Π±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ число. Π’Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ Int, ΠΎΠ½ ΠΈΠΌΠ΅Π΅Ρ‚ экзСмпляр класса Num. НапримСр, ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ число 5 ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„Π½ΠΎ, Π° Π·Π½Π°Ρ‡ΠΈΡ‚, ΠΎΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ вСсти сСбя ΠΊΠ°ΠΊ любой числовой Ρ‚ΠΈΠΏ. Π’ Ρ‚ΠΎΠΌ числС – ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Ρ‚ΠΈΠΏ Word8.

ghci> B.pack [99,97,110]

Chunk "can" Empty

ghci> B.pack [98..120]

Chunk "bcdefghijklmnopqrstuvwx" Empty

Как ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, Word8 Π½Π΅ доставляСт ΠΌΠ½ΠΎΠ³ΠΎ Ρ…Π»ΠΎΠΏΠΎΡ‚, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ систСма Ρ‚ΠΈΠΏΠΎΠ² опрСдСляСт, Ρ‡Ρ‚ΠΎ числа Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Ρ‹ ΠΊ Π½Π΅ΠΌΡƒ. Если Π²Ρ‹ ΠΏΠΎΠΏΡ‹Ρ‚Π°Π΅Ρ‚Π΅ΡΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ большоС число, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ 336, Π² качСствС значСния Ρ‚ΠΈΠΏΠ° Word8, число Π±ΡƒΠ΄Π΅Ρ‚ взято ΠΏΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ 256, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ сохранится 80.

ΠœΡ‹ ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Π»ΠΈ всСго нСсколько Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² Ρ‚ΠΈΠΏ ByteString; ΠΎΠ½ΠΈ ΡƒΠΌΠ΅ΡΡ‚ΠΈΠ»ΠΈΡΡŒ Π² ΠΎΠ΄ΠΈΠ½ Π±Π»ΠΎΠΊ. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Empty – это Π½Π΅Ρ‡Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ [] для списков.

Если Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π±Π°ΠΉΡ‚ΠΎΠ²ΡƒΡŽ строку Π±Π°ΠΉΡ‚ Π·Π° Π±Π°ΠΉΡ‚ΠΎΠΌ, Π΅Ρ‘ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°ΡΠΏΠ°ΠΊΠΎΠ²Π°Ρ‚ΡŒ. Ѐункция unpack ΠΎΠ±Ρ€Π°Ρ‚Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pack. Она ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ строку Π±Π°ΠΉΡ‚ΠΎΠ² ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ список Π±Π°ΠΉΡ‚ΠΎΠ². Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

ghci> let by = B.pack [98,111,114,116]

ghci> by

Chunk "bort" Empty

ghci> B.unpack by

[98,111,114,116]

Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ Π±Π°ΠΉΡ‚ΠΎΠ²Ρ‹Π΅ строки ΠΈΠ· строгих Π² Π»Π΅Π½ΠΈΠ²Ρ‹Π΅ ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚. Ѐункция fromChunks ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ список строгих строк ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ ΠΈΡ… Π² Π»Π΅Π½ΠΈΠ²ΡƒΡŽ строку. БоотвСтствСнно, функция toChunks ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π»Π΅Π½ΠΈΠ²ΡƒΡŽ строку Π±Π°ΠΉΡ‚ΠΎΠ² ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ Π΅Ρ‘ Π² список строгих строк.

ghci> B.fromChunks [S.pack [40,41,42], S.pack [43,44,45], S.pack [46,47,48]]

Chunk "()*" (Chunk "+,–" (Chunk "./0" Empty))

Π­Ρ‚ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, Ссли Ρƒ вас Π΅ΡΡ‚ΡŒ мноТСство ΠΌΠ°Π»Π΅Π½ΡŒΠΊΠΈΡ… строгих строк Π±Π°ΠΉΡ‚ΠΎΠ² ΠΈ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ эффСктивно ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΈΡ…, Π½Π΅ объСдиняя ΠΈΡ… Π² памяти Π² ΠΎΠ΄Π½Ρƒ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ ΡΡ‚Ρ€ΠΎΠ³ΡƒΡŽ строку.

Аналог конструктора : для строк Π±Π°ΠΉΡ‚ΠΎΠ² называСтся cons. Он ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π±Π°ΠΉΡ‚ ΠΈ строку Π±Π°ΠΉΡ‚ΠΎΠ² ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π±Π°ΠΉΡ‚ Π² Π½Π°Ρ‡Π°Π»ΠΎ строки.

ghci> B.cons 85 $ B.pack [80,81,82,84]

Chunk "U" (Chunk "PQRT" Empty)

ΠœΠΎΠ΄ΡƒΠ»ΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ со строками Π±Π°ΠΉΡ‚ΠΎΠ² содСрТат большоС количСство Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Ρ… функциям Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ Data.List, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ (Π½ΠΎ Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡΡΡŒ ΠΈΠΌΠΈ): head, tail, init, null, length, map, reverse, foldl, foldr, concat, takeWhile, filter ΠΈ Π΄Ρ€.

Π•ΡΡ‚ΡŒ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, имя ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… совпадаСт с ΠΈΠΌΠ΅Π½Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈΠ· модуля System.IO, ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΎΠ½ΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ строки Π·Π°ΠΌΠ΅Π½Π΅Π½Ρ‹ значСниями Ρ‚ΠΈΠΏΠ° ByteString. НапримСр, функция readFile Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ System.IO ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ