🗊Презентация Вывод строки символов на экран монитора. Ввод строки символов с клавиатуры. Создание и удаление файлов

Нажмите для полного просмотра!
Вывод строки символов на экран монитора. Ввод строки символов с клавиатуры. Создание и удаление файлов, слайд №1Вывод строки символов на экран монитора. Ввод строки символов с клавиатуры. Создание и удаление файлов, слайд №2Вывод строки символов на экран монитора. Ввод строки символов с клавиатуры. Создание и удаление файлов, слайд №3Вывод строки символов на экран монитора. Ввод строки символов с клавиатуры. Создание и удаление файлов, слайд №4Вывод строки символов на экран монитора. Ввод строки символов с клавиатуры. Создание и удаление файлов, слайд №5Вывод строки символов на экран монитора. Ввод строки символов с клавиатуры. Создание и удаление файлов, слайд №6Вывод строки символов на экран монитора. Ввод строки символов с клавиатуры. Создание и удаление файлов, слайд №7Вывод строки символов на экран монитора. Ввод строки символов с клавиатуры. Создание и удаление файлов, слайд №8Вывод строки символов на экран монитора. Ввод строки символов с клавиатуры. Создание и удаление файлов, слайд №9Вывод строки символов на экран монитора. Ввод строки символов с клавиатуры. Создание и удаление файлов, слайд №10Вывод строки символов на экран монитора. Ввод строки символов с клавиатуры. Создание и удаление файлов, слайд №11Вывод строки символов на экран монитора. Ввод строки символов с клавиатуры. Создание и удаление файлов, слайд №12Вывод строки символов на экран монитора. Ввод строки символов с клавиатуры. Создание и удаление файлов, слайд №13Вывод строки символов на экран монитора. Ввод строки символов с клавиатуры. Создание и удаление файлов, слайд №14Вывод строки символов на экран монитора. Ввод строки символов с клавиатуры. Создание и удаление файлов, слайд №15Вывод строки символов на экран монитора. Ввод строки символов с клавиатуры. Создание и удаление файлов, слайд №16Вывод строки символов на экран монитора. Ввод строки символов с клавиатуры. Создание и удаление файлов, слайд №17Вывод строки символов на экран монитора. Ввод строки символов с клавиатуры. Создание и удаление файлов, слайд №18Вывод строки символов на экран монитора. Ввод строки символов с клавиатуры. Создание и удаление файлов, слайд №19Вывод строки символов на экран монитора. Ввод строки символов с клавиатуры. Создание и удаление файлов, слайд №20Вывод строки символов на экран монитора. Ввод строки символов с клавиатуры. Создание и удаление файлов, слайд №21Вывод строки символов на экран монитора. Ввод строки символов с клавиатуры. Создание и удаление файлов, слайд №22Вывод строки символов на экран монитора. Ввод строки символов с клавиатуры. Создание и удаление файлов, слайд №23Вывод строки символов на экран монитора. Ввод строки символов с клавиатуры. Создание и удаление файлов, слайд №24Вывод строки символов на экран монитора. Ввод строки символов с клавиатуры. Создание и удаление файлов, слайд №25Вывод строки символов на экран монитора. Ввод строки символов с клавиатуры. Создание и удаление файлов, слайд №26Вывод строки символов на экран монитора. Ввод строки символов с клавиатуры. Создание и удаление файлов, слайд №27Вывод строки символов на экран монитора. Ввод строки символов с клавиатуры. Создание и удаление файлов, слайд №28Вывод строки символов на экран монитора. Ввод строки символов с клавиатуры. Создание и удаление файлов, слайд №29Вывод строки символов на экран монитора. Ввод строки символов с клавиатуры. Создание и удаление файлов, слайд №30Вывод строки символов на экран монитора. Ввод строки символов с клавиатуры. Создание и удаление файлов, слайд №31Вывод строки символов на экран монитора. Ввод строки символов с клавиатуры. Создание и удаление файлов, слайд №32Вывод строки символов на экран монитора. Ввод строки символов с клавиатуры. Создание и удаление файлов, слайд №33Вывод строки символов на экран монитора. Ввод строки символов с клавиатуры. Создание и удаление файлов, слайд №34Вывод строки символов на экран монитора. Ввод строки символов с клавиатуры. Создание и удаление файлов, слайд №35Вывод строки символов на экран монитора. Ввод строки символов с клавиатуры. Создание и удаление файлов, слайд №36Вывод строки символов на экран монитора. Ввод строки символов с клавиатуры. Создание и удаление файлов, слайд №37Вывод строки символов на экран монитора. Ввод строки символов с клавиатуры. Создание и удаление файлов, слайд №38Вывод строки символов на экран монитора. Ввод строки символов с клавиатуры. Создание и удаление файлов, слайд №39Вывод строки символов на экран монитора. Ввод строки символов с клавиатуры. Создание и удаление файлов, слайд №40Вывод строки символов на экран монитора. Ввод строки символов с клавиатуры. Создание и удаление файлов, слайд №41

