мета-данные страницы
  •  
Загрузка не удалась. Возможно, проблемы с правами доступа?

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
Следующая версияСледующая версия справа и слева
haskell [13/03/2018 14:33] – [6.5 Работа с файлами] vlasovhaskell [03/04/2018 11:30] – [Урок 7. Знакомство с монадами] vlasov
Строка 1509: Строка 1509:
   writeFile "testUp.txt" (map toUpper file)   writeFile "testUp.txt" (map toUpper file)
 </code> </code>
-Здесь операция ''readFile'' считывает весь файл и передает его в "переменную" ''file''. Затем, с помощью "чистой функции" ''toUpper'' мы преобразуем каждый Char-символ в строке file, используя функцию map для обработки списков --- в нашем случае, напомню, строки --- это списки символов. И, наконец, результат записывает в другой файл testUp.txt.+Здесь операция ''readFile'' считывает весь файл и передает его в "переменную" ''file''. Затем, с помощью "чистой функции" ''toUpper'' мы преобразуем каждый Char-символ в строке file, используя функцию map для обработки списков --- в нашем случае, напомню, строки --- это списки символов. И, наконец, результат записывает в другой файл ''testUp.txt''.
  
 Рассмотрим это же решение, но с разбивкой на строки --- возможно, когда-нибудь нам понадобится обработка отдельных строк. Рассмотрим это же решение, но с разбивкой на строки --- возможно, когда-нибудь нам понадобится обработка отдельных строк.
Строка 1524: Строка 1524:
   writeFile "testUp.txt" (unlines up_lst)   writeFile "testUp.txt" (unlines up_lst)
 </code> </code>
-Здесь "чистая функция" transform преобразует в строках символы к верхнему регистру. "Чистая функция" lines разбивает входящую строку на список строк по признаку конца строки, а функция unlines, наоборот, получив список строк, склеивает их в одну.+Здесь "чистая функция" transform преобразует в строках символы к верхнему регистру. "Чистая функция" ''lines'' разбивает входящую строку на список строк по признаку конца строки, а функция ''unlines'', наоборот, получив список строк, склеивает их в одну.
  
-Работа с "чистыми функциями" в монадическом коде (для нас пока это означает "внутри блока do") должна осуществляться с помощью конструкции let.+Работа с "чистыми функциями" в монадическом коде (для нас пока это означает "внутри блока ''do''") должна осуществляться с помощью конструкции ''let''.
  
 **Задание к уроку.** Написать программку, которая считывая текстовой файл, оставляет только буквы, а их в свою очередь приводит в нижний регистр. (//Указание:// использовать ''filter'',  ''isAlpha'', ''isLetter'' или ''isLower'', ''toLower'', [[https://downloads.haskell.org/~ghc/latest/docs/html/libraries/base-4.10.1.0/Data-Char.html#v:LowercaseLetter|см. документацию по модулю Data.Char]]) **Задание к уроку.** Написать программку, которая считывая текстовой файл, оставляет только буквы, а их в свою очередь приводит в нижний регистр. (//Указание:// использовать ''filter'',  ''isAlpha'', ''isLetter'' или ''isLower'', ''toLower'', [[https://downloads.haskell.org/~ghc/latest/docs/html/libraries/base-4.10.1.0/Data-Char.html#v:LowercaseLetter|см. документацию по модулю Data.Char]])
Строка 1536: Строка 1536:
 Во-вторых возможен запуск на прямое исполнение командой ''<nowiki>runghc myfile.hs</nowiki>'' (если будет запуск как скрипта, то всегда можно в первой строке указать Во-вторых возможен запуск на прямое исполнение командой ''<nowiki>runghc myfile.hs</nowiki>'' (если будет запуск как скрипта, то всегда можно в первой строке указать
 <code bash>#!/usr/bin/runghc</code> <code bash>#!/usr/bin/runghc</code>
-В-третьих, компиляция в исполняемый двоичный код: ''<nowiki>ghc --make myfile.hs</nowiki>'', можно с указанием опций для оптимизации: ''<nowiki>ghc --make -O2 myfile.hs</nowiki>''. Полученный довольно объемный файл можно порой существенно ужать утилитой ''<nowiki>strip -s myfile</nowiki>''.+В-третьих, компиляция в исполняемый двоичный код: ''<nowiki>ghc --make myfile.hs</nowiki>'', можно с указанием опций для оптимизации: ''<nowiki>ghc --make -O2 myfile.hs</nowiki>''. Полученный довольно объемный файл можно порой существенно ужать утилитой ''<nowiki>strip -s myfile</nowiki>'' (флаг ''--make'' для компиляции в нашей простой ситуации совершенно необязателен, по факту, обычно это происходит автоматически).
  
 ==== 6.7 Кратко о монаде IO ==== ==== 6.7 Кратко о монаде IO ====
Строка 1544: Строка 1544:
 ===== Урок 7. Знакомство с монадами ===== ===== Урок 7. Знакомство с монадами =====
  
-Понятие монад пришло из чистой математики, из ее раздела под названием "теория категорий". И хотя полное понимание требует знакомства с математическим определением и свойствами, однако, возможно использование данного понятия в программировании, в частности, на языке Haskell исходя из объяснения необходимости монад или чего-либо подобного для чистого языка функционального программирования и исходя из примеров применения различных монад.+Понятие монад пришло из чистой математики, из ее раздела под названием "теория категорий". И хотя полное понимание требует знакомства с математическим определением и свойствами, однако, возможно использование данного понятия в программировании, в частности, на языке Haskellисходя из объяснения необходимости монад или чего-либо подобного для чистого языка функционального программирования и исходя из примеров применения различных монад.
  
 Необходимость монад в чистом функциональном программировании возникает из ограничения, вытекающего из основных преимуществ данного стиля программирования. Вот такой парадокс. Так, Haskell не имеет возможность вводить глобальные переменные и как-то манипулировать ими внутри определений функций. Преимущество такого подхода дает надежность и уверенность для программиста (и для компилятора!!) в том, что в программе не будет побочных эффектов. Обратной стороной медали при этом будет то, что мы не можем с легкостью манипулировать, например, каким-то системными переменными, конфигурационными данными и т.п. У нас остается только возможность каждый раз при вызове функции вносить все требуемые данные в качестве параметров. Это загромождает описание функций и требует накладных расходов при реализации. Необходимость монад в чистом функциональном программировании возникает из ограничения, вытекающего из основных преимуществ данного стиля программирования. Вот такой парадокс. Так, Haskell не имеет возможность вводить глобальные переменные и как-то манипулировать ими внутри определений функций. Преимущество такого подхода дает надежность и уверенность для программиста (и для компилятора!!) в том, что в программе не будет побочных эффектов. Обратной стороной медали при этом будет то, что мы не можем с легкостью манипулировать, например, каким-то системными переменными, конфигурационными данными и т.п. У нас остается только возможность каждый раз при вызове функции вносить все требуемые данные в качестве параметров. Это загромождает описание функций и требует накладных расходов при реализации.