46735 (Адресная книжка на Haskell)

2016-07-30СтудИзба

Описание файла

Документ из архива "Адресная книжка на Haskell", который расположен в категории "". Всё это находится в предмете "информатика" из 1 семестр, которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "курсовые/домашние работы", в предмете "информатика, программирование" в общих файлах.

Онлайн просмотр документа "46735"

Текст из документа "46735"

Федеральное министерство по образованию РФ

Владимирский Государственный Университет

Кафедра ФиПМ

ОТЧЕТ

По курсовому проекту

По дисциплине

«Функциональное программирование»

Выполнил: Николаева А. М.

Принял: Медведева О.Н.

Владимир 2009

Содержание

1. Постановка задачи. Исходные данные

2. Теоретическая часть

2.1 Основы HTML

2.1.1 Структура программы на HTML

2.1.2 Основные Теги

2.1.3 Тег для создания ссылки на почтовый ящик

2.2 Выражения в Haskell

2.2.1 Кортежи

2.2.2 Списки

2.2.3 Do – выражение

2.3 Монада ввода/вывода

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

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

2.3.3 Обработка исключений

2.3.4 Файлы, каналы и обработчики

2.4 GUI

2.4.1 wxWidgets

2.4.2 wxHaskell

3. Анализ задачи

4. Программная реализация

5. Тестирование программы

Заключение

Список использованной литературы

1. Постановка задачи. Исходные данные

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

Исходные данные:

Файл icq.txt, содержащий e-mail адреса и номера ICQ.

Файл e-mail.txt, содержащий ИОФ и e-mail.

Где поле ICQ является необязательным, а поле ИОФ может не содержать 1 или 2 составляющих аббревиатуры. Поле e-mail является обязательным для обоих файлов, так как по нему осуществляется поиск.

Содержимое и формат исходных файлов:

Файл вывода с расширением *.html или *.htm или *.mht может быть как существующим на диске или создаваемым пользователем.

2. Теоретическая часть

2.1 Основы HTML

2.1.1 Структура программы на HTML

Структура HTML-документа определяется упорядоченным набором тегов следующего вида:

Программа клиент-браузер при просмотре файлов с этими тегами выполняет отображение документа в окне. Каждый такой файл имеет расширение html или htm, а набрать его можно в любом текстовом редакторе. Теги играют роль команд заставляют браузер выполнить предписываемые ими действия. Область действия тега определяется тем местом, где он указан, и тем местом, где он закрыт (записан в угловых скобках с предшествующей косой чертой).

2.1.2 Основные Теги

Тег HTML указывает начало и конец HTML документа.

Тег HEAD (заголовок HTML-документа) содержит информацию, относящуюся к документу в целом.

Тег BODY охватывает ту часть HTML-документа (текст, изображения и элементы формирования), которая будет видна пользователю.

Тег TITLE устанавливает заголовок HTML-документа, выводимый в строке заголовка окна броузера.

Атрибут BGCOLOR устанавливает цвет фона HTML-документа. Цвет может быть указан с помощью с помощью названия или шестнадцатиричного кода.

Атрибут TEXT устанавливает цвет для всего текста HTML-документа. Цвет может быть указан с помощью с помощью названия или шестнадцатиричного кода.

Атрибут SIZE тега FONT устанавливает относительный размер шрифта. Список возможных значений состоит из положительных и отрицательных чисел от 0 до 7.

Атрибут COLOR тега FONT устанавливает цвет текста. Цвет может быть указан с помощью с помощью названия или шестнадцатиричного кода.

Тег TABLE устанавливает начало и конец таблицы. Все теги, определяющие структуру таблицы, должны располагаться между тегами TABLE.

Тег TR определяет строку таблицы.

Тег TD определяет колонку таблицы. Текст, заключенный между тегами TD ("table data" - табличные данные), отображается внутри одной ячейки.

Тег TH устанавливает режим отображения текста в виде заголовка таблицы.

Атрибут BORDER тега TABLE устанавливает ширину рамки таблицы в пикселах.

or

Атрибут ALIGN устанавливает выравнивание содержимого ячейки по ее левому краю (LEFT), по центру (CENTER) или по ее правому краю (RIGHT).

2.1.3 Тег для создания ссылки на почтовый ящик

Тег A устанавливает связь с некоторой точкой внутри того же HTML-документа или с другим URL (гипертествовая ссылка). Атрибут HREF тега A описывает объект, представляющий собой текст или рисунок внутри HTML-документа, либо текст или рисунок во внешнем документе.

Тег A устанавливает связь с некоторой точкой внутри того же HTML-документа или с другим URL (гипертествовая ссылка). Атрибут NAME тега A описывает точку внутри HTML-документа, в которую нужно переместить пользователя.

Поставить ссылку на чей-то адрес электронной почты не составляет труда. Мы просто пишем:

Спамте меня, ребята!

2.2 Выражения в Haskell

2.2.1 Кортежи

Кортежи записываются в виде (e1 , . . . , ek) и могут быть произвольной длины

k >= 2 . Конструктор для кортежа размером n обозначается (,...,), где n − 1 запятых.

Таким образом, (a,b,c) и (,,) a b c обозначают одно и то же значение. Стандартные операции над кортежами описаны в Prelude.

Трансляция: (e1 , . . . , ek) для k >= 2 является экземпляром кортежа размера

k, в соответствии с определением в Prelude и не требуют трансляции. Если t1 , ...

, tk – соответствующие типы e1 , ... , ek , то типом кортежа будет (t1 , . . . , tk).

2.2.2 Списки

Списки записываются в виде [e1, ..., ek], где k>=1. Конструктором списка является :, пустой список обозначается []. Стандартные операции над списками описаны в Prelude:

Функция head возвращает первый элемент списка.

Функция last возвращает последний элемент списка.

Функция tail возвращает список без первого элемента

Функция init возвращает список без последнего элемента

Функция null проверяет список на пустоту. Если в качестве аргумента этой опера-ции будет задан пустой список, то функция выдаст значение True, в противном случае - False

Функция length возвращает длину списка.

Функция elem проверяет наличие элемента в списке.

Функция take возвращает список, состоящий из n первых элементов исходного списка.

Функция zip возвращает список, состоящий из пар объединенных исходных списков.

Функция !! возвращает элемент, номер которого задан (начиная с 0).

Функции head и tail определены для непустых списков. При попытке применить их к пустому списку интерпретатор сообщает об ошибке.

2.2.3 Do – выражение

exp -> do { stmts } (do-выражение)

stmts -> stmt1 ... stmtn exp [;] (n>=0)

stmt -> exp ;

| pat <- exp ;

| let decls ;

| ; (пустая инструкция)

Перевод:

выражение -> do { список-инструкций } (do-выражение)

список-инструкций -> инструкция1 ... инструкцияn выражение [;] (n>=0)

инструкция -> выражение ;

| образец <- выражение ;

| let список-объявлений ;

| ; (пустая инструкция)

Do-выражения предоставляют более удобный синтаксис для монадического программирования. Оно позволяет записать такое выражение

putStr "x: " >>

getLine >>= \l ->

return (words l)

в более традиционном виде:

do putStr "x: "

l <- getLine

return (words l)

Трансляция:

Для do-выражений выполняются следующие тождества, которые, после удаления пустых stmts, можно использовать в качестве трансляции в ядро:

do {e} =e

do {e;stmts} =e >> do {stmts}

do {p <- e; stmts} =let ok p = do {stmts}

ok _ = fail "..."

in e >>= ok

do {let decls; stmts} =let decls in do {stmts}

Пропуски "..." обозначают генерируемое компилятором сообщение об ошибке, передаваемое функции fail, желательно давая некоторое указание на местоположение ошибки сопоставления с образцом; функции >>, >>= и fail являются операциями в классе Monad, определенными в Prelude; ok является новым идентификатором.

Как показано в трансляции do, переменные, связанные let, имеют полностью полиморфные типы, тогда как те переменные, которые определены с помощью <-, являются связанными лямбда-выражением и поэтому являются мономорфными.

2.3 Монада ввода/вывода

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

Эти функции считывают данные из стандартного устройства ввода (обычно это пользовательский терминал).

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 вызывает исключение при появлении признака конца файла, a предикат isEOFError, который распознает это исключение, определен в библиотеке IO. Операция getLine вызывает исключение при тех же обстоятельствах, что и hGetLine, определенная в библиотеке IO.

Операция getContents возвращает весь пользовательский ввод в виде одной строки, которая считывается лениво, по мере надобности. Функция interact принимает в качестве аргумента функцию типа String->String. Весь ввод из стандартного устройства ввода передается этой функции в качестве аргумента, а результирующая строка выводится на стандартное устройство вывода.

Обычно операция read из класса Read используется для преобразования строки в значение. Функция readIO похожа на read, за исключением того, что она предупреждает монаду ввода - вывода об ошибке разбора вместо завершения программы. Функция readLn объединяет getLine и readIO.

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

Эти функции записывают в стандартное устройство вывода (обычно это пользовательский терминал).

putChar :: Char -> IO ()

putStr :: String -> IO ()

putStrLn :: String -> IO () -- добавляет символ новой строки

print :: Show a => a -> IO ()

Функция print выводит значение любого пригодного для печати типа на стандартное устройство вывода. Пригодные для печати типы --- это те типы, которые являются экземплярами класса Show; print преобразует значения в строки для вывода, используя операцию show, и добавляет символ новой строки.

2.3.3 Обработка исключений

Что делать, если в процессе операций ввода/вывода возникла неординарная ситуация? Например, функция getChar обнаружила конец файла. В этом случае произойдет ошибка. Haskell предлагает для этих целей механизм обработки исключений. Для этого не используется какой-то специальный синтаксис, но есть специальный тип IOError, который содержит описания всех возникаемых в процессе ввода/вывода ошибок.

Обработчик исключений имеет тип (IOError -> IO a), при этом функция catch ассоциирует (связывает) обработчик исключений с набором действий:

catch:: IO a -> (IOError -> IO a) -> IO a

Аргументами этой функции являются действие (первый аргумент) и обработчик исключений (второй аргумент). Если действие выполнено успешно, то просто возвращается результат без возбуждения обработчика исключений.

Если же в процессе выполнения действия возникла ошибка, то она передается обработчику исключений в качестве операнда типа IOError, после чего выполняется сам обработчик.

2.3.4 Файлы, каналы и обработчики

Для работы с файлами Haskell предоставляет все возможности, что и другие языки программирования. Однако большинство этих возможностей определены в модуле IO, а не в Prelude, поэтому для работы с файлами необходимо явно импортировать модуль IO (import IO).

Открытие файла порождает обработчик (он имеет тип Handle). Закрытие обработчика инициирует закрытие соответствующего файла. Обработчики могут быть также ассоциированы с каналами, т.е. портами взаимодействия, которые не связаны напрямую с файлами. В Haskell'е предопределены три таких канала:

stdin (стандартный канал ввода),

stdout (стандартный канал вывода)

stderr (стандартный канал вывода сообщений об ошибках).

Таким образом, для использования файлов можно пользоваться следующими вещами:

type FilePath= String

openFile:: FilePath -> IOMode -> IO Handle

hClose:: Handle -> IO ()

data IOMode= ReadMode | WriteMode | AppendMode | ReadWriteMode

Есть одна интересная и важная функция - hGetContents, которая берёт содержимое переданного ей в качестве аргумента файла и возвращает его в качестве одной длинной строки.

Получается так, что в Haskell'е заново изобретено императивное программирование...

В некотором смысле - да. Монада IO встраивает в Haskell маленький императивный подъязык, при помощи которого можно осуществлять операции ввода/вывода. И написание программ на этом подъязыке выглядит обычно с точки зрения императивных языков. Но есть существенное различие: в Haskell'е нет специального синтаксиса для ввода в программный код императивных функций, все осуществляется на уровне функциональной парадигмы.

Функции для работы с файлами определенные в модуле Prelude

Эти функции не требуют импортировать модуль IO в программу, так как они определены в модуле Prelude.

Функции writeFile и appendFile соответственно записывают или добавляют в конец строку, свой второй аргумент, в файл, свой первый аргумент. Функция readFile считывает файл и возвращает содержимое файла в виде строки. Файл считывается лениво, по требованию, как в getContents.

type FilePath = String

Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5167
Авторов
на СтудИзбе
438
Средний доход
с одного платного файла
Обучение Подробнее