Содержание

Вы можете ознакомиться и скачать презентацию на тему Вывод строки символов на экран монитора. Ввод строки символов с клавиатуры. Создание и удаление файлов. Доклад-сообщение содержит 41 слайдов. Презентации для любого класса можно скачать бесплатно. Если материал и наш сайт презентаций Mypresentation Вам понравились – поделитесь им с друзьями с помощью социальных кнопок и добавьте в закладки в своем браузере.

Слайды и текст этой презентации


Слайд 1





Ввод / вывод
Описание слайда:
Ввод / вывод

Слайд 2





Задачи
Вывод строки символов на экран монитора
Ввод строки символов с клавиатуры
Создание и удаление файлов
Чтение данных из файла
Запись данных в файл
Работа с командной строкой
Описание слайда:
Задачи Вывод строки символов на экран монитора Ввод строки символов с клавиатуры Создание и удаление файлов Чтение данных из файла Запись данных в файл Работа с командной строкой

Слайд 3





монады
Монада ввода - вывода используется в Haskell как связующее звено между значениями, присущими функциональному языку, и действиями, характеризующими операции ввода - вывода и императивное программирование в общем. 

Порядок вычисления выражений в Haskell ограничен только зависимостями данных; реализация обладает значительной свободой в выборе этого порядка. Действия, тем не менее, должны быть упорядочены определенным образом для выполнения программы и, в частности, ввода - вывода, для того чтобы быть правильно интерпретированы.
В Haskell монада ввода - вывода предоставляет пользователю способ указать последовательное связывание действий, и реализация обязана соблюдать этот порядок.
Описание слайда:
монады Монада ввода - вывода используется в Haskell как связующее звено между значениями, присущими функциональному языку, и действиями, характеризующими операции ввода - вывода и императивное программирование в общем. Порядок вычисления выражений в Haskell ограничен только зависимостями данных; реализация обладает значительной свободой в выборе этого порядка. Действия, тем не менее, должны быть упорядочены определенным образом для выполнения программы и, в частности, ввода - вывода, для того чтобы быть правильно интерпретированы. В Haskell монада ввода - вывода предоставляет пользователю способ указать последовательное связывание действий, и реализация обязана соблюдать этот порядок.

Слайд 4





монады
Термин монада происходит из отрасли математики, известной как теория категорий. Однако, с точки зрения программиста Haskell , лучше думать о монаде как об абстрактном типе данных. В случае монады ввода - вывода абстрактными значениями являются упомянутые выше действия. Некоторые операции являются примитивными действиями, соответствующими обычным операциям ввода - вывода. 
Специальные операции последовательно связывают действия, соответствующие последовательным операторам (таким как точка с запятой) в императивных языках.
Описание слайда:
монады Термин монада происходит из отрасли математики, известной как теория категорий. Однако, с точки зрения программиста Haskell , лучше думать о монаде как об абстрактном типе данных. В случае монады ввода - вывода абстрактными значениями являются упомянутые выше действия. Некоторые операции являются примитивными действиями, соответствующими обычным операциям ввода - вывода. Специальные операции последовательно связывают действия, соответствующие последовательным операторам (таким как точка с запятой) в императивных языках.

Слайд 5





Все монады представлены в 
лице класса типов Monad   - IO
class  Monad m  where
    (>>=)   :: m a -> (a -> m b) -> m b
    (>>)    :: m a -> m b -> m b
    return  :: a -> m a
    fail    :: String -> m a

  
Описание слайда:
Все монады представлены в лице класса типов Monad - IO class  Monad m  where     (>>=)   :: m a -> (a -> m b) -> m b     (>>)    :: m a -> m b -> m b     return  :: a -> m a     fail    :: String -> m a   

Слайд 6





Компоновка  >>=

Метод (>>=) - это оператор последовательной компоновки (sequentially composition). Иногда его ещё называют оператором связывания (bind): 
он связывает два IO-действия воедино, извлекая результат, возвращённый левым действием, и передавая его в качестве аргумента правому действию
(>>=)  :: IO a -> (a -> IO b) -> IO b 
Первый аргумент - это IO-действие, которое, выполнив свою работу, вернёт значение некоторого типа a. Второй аргумент - это функция, принимающая значение типа a в качестве аргумента и возвращающая IO-действие, которое, выполнив свою работу, вернёт значение некоторого типа b.
Описание слайда:
Компоновка >>= Метод (>>=) - это оператор последовательной компоновки (sequentially composition). Иногда его ещё называют оператором связывания (bind): он связывает два IO-действия воедино, извлекая результат, возвращённый левым действием, и передавая его в качестве аргумента правому действию (>>=)  :: IO a -> (a -> IO b) -> IO b Первый аргумент - это IO-действие, которое, выполнив свою работу, вернёт значение некоторого типа a. Второй аргумент - это функция, принимающая значение типа a в качестве аргумента и возвращающая IO-действие, которое, выполнив свою работу, вернёт значение некоторого типа b.

