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

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

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

$ ./arg-test first second w00t "multi word arg"

АргумСнты ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки:

first

second

w00t

multi word arg

Имя ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹:

arg-test

Π•Ρ‰Ρ‘ большС ΡˆΠ°Π»ΠΎΡΡ‚Π΅ΠΉ со списком Π΄Π΅Π»

Π’ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… ΠΌΡ‹ писали ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ для добавлСния ΠΈ удалСния Π·Π°Π΄Π°Π½ΠΈΠΉ Π² спискС Π΄Π΅Π». Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ собираСмся ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ ΠΈΡ… Π² Π½ΠΎΠ²ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π° Ρ‡Ρ‚ΠΎ Π΅ΠΌΡƒ Π΄Π΅Π»Π°Ρ‚ΡŒ, Π±ΡƒΠ΄Π΅ΠΌ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, позаботимся ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° смогла Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ – Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ todo.txt.

Назовём ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ просто todo, ΠΎΠ½Π° смоТСт Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Ρ€ΠΈ Ρ€Π°Π·Π½Ρ‹Π΅ Π²Π΅Ρ‰ΠΈ:

β€’ ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ задания;

β€’ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ задания;

β€’ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ задания.

Для добавлСния Π½ΠΎΠ²ΠΎΠ³ΠΎ задания Π² список Π΄Π΅Π» Π² Ρ„Π°ΠΉΠ»Π΅ todo.txt ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΈΡΠ°Ρ‚ΡŒ:

$ ./todo add todo.txt "Найти магичСский ΠΌΠ΅Ρ‡ силы"

ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠ΅ задания ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ view:

$ ./todo view todo.txt

Для удалСния задания потрСбуСтся Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π΅Π³ΠΎ индСкс:

$ ./todo remove todo.txt 2

ΠœΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½Ρ‹ΠΉ список Π·Π°Π΄Π°Ρ‡

Начнём с Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Π² Π²ΠΈΠ΄Π΅ строки (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, "add" ΠΈΠ»ΠΈ "view") ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ список Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ дСйствиС Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰Π΅Π΅ Π² точности Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ:

import System.Environment

import System.Directory

import System.IO

import Data.List

import Control.Exception


dispatch :: String -> [String] –> IO ()

dispatch "add" = add

dispatch "view" = view

dispatch "remove" = remove

Ѐункция main Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

main = do

   (command:argList) <- getArgs

   dispatch command argList

ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ Π΄Π΅Π»ΠΎΠΌ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΈ связываСм ΠΈΡ… со списком (command:argsList). Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ связан с ΠΈΠΌΠ΅Π½Π΅ΠΌ command, Π° всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ – со списком argList. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ строкС ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ commands примСняСтся функция dispatch, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄Π½Π° ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ add, view ΠΈΠ»ΠΈ remove. Π—Π°Ρ‚Π΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π°Ρ функция примСняСтся ΠΊ списку Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² argList.

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π·Π°ΠΏΡƒΡ‰Π΅Π½Π° со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ:

$ ./todo add todo.txt "Найти магичСский ΠΌΠ΅Ρ‡ силы"

Π’ΠΎΠ³Π΄Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ command Π±ΡƒΠ΄Π΅Ρ‚ "add", Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ argList – список ["todo.txt", "Найти магичСский ΠΌΠ΅Ρ‡ силы"]. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ сработаСт ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ опрСдСлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ dispatch ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π° функция add. ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΠ΅ΠΌ Π΅Ρ‘ ΠΊ argList, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ оказываСтся дСйствиС Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°, Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‰Π΅Π΅ Π½ΠΎΠ²ΠΎΠ΅ Π·Π°Π΄Π°Π½ΠΈΠ΅ Π² список.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ add, view ΠΈ remove. Начнём с ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΈΠ· Π½ΠΈΡ…:

add :: [String] –> IO ()

add [fileName, todoItem] = appendFile fileName (todoItem ++ "\n")

ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅

$ ./todo add todo.txt "Найти магичСский ΠΌΠ΅Ρ‡ силы"

Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ add Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ список ["todo.txt", "Найти магичСский ΠΌΠ΅Ρ‡ силы"]. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠΎΠΊΠ° ΠΌΡ‹ Π½Π΅ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΉ Π²Π²ΠΎΠ΄, достаточно Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ add с двухэлСмСнтным списком. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±ΡƒΠ΄Π΅Ρ‚ дСйствиС Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°, Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‰Π΅Π΅ строку вмСстС с символом ΠΊΠΎΠ½Ρ†Π° строки Π² ΠΊΠΎΠ½Π΅Ρ† Ρ„Π°ΠΉΠ»Π°.

