В этом задании придётся вытаскивать данные из html-страниц, преобразовывать их, фильтровать, компоновать и выводить на экран. Для того, чтобы взять себе задание, сделайте сюда pull-request с этим файлом, вписав своё имя в таблицу (она находится внизу) напротив интересующего вас пункта. Одно задание можно взять нескольким студентам.
Для выполнения это части лабораторной работы нужно понимать принцип работы монад, в частности монады IO. В лецкиях мы придём к монадам через теорию категорий и функторы с моноидами, поэтому здесь будет маленький ликбез на эту тему. Хотя, многие, судя по первой лабе, уже разобрались сами и могут его пропустить.
В Хаскелле монады изначально появились чтобы как-то вписать грязный процесс ввода-вывода в детемнированную чистоту этого функционального языка, и конструкция do является лишь синтаксическим сахаром, прячущим от вас цепочку монадических преобразований.
Любой тип, принадлежащий к классу монад описывается как-то так: m a
Посмотрите типы у выражений:
:t return
:t putStrLn "hi!"
:t Just 1
Для каждой монады определены две функции: >>= :: Monad m => m a -> (a -> m b) -> m b
и >> :: Monad m => m a -> m b -> m b
Первая передаёт некие значения из монады дальше в цепочку вычислений, возвращающей монады, вторая - нет.
Давайте посмотрим, как это работает для ввода-вывода:
putStr "hi " >> putStr "there!"
getLine >>= (\a -> print a)
Это тоже самое, если бы мы в нашей программе написали бы:
do
putStr "hi "
putStr "there!"
и
do
a <- getLine
print a
И да, блок do тоже должен возвращать какую-либо монаду. Если вы пишете чистую функцию, которую затем планируете использовать в блоке do
, то можете использовать return ()
, которая создаёт монаду из ничего.
Хорошо про монады на примере ввода-вывода в хаскелле написал Евгений Кирпичёв: http://rsdn.ru/article/funcprog/monad.xml
Кроме того, для выполнения лабы придётся разобраться с пакетным менеджером. В хаскелле он называется cabal, а само хранилище репозиториев - hackage. Поиск по пакетам - hoogle. Аналоги для других ЯП: Ruby - gems, Node.js - npm, , Python - pypi, Perl - cpan, PHP - pecl, или что там ещё придумали.
Установка cabal проста. Я подключил себе ppa hvr/ghc, настроил симлинки и работал.
Поставить любой пакет можно выполнив команду
cabal install <packet_name>
Вам, скорее всего, придётся поставить пакеты http-conduit html-conduit xml-conduit
. О них можно почитать тут, тут и тут
Кроме того, мы будем использовать стандартный модуль Data.Text, про него здесь.
Импорт модулей, отдельных функций выглядит следующим образом:
import qualified Data.Text as T -- модуль у нас будет называться просто T
import Data.Text (replace) -- если мы хотим использовать функцию replace из модуля T не как T.replace, а просто replace
Кстати, в модуле Data.Text есть практически все функции высших порядков, которые мы использовали, но для юникодных строк.
Всю остальную информацию можно узнать из шаблона программы, который собирает список преподавателей кафедры 22 и выводит их на экран.
Задание | Студент |
---|---|
По списку языков программирования википедии (http://en.wikipedia.org/wiki/List_of_programming_languages) составить список императивных, не функциональных ЯП. | Знаменок Ксения |
По списку языков программирования википедии (http://en.wikipedia.org/wiki/List_of_programming_languages) составить список кортежей: год появления, названия. Языки без указания годов появления исключить. | Сергей Горюшкин, Кузнецов Константин |
Составить отсортированный список преподавателей кафедры 22 и их хобби | |
Составить список 50 худших преподавателей (http://www.mephist.ru/mephist/prepods.nsf/teachers) Тут придётся использовать http://hackage.haskell.org/package/iconv-0.4 | |
Составить отсортированный список преподавателей (http://www.mephist.ru/mephist/prepods.nsf/teachers) по количеству изречённых перлов. Тут придётся использовать http://hackage.haskell.org/package/iconv-0.4 | Анатолий Мальцев |
Составить список преподавателей кафедры 22 и дисциплин, которые они сейчас ведут (Список брать запросом http://eis.mephi.ru/TimeTable/timetableshow.aspx?gr=&prep=%D0%A0%D1%8B%D0%B1%D0%B8%D0%BD%D0%B0&typ=prep) | Баладурин Константин |
Вопросы можно-нужно оставлять как issue для этого репозитория. Решённые задания оставляются как pull request'ы поддиректории с вашей программой.