Слайд 7





пример
main :: IO ()
main = do
    text <- getLine
    putStrLn $ "You said ‘ " ++ text ++ " ‘ "
Описание слайда:
пример main :: IO () main = do text <- getLine putStrLn $ "You said ‘ " ++ text ++ " ‘ "

Слайд 8





Затем >>
Монадический оператор >> - это оператор “затем” (then). Это простейший случай связывания: действия связываются без извлечения значений.
Описание слайда:
Затем >> Монадический оператор >> - это оператор “затем” (then). Это простейший случай связывания: действия связываются без извлечения значений.

Слайд 9





return

obtainTextFromUser :: IO String
obtainTextFromUser = do
    putStrLn "Enter your text, please: "
    firstText <- getLine
    return $ "'" ++ firstText ++ "'
Функция getLine вернёт нам монаду, из которой оператор компоновки вытащит введённую пользователем строку. Эта строка поступит на вход λ-функции, которая в свою очередь создаст новую строку на основе строки, введённой пользователем, после чего - !!! - функция return вернёт эту новоиспечённую строку обратно в IO-монаду. Вытащили значение из монады, что-то с ним сделали, а потом вернули в монаду.
Описание слайда:
return obtainTextFromUser :: IO String obtainTextFromUser = do putStrLn "Enter your text, please: " firstText <- getLine return $ "'" ++ firstText ++ "' Функция getLine вернёт нам монаду, из которой оператор компоновки вытащит введённую пользователем строку. Эта строка поступит на вход λ-функции, которая в свою очередь создаст новую строку на основе строки, введённой пользователем, после чего - !!! - функция return вернёт эту новоиспечённую строку обратно в IO-монаду. Вытащили значение из монады, что-то с ним сделали, а потом вернули в монаду.

Слайд 10





Пример IO в do нотации:
Пример IO в do нотации:
    main = do 
              putStrLn "Hello, what is your name?"
              name <- getLine
              putStrLn ("Hello " ++ name ++ "!")
или, в терминах bind, использование специальной формы:
    main = putStrLn "Hello, what is your name?" >>
           getLine >>= \name ->
           putStrLn ("Hello " ++ name ++ "!")
или, очень примитивно, без специальной формы для bind:
    main = putStrLn "Hello, what is your name?" >>= \x ->
           getLine >>= \name ->
           putStrLn ("Hello " ++ name ++ "!")
Описание слайда:
Пример IO в do нотации: Пример IO в do нотации: main = do putStrLn "Hello, what is your name?" name <- getLine putStrLn ("Hello " ++ name ++ "!") или, в терминах bind, использование специальной формы: main = putStrLn "Hello, what is your name?" >> getLine >>= \name -> putStrLn ("Hello " ++ name ++ "!") или, очень примитивно, без специальной формы для bind: main = putStrLn "Hello, what is your name?" >>= \x -> getLine >>= \name -> putStrLn ("Hello " ++ name ++ "!")

Слайд 11





Функции вывода

       putChar  :: Char -> IO ()
  putStr   :: String -> IO ()
  putStrLn :: String -> IO () --добавляет символ новой строки
  print    :: Show a => a -> IO ()
Описание слайда:
Функции вывода  putChar  :: Char -> IO ()   putStr   :: String -> IO ()   putStrLn :: String -> IO () --добавляет символ новой строки print    :: Show a => a -> IO ()

Слайд 12





Исполняемый файл
main = putStrLn "hello, world"  
Сохраняем в  файле Helloword.hs и компилируем
В текущей директории
ghc --make helloworld.hs  
Появились объектный и интерфейсный файлы
Запускаем Exe
Описание слайда:
Исполняемый файл main = putStrLn "hello, world"   Сохраняем в файле Helloword.hs и компилируем В текущей директории ghc --make helloworld.hs   Появились объектный и интерфейсный файлы Запускаем Exe

Слайд 13





Функции ввода

  getChar     :: IO Char      -- читаем символ
  getLine     :: IO String     -- читаем строку 
  getContents :: IO String  -- Считывание всего ввода
  interact    :: (String -> String) -> IO ()
  readIO      :: Read a => String -> IO a
  readLn      :: Read a => IO a
Описание слайда:
Функции ввода getChar     :: IO Char -- читаем символ   getLine     :: IO String -- читаем строку   getContents :: IO String -- Считывание всего ввода   interact    :: (String -> String) -> IO ()   readIO      :: Read a => String -> IO a   readLn      :: Read a => IO a

Слайд 14





getLine
main = do  
    putStrLn "Hello, what's your name?"  
    name <- getLine  
    putStrLn ("Hello" ++ name ++  ": ) ! ")  
Описание слайда:
getLine main = do       putStrLn "Hello, what's your name?"       name <- getLine       putStrLn ("Hello" ++ name ++  ": ) ! ")  

Слайд 15





getLine
import Data.Char  
  
main = do  
    putStrLn "What's your first name?"  
    firstName <- getLine  
    putStrLn "What's your last name?"  
    lastName <- getLine  
    let bigFirstName = map toUpper firstName  
        bigLastName = map toUpper lastName  
    putStrLn $ "hey " ++ bigFirstName ++ " " ++ bigLastName ++ ", how are you?"  
Описание слайда:
getLine import Data.Char      main = do       putStrLn "What's your first name?"       firstName <- getLine       putStrLn "What's your last name?"       lastName <- getLine       let bigFirstName = map toUpper firstName           bigLastName = map toUpper lastName       putStrLn $ "hey " ++ bigFirstName ++ " " ++ bigLastName ++ ", how are you?"  

Слайд 16





программа считывает и 
суммирует два числа типа Integer 
import System.IO
main = do
         hSetBuffering stdout NoBuffering            
         putStr   "Введите новое целое число: "        
         x1 <- readNum 
         putStr   "Введите другое целое число: "          
         x2 <- readNum                          
         putStr  ("Их сумма равна " ++ show (x1+x2) ++ "\n")
       where readNum :: IO Integer
-- Указание сигнатуры типа позволяет избежать 
-- исправления типов x1,x2 правилом по умолчанию 
             readNum = readLn
Описание слайда:
программа считывает и суммирует два числа типа Integer import System.IO main = do hSetBuffering stdout NoBuffering putStr "Введите новое целое число: " x1 <- readNum putStr "Введите другое целое число: " x2 <- readNum putStr ("Их сумма равна " ++ show (x1+x2) ++ "\n") where readNum :: IO Integer -- Указание сигнатуры типа позволяет избежать -- исправления типов x1,x2 правилом по умолчанию readNum = readLn

Слайд 17





getChar
Программа принимает три символа с клавиатуры и  выводит их в обратном порядке:
import Control.Applicative
f :: Char -> Char -> Char -> String
f a b c = reverse $ [a,b,c]
main :: IO ()
main = print =<< f <$> getChar <*> getChar <*> getChar
Описание слайда:
getChar Программа принимает три символа с клавиатуры и выводит их в обратном порядке: import Control.Applicative f :: Char -> Char -> Char -> String f a b c = reverse $ [a,b,c] main :: IO () main = print =<< f <$> getChar <*> getChar <*> getChar

Слайд 18





Файлы

  type FilePath =  String
  
  writeFile  :: FilePath -> String -> IO ()
  appendFile :: FilePath -> String -> IO ()
  readFile   :: FilePath    -> IO String
Описание слайда:
Файлы   type FilePath =  String      writeFile  :: FilePath -> String -> IO ()   appendFile :: FilePath -> String -> IO ()   readFile   :: FilePath    -> IO String

Слайд 19





readFile

readFile
readFile :: FilePath -> IO String
import System.IO  
  
main = do  
    contents <- readFile “test.txt"  
    putStr contents  
Описание слайда:
readFile readFile readFile :: FilePath -> IO String import System.IO      main = do       contents <- readFile “test.txt"       putStr contents  

Слайд 20





writeFile
writeFile :: FilePath -> String -> IO ()
import System.IO     
import Data.Char  
    
main = do     
    contents <- readFile “file.in"     
    writeFile “file.out" (map toUpper contents)
Описание слайда:
writeFile writeFile :: FilePath -> String -> IO () import System.IO      import Data.Char        main = do          contents <- readFile “file.in"          writeFile “file.out" (map toUpper contents)

Слайд 21





Добавление данных в файл appendFile
import System.IO     
    
main = do     
    todoItem <- getLine  
    appendFile "todo.txt" (todoItem ++ "\n") 
Описание слайда:
Добавление данных в файл appendFile import System.IO           main = do          todoItem <- getLine       appendFile "todo.txt" (todoItem ++ "\n") 

Слайд 22





openFile
import System.IO  
  
main = do  
    handle <- openFile  "test.txt" ReadMode  
    contents <- hGetContents handle  
    putStr contents  
    hClose handle  
Описание слайда:
openFile import System.IO      main = do       handle <- openFile  "test.txt" ReadMode       contents <- hGetContents handle       putStr contents       hClose handle  

Слайд 23





  

data IOMode = ReadMode | WriteMode | AppendMode | ReadWriteMode  
withFile :: FilePath -> IOMode -> (Handle -> IO a) -> IO a.
import System.IO     
    
main = do     
    withFile “test.txt" ReadMode (\handle -> do  
        contents <- hGetContents handle     
        putStr contents)  
Описание слайда:
   data IOMode = ReadMode | WriteMode | AppendMode | ReadWriteMode   withFile :: FilePath -> IOMode -> (Handle -> IO a) -> IO a. import System.IO           main = do          withFile “test.txt" ReadMode (\handle -> do           contents <- hGetContents handle              putStr contents)  

Слайд 24






withFile' :: FilePath -> IOMode -> (Handle -> IO a) -> IO a  
withFile' path mode f = do  
    handle <- openFile path mode   
    result <- f handle  
    hClose handle  
    return result
Описание слайда:
withFile' :: FilePath -> IOMode -> (Handle -> IO a) -> IO a   withFile' path mode f = do       handle <- openFile path mode        result <- f handle       hClose handle       return result

Слайд 25





Аргументы командной строки
getArgs :: IO [String]
import System.Environment   
import Data.List  
  
main = do  
   args <- getArgs  
   progName <- getProgName  
   putStrLn "The arguments are:"  
   mapM putStrLn args  
   putStrLn "The program name is:"  
   putStrLn progName  
Описание слайда:
Аргументы командной строки getArgs :: IO [String] import System.Environment    import Data.List      main = do      args <- getArgs      progName <- getProgName      putStrLn "The arguments are:"      mapM putStrLn args      putStrLn "The program name is:"      putStrLn progName  

Слайд 26





Основные подходы
Описание слайда:
Основные подходы

Слайд 27





Простой ввод-вывод
import System.IO     
import Data.Char
main :: IO ()
main = do
 contents <- readFile "file.in"
   writeFile "file.out" (operate contents)
operate :: String -> String
operate = ... -- ваша функция
Описание слайда:
Простой ввод-вывод import System.IO      import Data.Char main :: IO () main = do contents <- readFile "file.in" writeFile "file.out" (operate contents) operate :: String -> String operate = ... -- ваша функция

Слайд 28





Список действий

Если шаблон, описанный в предыдущем разделе, недостаточен для ваших задач, то следующим шагом будет использование списка действий. Функцию main можно написать так:
main :: IO () 
main = do 
     x1 <- expr1 
     x2 <- expr2 ... 
     xN <- exprN 
     return ()
Описание слайда:
Список действий Если шаблон, описанный в предыдущем разделе, недостаточен для ваших задач, то следующим шагом будет использование списка действий. Функцию main можно написать так: main :: IO () main = do x1 <- expr1 x2 <- expr2 ... xN <- exprN return ()

Слайд 29





Копирование файлов
import System.IO
import Data.Char ( toUpper )
import System.Environment   
main = do 
         [f1,f2] <- getArgs
         h1 <- openFile f1 ReadMode     
         h2 <- openFile f2 WriteMode 
         copyFile h1 h2            
         hClose h1                  
         hClose h2
copyFile h1 h2 = do
                   eof <- hIsEOF h1
                   if eof then return () else
                      do
                        c <- hGetChar h1
                        hPutChar h2 (toUpper c)   
                        copyFile h1 h2
Описание слайда:
Копирование файлов import System.IO import Data.Char ( toUpper ) import System.Environment main = do [f1,f2] <- getArgs h1 <- openFile f1 ReadMode h2 <- openFile f2 WriteMode copyFile h1 h2 hClose h1 hClose h2 copyFile h1 h2 = do eof <- hIsEOF h1 if eof then return () else do c <- hGetChar h1 hPutChar h2 (toUpper c) copyFile h1 h2

Слайд 30





import System.IO  
import System.IO  
import System.Directory  
import Data.List  
  
main = do        
    handle <- openFile "todo.txt" ReadMode  
    (tempName, tempHandle) <- openTempFile "." "temp"  
    contents <- hGetContents handle  
    let todoTasks = lines contents     
        numberedTasks = zipWith (\n line -> show n ++ " - " ++ line) [0..] todoTasks     
    putStrLn "These are your TO-DO items:"  
    putStr $ unlines numberedTasks  
    putStrLn "Which one do you want to delete?"     
    numberString <- getLine     
    let number = read numberString     
        newTodoItems = delete (todoTasks !! number) todoTasks     
    hPutStr tempHandle $ unlines newTodoItems  
    hClose handle  
    hClose tempHandle  
    removeFile "todo.txt"  
    renameFile tempName "todo.txt" 
Описание слайда:
import System.IO   import System.IO   import System.Directory   import Data.List      main = do             handle <- openFile "todo.txt" ReadMode       (tempName, tempHandle) <- openTempFile "." "temp"       contents <- hGetContents handle       let todoTasks = lines contents              numberedTasks = zipWith (\n line -> show n ++ " - " ++ line) [0..] todoTasks          putStrLn "These are your TO-DO items:"       putStr $ unlines numberedTasks       putStrLn "Which one do you want to delete?"          numberString <- getLine          let number = read numberString              newTodoItems = delete (todoTasks !! number) todoTasks          hPutStr tempHandle $ unlines newTodoItems       hClose handle       hClose tempHandle       removeFile "todo.txt"       renameFile tempName "todo.txt" 

Слайд 31





View , Add , Remove
import System.Environment   
import System.Directory  
import System.IO  
import Data.List  
  
dispatch :: [(String, [String] -> IO ())]  
dispatch =  [ ("add", add)  
            , ("view", view)  
            , ("remove", remove)  
            ]  
main = do      (command:args) <  getArgs 
         let (Just action) = lookup command dispatch      
action args 
Описание слайда:
View , Add , Remove import System.Environment    import System.Directory   import System.IO   import Data.List      dispatch :: [(String, [String] -> IO ())]   dispatch =  [ ("add", add)               , ("view", view)               , ("remove", remove)               ]   main = do      (command:args) <  getArgs      let (Just action) = lookup command dispatch       action args 

Слайд 32





View , Add , Remove
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  
Описание слайда:
View , Add , Remove 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  

Слайд 33





View , Add , Remove 
remove :: [String] -> IO ()  
remove [fileName, numberString] = do  
    handle <- openFile fileName ReadMode  
    (tempName, tempHandle) <- openTempFile "." "temp"  
    contents <- hGetContents handle  
    let number = read numberString  
        todoTasks = lines contents  
        newTodoItems = delete (todoTasks !! number) todoTasks  
    hPutStr tempHandle $ unlines newTodoItems  
    hClose handle  
    hClose tempHandle  
    removeFile fileName  
    renameFile tempName fileName  
Описание слайда:
View , Add , Remove remove :: [String] -> IO ()   remove [fileName, numberString] = do       handle <- openFile fileName ReadMode       (tempName, tempHandle) <- openTempFile "." "temp"       contents <- hGetContents handle       let number = read numberString           todoTasks = lines contents           newTodoItems = delete (todoTasks !! number) todoTasks       hPutStr tempHandle $ unlines newTodoItems       hClose handle       hClose tempHandle       removeFile fileName       renameFile tempName fileName  

Слайд 34





import System.Environment   
import System.Environment   
import System.Directory  
import System.IO  
import Data.List  
  
dispatch :: [(String, [String] -> IO ())]  
dispatch =  [ ("add", add)  
            , ("view", view)  
            , ("remove", remove)  
            ]  
   
main = do  
    (command:args) <- getArgs  
    let (Just action) = lookup command dispatch  
    action args  
  
add :: [String] -> IO ()  
add [fileName, todoItem] = appendFile fileName (todoItem ++ "\n")  
  
Описание слайда:
import System.Environment    import System.Environment    import System.Directory   import System.IO   import Data.List      dispatch :: [(String, [String] -> IO ())]   dispatch =  [ ("add", add)               , ("view", view)               , ("remove", remove)               ]       main = do       (command:args) <- getArgs       let (Just action) = lookup command dispatch       action args      add :: [String] -> IO ()   add [fileName, todoItem] = appendFile fileName (todoItem ++ "\n")     

Слайд 35





$ ./todo view todo.txt  
$ ./todo view todo.txt  
0 - Iron the dishes  
1 - Dust the dog  
2 - Take salad out of the oven  
  
$ ./todo add todo.txt "Pick up children from drycleaners"  
  
$ ./todo view todo.txt  
0 - Iron the dishes  
1 - Dust the dog  
2 - Take salad out of the oven  
3 - Pick up children from drycleaners  
  
$ ./todo remove todo.txt 2  
  
$ ./todo view todo.txt  
0 - Iron the dishes  
1 - Dust the dog  
2 - Pick up children from drycleaners  
Описание слайда:
$ ./todo view todo.txt   $ ./todo view todo.txt   0 - Iron the dishes   1 - Dust the dog   2 - Take salad out of the oven      $ ./todo add todo.txt "Pick up children from drycleaners"      $ ./todo view todo.txt   0 - Iron the dishes   1 - Dust the dog   2 - Take salad out of the oven   3 - Pick up children from drycleaners      $ ./todo remove todo.txt 2      $ ./todo view todo.txt   0 - Iron the dishes   1 - Dust the dog   2 - Pick up children from drycleaners  

Слайд 36





 Обработка исключений в монаде 
ввода - вывода

 Монада ввода - вывода включает простую систему обработки исключений. Любая операция ввода - вывода может вызвать исключение вместо возвращения результата.
Исключения в монаде ввода - вывода представлены значениями типа IOError. Это абстрактный тип: его конструкторы скрыты от пользователя. Библиотека IO определяет функции, которые конструируют и изучают значения IOError . Единственной функцией Prelude, которая создает значение IOError, является userError. Пользовательские значения ошибок включают строку с описанием ошибки.
  userError :: String -> IOError
Исключения вызываются и отлавливаются с помощью следующих функций:
  ioError :: IOError -> IO a
  catch   :: IO a    -> (IOError -> IO a) -> IO a 
Функция ioError вызывает исключение; функция catch устанавливает обработчик, который получает любое исключение, вызванное действием, защищенным catch. Исключение отлавливается самым последним обработчиком, установленным catch. Эти обработчики не действуют выборочно: они отлавливают все исключения. Распространение исключения нужно явно обеспечить в обработчике путем повторного вызова любого нежелательного исключения. Например, в
f = catch g (\e -> if IO.isEOFError e then return [] else ioError e)
функция f возвращает [], когда в g возникает исключение конца файла, иначе исключение передается следующему внешнему обработчику. Функция isEOFError является частью библиотеки IO.
Когда исключение передается за пределы главной программы, система Haskell выводит связанное с ним значение IOError и выходит из программы.
Метод fail экземпляра IO класса Monad вызывает userError так:
  instance Monad IO where 
    ...bindings for return, (>>=), (>>)
    fail s = ioError (userError s)
Описание слайда:
 Обработка исключений в монаде ввода - вывода Монада ввода - вывода включает простую систему обработки исключений. Любая операция ввода - вывода может вызвать исключение вместо возвращения результата. Исключения в монаде ввода - вывода представлены значениями типа IOError. Это абстрактный тип: его конструкторы скрыты от пользователя. Библиотека IO определяет функции, которые конструируют и изучают значения IOError . Единственной функцией Prelude, которая создает значение IOError, является userError. Пользовательские значения ошибок включают строку с описанием ошибки. userError :: String -> IOError Исключения вызываются и отлавливаются с помощью следующих функций: ioError :: IOError -> IO a catch :: IO a -> (IOError -> IO a) -> IO a Функция ioError вызывает исключение; функция catch устанавливает обработчик, который получает любое исключение, вызванное действием, защищенным catch. Исключение отлавливается самым последним обработчиком, установленным catch. Эти обработчики не действуют выборочно: они отлавливают все исключения. Распространение исключения нужно явно обеспечить в обработчике путем повторного вызова любого нежелательного исключения. Например, в f = catch g (\e -> if IO.isEOFError e then return [] else ioError e) функция f возвращает [], когда в g возникает исключение конца файла, иначе исключение передается следующему внешнему обработчику. Функция isEOFError является частью библиотеки IO. Когда исключение передается за пределы главной программы, система Haskell выводит связанное с ним значение IOError и выходит из программы. Метод fail экземпляра IO класса Monad вызывает userError так: instance Monad IO where ...bindings for return, (>>=), (>>) fail s = ioError (userError s)

Слайд 37





Ошибки ввода - вывода
 Ошибки типа IOError используются монадой ввода - вывода. Это абстрактный тип; библиотека обеспечивает функции для опроса и конструирования значений в IOError:
    isAlreadyExistsError --- операция завершилась неуспешно, потому что один из ее аргументов уже существует.
    isDoesNotExistError --- операция завершилась неуспешно, потому что один из ее аргументов не существует.
    isAlreadyInUseError --- операция завершилась неуспешно, потому что один из ее аргументов является однопользовательским ресурсом, который уже используется (например, открытие одного и того же файла дважды для записи может вызвать эту ошибку).
    isFullError --- операция завершилась неуспешно, потому что устройство заполнено.
    isEOFError --- операция завершилась неуспешно, потому что был достигнут конец файла.
    isIllegalOperation --- операция невозможна.
    isPermissionError --- операция завершилась неуспешно, потому что пользователь не имеет достаточно привилегий операционной системы на выполнение этой операции.
    isUserError --- определенное программистом значение ошибки вызвано использованием fail.
Описание слайда:
Ошибки ввода - вывода Ошибки типа IOError используются монадой ввода - вывода. Это абстрактный тип; библиотека обеспечивает функции для опроса и конструирования значений в IOError: isAlreadyExistsError --- операция завершилась неуспешно, потому что один из ее аргументов уже существует. isDoesNotExistError --- операция завершилась неуспешно, потому что один из ее аргументов не существует. isAlreadyInUseError --- операция завершилась неуспешно, потому что один из ее аргументов является однопользовательским ресурсом, который уже используется (например, открытие одного и того же файла дважды для записи может вызвать эту ошибку). isFullError --- операция завершилась неуспешно, потому что устройство заполнено. isEOFError --- операция завершилась неуспешно, потому что был достигнут конец файла. isIllegalOperation --- операция невозможна. isPermissionError --- операция завершилась неуспешно, потому что пользователь не имеет достаточно привилегий операционной системы на выполнение этой операции. isUserError --- определенное программистом значение ошибки вызвано использованием fail.

Слайд 38