Π”Π°Π»Π΅Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ просмотра списка. Если ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ элСмСнты списка, Ρ‚ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Ρ‚Π°ΠΊ: todo view todo.txt. Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ сопоставлСнии с ΠΎΠ±Ρ€Π°Π·Ρ†ΠΎΠΌ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ command Π±ΡƒΠ΄Π΅Ρ‚ связан со строкой view, Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ argList Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π΅Π½ ["todo.txt"].

Π’ΠΎΡ‚ ΠΊΠΎΠ΄ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ view:

view :: [String] –> IO ()

view [fileName] = do

   contents <– readFile fileName

   let todoTasks = lines contents

       numberedTasks = zipWith (\n line –> show n ++ " – " ++ line)

                       [0..] todoTasks

   putStr $ unlines numberedTasks

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

Ну ΠΈ Π½Π°ΠΊΠΎΠ½Π΅Ρ† Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ remove. Ѐункция Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠ° Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ для удалСния элСмСнта, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Ссли Π²Ρ‹ Π½Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚Π΅, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ функция удалСния, ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ пояснСния ΠΊ Π΅Ρ‘ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ. ОсновноС ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ – ΠΌΡ‹ Π½Π΅ Π·Π°Π΄Π°Ρ‘ΠΌ Тёстко имя Ρ„Π°ΠΉΠ»Π°, Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π΅Π³ΠΎ ΠΊΠ°ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚. Π’Π°ΠΊΠΆΠ΅ ΠΌΡ‹ Π½Π΅ ΡΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌ Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π½ΠΎΠΌΠ΅Ρ€ Π·Π°Π΄Π°Ρ‡ΠΈ для удалСния – Π΅Π³ΠΎ ΠΌΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π² Π²ΠΈΠ΄Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°.

remove :: [String] -> IO ()

remove [fileName, numberString] = do

   contents <- readFile fileName

   let todoTasks = lines contents

       number = read numberString

       newTodoItems = unlines $ delete (todoTasks !! number) todoTasks

   bracketOnError (openTempFile "." "temp")

      (\(tempName, tempHandle) –> do

            hClose tempHandle

            removeFile tempName)

      (\(tempName, tempHandle) –> do

            hPutStr tempHandle newTodoItems

            hClose tempHandle

            removeFile fileName

            renameFile tempName fileName)

ΠœΡ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ Ρ„Π°ΠΉΠ», ΠΏΠΎΠ»Π½ΠΎΠ΅ имя ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ задаётся Π² ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π΅ fileName, ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», удаляСм строку ΠΏΠΎ индСксу, записываСм Π²ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», удаляСм исходный Ρ„Π°ΠΉΠ» ΠΈ ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Ρ‹Π²Π°Π΅ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Π² fileName. ΠŸΡ€ΠΈΠ²Π΅Π΄Ρ‘ΠΌ ΠΏΠΎΠ»Π½Ρ‹ΠΉ листинг ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π²ΠΎ всСй Π΅Ρ‘ красС:

import System.Environment

import System.Directory

import System.IO

import Control.Exception

import Data.List


dispatch :: String -> [String] -> IO ()

dispatch "add" = add

dispatch "view" = view

dispatch "remove" = remove


main = do

   (command:argList) <- getArgs

   dispatch command argList


add :: [String] -> IO ()

add [fileName, todoItem] = appendFile fileName (todoItem ++ "\n")


view :: [String] -> IO ()

view [fileName] = do

   contents <- readFile fileName

   let todoTasks = lines contents

       numberedTasks = zipWith (\n line -> show n ++ " – " ++ line)

                       [0..] todoTasks

   putStr $ unlines numberedTasks


remove :: [String] -> IO ()

remove [fileName, numberString] = do

   contents <- readFile fileName

   let todoTasks = lines contents

       number = read numberString

       newTodoItems = unlines $ delete (todoTasks !! number) todoTasks

   bracketOnError (openTempFile "." "temp")

      (\(tempName, tempHandle) -> do

            hClose tempHandle

            removeFile tempName)

      (\(tempName, tempHandle) -> do

            hPutStr tempHandle newTodoItems

            hClose tempHandle

            removeFile fileName

            renameFile tempName fileName)