Ошибки ввода - вывода
Все эти функции возвращают значение типа Bool, которое равно True, если ее аргументом является соответствующий вид ошибки, и False иначе.
Любая функция, которая возвращает результат IO, может завершиться с ошибкой isIllegalOperation. Дополнительные ошибки, которые могут быть вызваны реализацией, перечислены после соответствующей операции. В некоторых случаях реализация не способна различить возможные причины ошибки. В этом случае она должна вернуть isIllegalOperation.
Имеются три дополнительные функции для того, чтобы получить информацию о значении ошибки, --- это ioeGetHandle, которая возвращает Just hdl, если значение ошибки относится к дескриптору hdl, и Nothing иначе; ioeGetFileName, которая возвращает Just имя, если значение ошибки относится к файлу имя, и Nothing иначе; и ioeGetErrorString, которая возвращает строку. Для "пользовательских" ошибок (которые вызваны использованием fail), строка, возвращенная ioeGetErrorString, является аргументом, который был передан в fail; для всех остальных ошибок строка зависит от реализации.
Функция try возвращает ошибку в вычислении, явно использующем тип Either .
Функция bracket охватывает обычный способ выделения памяти, вычисления и освобождения памяти, в котором шаг освобождения должен произойти даже в случае ошибки во время вычисления. Это аналогично try-catch-finally в Java.
Описание слайда:
Ошибки ввода - вывода Все эти функции возвращают значение типа Bool, которое равно True, если ее аргументом является соответствующий вид ошибки, и False иначе. Любая функция, которая возвращает результат IO, может завершиться с ошибкой isIllegalOperation. Дополнительные ошибки, которые могут быть вызваны реализацией, перечислены после соответствующей операции. В некоторых случаях реализация не способна различить возможные причины ошибки. В этом случае она должна вернуть isIllegalOperation. Имеются три дополнительные функции для того, чтобы получить информацию о значении ошибки, --- это ioeGetHandle, которая возвращает Just hdl, если значение ошибки относится к дескриптору hdl, и Nothing иначе; ioeGetFileName, которая возвращает Just имя, если значение ошибки относится к файлу имя, и Nothing иначе; и ioeGetErrorString, которая возвращает строку. Для "пользовательских" ошибок (которые вызваны использованием fail), строка, возвращенная ioeGetErrorString, является аргументом, который был передан в fail; для всех остальных ошибок строка зависит от реализации. Функция try возвращает ошибку в вычислении, явно использующем тип Either . Функция bracket охватывает обычный способ выделения памяти, вычисления и освобождения памяти, в котором шаг освобождения должен произойти даже в случае ошибки во время вычисления. Это аналогично try-catch-finally в Java.

Слайд 39





Обработка ошибок
  import System.Environment  
    import System.IO  
    import System.Directory  
      
    main = do (fileName:_) <- getArgs  
              fileExists <- doesFileExist fileName  
              if fileExists  
                  then do contents <- readFile fileName  
                          putStrLn $ "The file has " ++ show (length (lines contents)) ++ " lines!"  
                  else do putStrLn "The file doesn't exist!"
Описание слайда:
Обработка ошибок import System.Environment import System.IO import System.Directory main = do (fileName:_) <- getArgs fileExists <- doesFileExist fileName if fileExists then do contents <- readFile fileName putStrLn $ "The file has " ++ show (length (lines contents)) ++ " lines!" else do putStrLn "The file doesn't exist!"

Слайд 40





 import System.Random  
 import System.Random  
    import Control.Monad(when)  
      
    main = do  
        gen <- getStdGen  
        askForNumber gen  
      
    askForNumber :: StdGen -> IO ()  
    askForNumber gen = do  
        let (randNumber, newGen) = randomR (1,10) gen :: (Int, StdGen)  
        putStr "Which number in the range from 1 to 10 am I thinking of? "  
        numberString <- getLine  
        when (not $ null numberString) $ do  
            let number = read numberString  
            if randNumber == number   
                then putStrLn "You are correct!"  
                else putStrLn $ "Sorry, it was " ++ show randNumber  
            askForNumber newGen
Описание слайда:
import System.Random import System.Random import Control.Monad(when) main = do gen <- getStdGen askForNumber gen askForNumber :: StdGen -> IO () askForNumber gen = do let (randNumber, newGen) = randomR (1,10) gen :: (Int, StdGen) putStr "Which number in the range from 1 to 10 am I thinking of? " numberString <- getLine when (not $ null numberString) $ do let number = read numberString if randNumber == number then putStrLn "You are correct!" else putStrLn $ "Sorry, it was " ++ show randNumber askForNumber newGen

Слайд 41





Дополнительная литература
http://eax.me/monads/    О монадах 
http://habrahabr.ru/post/80396/ Объяснение ввода-вывода в Haskell без монад 
http://ru-lambda.livejournal.com/12467.html
http://channel9.msdn.com/Series/C9-Lectures-Erik-Meijer-Functional-Programming-Fundamentals/C9-Lectures-Dr-Erik-Meijer-Functional-Programming-Fundamentals-Chapter-7-of-13
http://haskell.ru/io.html
https://wiki.haskell.org/Ru/IO_Inside  Система ввода/вывода
Описание слайда:
Дополнительная литература http://eax.me/monads/ О монадах http://habrahabr.ru/post/80396/ Объяснение ввода-вывода в Haskell без монад http://ru-lambda.livejournal.com/12467.html http://channel9.msdn.com/Series/C9-Lectures-Erik-Meijer-Functional-Programming-Fundamentals/C9-Lectures-Dr-Erik-Meijer-Functional-Programming-Fundamentals-Chapter-7-of-13 http://haskell.ru/io.html https://wiki.haskell.org/Ru/IO_Inside Система ввода/вывода



Похожие презентации
Mypresentation.ru
Загрузить презентацию