Π Π΅Π·ΡŽΠΌΠΈΡ€ΡƒΠ΅ΠΌ нашС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅. ΠœΡ‹ написали Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ dispatch, ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки Π² Π²ΠΈΠ΄Π΅ списка ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ дСйствиС Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°. ΠžΡΠ½ΠΎΠ²Ρ‹Π²Π°ΡΡΡŒ Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, функция dispatch Π΄Π°Ρ‘Ρ‚ Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π²Ρ‹Π·ΠΎΠ²Π° этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠ΅ дСйствиС ΠΈ выполняСм Π΅Π³ΠΎ.

Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ, ΠΊΠ°ΠΊ наша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚:

$ ./todo view todo.txt

0 – ΠŸΠΎΠ³Π»Π°Π΄ΠΈΡ‚ΡŒ посуду

1 – ΠŸΠΎΠΌΡ‹Ρ‚ΡŒ собаку

2 – Π’Ρ‹Π½ΡƒΡ‚ΡŒ салат ΠΈΠ· ΠΏΠ΅Ρ‡ΠΈ


$ ./todo add todo.txt "Π—Π°Π±Ρ€Π°Ρ‚ΡŒ Π΄Π΅Ρ‚Π΅ΠΉ ΠΈΠ· химчистки"


$ ./todo view todo.txt

0 – ΠŸΠΎΠ³Π»Π°Π΄ΠΈΡ‚ΡŒ посуду

1 – ΠŸΠΎΠΌΡ‹Ρ‚ΡŒ собаку

2 – Π’Ρ‹Π½ΡƒΡ‚ΡŒ салат ΠΈΠ· ΠΏΠ΅Ρ‡ΠΈ

3 – Π—Π°Π±Ρ€Π°Ρ‚ΡŒ Π΄Π΅Ρ‚Π΅ΠΉ ΠΈΠ· химчистки


$ ./todo remove todo.txt 2


$ ./todo view todo.txt

0 – ΠŸΠΎΠ³Π»Π°Π΄ΠΈΡ‚ΡŒ посуду

1 – ΠŸΠΎΠΌΡ‹Ρ‚ΡŒ собаку

2 – Π—Π°Π±Ρ€Π°Ρ‚ΡŒ Π΄Π΅Ρ‚Π΅ΠΉ ΠΈΠ· химчистки

Π‘ΠΎΠ»ΡŒΡˆΠΎΠΉ плюс Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° – Π»Π΅Π³ΠΊΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ опрСдСлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ dispatch, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ – ΠΈ Π³ΠΎΡ‚ΠΎΠ²ΠΎ! Π’ качСствС упраТнСния ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ bump, которая ΠΏΡ€ΠΈΠΌΠ΅Ρ‚ Ρ„Π°ΠΉΠ» ΠΈ Π½ΠΎΠΌΠ΅Ρ€ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΈ Π²Π΅Ρ€Π½Ρ‘Ρ‚ дСйствиС Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΠΎΠ΄Π½ΠΈΠΌΠ΅Ρ‚ ΡƒΠΊΠ°Π·Π°Π½Π½ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ списка Π·Π°Π΄Π°Ρ‡.

Π Π°Π±ΠΎΡ‚Π°Π΅ΠΌ с Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌ Π²Π²ΠΎΠ΄ΠΎΠΌ

МоТно Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π΄ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ эту ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΡƒΠ»ΡƒΡ‡ΡˆΠΈΠ² сообщСния ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΈ Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹Ρ… исходных Π΄Π°Π½Π½Ρ‹Ρ…. ΠΠ°Ρ‡Π°Ρ‚ΡŒ ΠΌΠΎΠΆΠ½ΠΎ с добавлСния Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ dispatch, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ срабатываСт ΠΏΡ€ΠΈ любой Π½Π΅ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π΅:

dispatch :: String -> [String] -> IO ()

dispatch "add" = add

dispatch "view" = view

dispatch "remove" = remove

dispatch command = doesntExist command


doesntExist :: String -> [String] -> IO ()

doesntExist command _ =

   putStrLn $ "Команда " ++ command ++ " Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°"

Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ опрСдСлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ add, view ΠΈ remove для случаСв, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ΠΎ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ количСство Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². НапримСр: