Федеральноеминистерство по образованию РФ
ВладимирскийГосударственный Университет
Кафедра ФиПМ
ОТЧЕТ
По курсовомупроекту
По дисциплине
«Функциональноепрограммирование»
Выполнил: Николаева А. М.
Принял: Медведева О.Н.
Владимир 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.3Do – выражение
2.3 Монадаввода/вывода
2.3.1 Функцииввода
2.3.2Функции вывода
2.3.3Обработка исключений
2.3.4Файлы, каналы и обработчики
2.4 GUI
2.4.1wxWidgets
2.4.2wxHaskell
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
| let decls ;
|; (пустая инструкция)
Перевод:
выражение -> do { список-инструкций } (do-выражение)
список-инструкций -> инструкция1… инструкцияnвыражение [;] (n>=0)
инструкция -> выражение ;
| образец
| let список-объявлений ;
|; (пустая инструкция)
Do-выражения предоставляют более удобный синтаксис длямонадического программирования. Оно позволяет записать такое выражение
putStr «x: » >>
getLine >>= \l ->
return (words l)
в более традиционном виде:
do putStr «x: „
l
return (words l)
Трансляция:
Для do-выражений выполняются следующие тождества,которые, после удаления пустых stmts, можно использовать в качестве трансляциив ядро:
do {e} =e
do {e;stmts} =e >> do {stmts}
do {p
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
writeFile :: FilePath -> String ->IO ()
appendFile :: FilePath -> String-> IO ()
readFile :: FilePath -> IO String
Обратите внимание, что writeFile и appendFile записываютлитеральную строку в файл. Для того чтобы записать значение любого пригодногодля печати типа, как в print, сначала используется функция show дляпреобразования значения в строку.
main = appendFile «квадраты» (show [(x,x*x) | x
2.4 GUI
2.4.1 wxWidgets
wxWidgets (ранее известная как wxWindows) — этокросс-платформенная библиотека инструментов с открытым исходным кодом дляпостроения графического интерфейса пользователя (GUI).
wxWidgets выпущен под «разрешающей изменения (но явноодобренной OSI) LGPL». Проект был запущен в 1992 Юлианом Смартом (JulianSmart), который до сих пор остаётся главным разработчиком.
wxWidgets позволяет компилировать программы на множествекомпьютерных платформ с минимальными изменениями в исходном коде, либо вообщебез них. Она поддерживает системы Microsoft Windows, Apple Macintosh,UNIX-подобные (для X11, Motif и GTK+), OpenVMS и OS/2. Внедряемая версиянаходится в разработке.
Библиотека разработана на C++, но может подключаться комножеству других распространённых языков, таких, как Ruby (wxRuby, Anvil),Python (wxPython), Smalltalk (wxSqueak), Perl и Java.
Библиотека не имитирует вид компонентов, используяграфические примитивы различных поддерживаемых платформ. Вместо этого wxWidgetsпредоставляет тонкую абстракцию к существующим компонентам системы. Другимисловами, основной код wxWidgets предпочитает вызывать «родной» элементинтерфейса платформы, вместо того, чтобы повторно его реализовывать. Этопредоставляет быстрый, естественно выглядящий интерфейс по сравнению сбиблиотеками вроде Swing (для Java).
wxWidgets разработана не только для того, чтобы создаватьGUI. Она также имеет набор классов для работы с графическими изображениями, HTML,XML документами, архивами, файловыми системами, процессами, подсистемамипечати, мультимедиа, сетями, классы для организации многопоточности, отладки,отправки дампов и множество других инструментов.
WxWidgets — это инструмент разработчика для написаниянастольных или мобильных приложений с графическим интерфейсом (GUI). Этотфреймворк экономит много времени на написание кроссплатформенных приложений иобеспечивает их стандартное поведение.
Приложения обычно показывают пользователю окна состандартными элементами управления, изображениями и графиками; реагируют насобытия от мышки, клавиатуры и других источников; общаются с другимиприложениями, запускают другие программы — подобные стандартные блоки отходятна второй план при использовании WxWidgets, позволяя программисту сосредоточитьсвои усилия на функционале приложения.
Пока WxWidgets называют инструментарием разработкиграфических интерфейсов пользователя, он действительно им является. Однако насамом деле он не ограничивается этим — фреймворк реализует многие аспектыпрограммирования. И это не является избыточностью, т.к. от WxWidgets требуется,чтобы приложения целиком были переносимыми на разные платформы, а не только ихграфическая часть. WxWidgets предоставляет классы для файлов, потоков, многопоточности,конфигурирования приложений, межпроцессного взаимодействия, доступа к базамданных и многое другое.
Особенность, которая отличает WxWidgets от многих другихфреймворков, таких как MFC и OWL, – это многоплатформенная природа. WxWidgetsимеет API, который одинаков или почти одинаков на всех поддерживаемыхплатформах. Это означает, что вы можете написать приложение, к примеру, подWindows и затем с очень немногими (если они вообще понадобятся) изменениямиперекомпилировать его под Linux или Mac OS X. Это дает огромное преимущество посравнению с раздельным программированием под каждую платформу: вам не придетсяизучать специализированный API для каждой платформы. Кроме того, при выпускеновых версий операционных систем и версий WxWidgets уже написанные приложениявсегда будут выглядеть актуально и использовать последние графические версииэлементов управления.
Другая отличительная особенность — WxWidgets используетродные для операционной системы графические элементы интерфейса. Многиефреймворки используют собственные графические элементы управления, снабжая ихсменяемыми темами для каждой платформы. Напротив, WxWidgets использует родныеграфические элементы пользовательского интерфейса всюду где это возможно. Врезультате они не просто выглядят как родные для ОС — они на самом деле родные.Это очень важно для пользователей, привыкших работать в конкретной среде,поскольку любое, даже самое незначительное, изменение интерфейса сказывается наих способности свободно использовать свой опыт управления в стиле стандарта ихОС.
WxWidgets использует C++. Почему не Java? Java отличноподходит для web-приложений, но не является удачным выбором для десктопа.Прежде всего, C++ приложения, работающие с wxWidgets быстрее, имеют болееестественный вид. Они проще в установке, поскольку не требуется специальнаявиртуальная машина. C++, к тому же, предоставляет простой доступ книзкоуровневой функциональности, и написанный код может быть легко интегрированс уже имеющимся C/C++ кодом.
Разработчики используют WxWidgets по разным причинам: отзамены MFC на одной платформе до обеспечения возможности быстрого переносаприложения с, к примеру, Windows на Unix и Mac OS X. WxWidgets также позволяетпереносить приложения на мобильные платформы, такие как встраиваемый Linux, PocketPC, или Palm OS.
Проект WxWidgets был основан в 1992 году, когда ДжулианСмарт работал в Эдинбургском Университете над инструментом диаграммирования подназванием “Hardy”. Он не пожелал выбирать между разработкой его для рабочейстанции Sun или для платформы PC, он предпочел написать кросс-платформенныйфреймворк.
Поскольку мощность существующих кросс-платформенныхфреймворков была ограничена, а отделение не имело необходимого бюджета длянаписания такового в любом случае, то он решил написать такой самостоятельно.Университет предоставил ему доступ для закачки wxWidgets 1.0 на FTP-серверотделения в сентябре 1992 и другие разработчики начали использовать его код. Вначале wxWidgets был нацелен на Xview и MFC 1.0. Пользователи Borland С++,жаловавшиеся на привязку к MFC, таким образом стали переписывать программы начистый Win32. Поскольку XView открывал путь на Motif, то перенос на Motif былзапущен весьма оперативно. Тем временем маленькое, однако полное энтузиазмасообщество wxWidgets-программистов уже появилось и обзавелось своей почтовойрассылкой. Добавления и исправления получали распространение в рассылке.WxWidgets постепенно расширял круг своей пользовательской аудитории по всемумиру: индивидуальные программисты, академические группы, государственныеучреждения, и те кто нашел, что WxWidgets — более удобный продукт с лучшейподдержкой, чем коммерческие продукты, которые они до этого видели илииспользовали.
В 1997 году новая версия wxWidgets 2 API быласпроектирована при помощи Маркуса Холзема(который еще во времена созданиярассылки создал Xt направление wxWidgets). Вольфрам Глогер предложил идеюпортирования WxWidgets на GTK+ и Роберт Роблинг создал необходимые графическиеэлементы пользователя, адаптированные для GNOME. Он стал основоположникомразработки wxGTK, и поныне оставаясь главным специалистом в разработкеUnix/Linux-порта WxWidgets. В 1998 году порт для Windows и порт для GTK+ былисовмещены и выложены под управлением CVS системы. Вадим Зейтлин присоединился кпроекту чтобы поспособоствовать огромной части дизайна и кода, а также СтефанКсомор начал создание MAC OS порта, тоже в 1998. 1999 обозначен приходомпрограммиста с именем Vaclav Slavik. Он создал внушительные wxHTML классы иHTML-базированный просмотрщик помощи.
В 2000 году фирма SciTech Inc. профинансировала началоразработки wxUniversal.
Собственный для wxWidgets набор графических элементовпользователя для использования на платформах, у которых пока что нет никакихграфических элементов пользователя. wxUniversal стал первым используемым в этойфирме портом для MGL, их низкоуровневому графическому слою.
В 2002 году Джулиан Смарт и Роберт Ройблинг добавил wxX11порт используя wxUniversal графические элементы пользовательского интерфейса.
В июле 2003 года wxWidgets начал запускаться на WindowsCE, а Роберт Ройблинг продемонстрировал wxGTK приложение, запущенное навстраиваемой платформе GPE Linux.
В 2004 году WxWidgets по просьбе Microsoft поменялоригинальное название “wxWindows” на WxWidgets, за что получил финансовуюпомощь.
Также в 2004 Стефан Ксомор и другие его помощники успешнозавершили перенос WxWidgets (wxMac) на MAC OS X., значительно улучшивфункциональные возможности приложений для OS X. Порт, используяющий Cocoa былзаметно улучшен (направление возглавляли Дэвид Еллиот и Виллиам Осборн).
Виллиам Осборн выиграл конкурс по созданию версииwxWidgets для Palm OS 6, задачей ставилась минимальная поддержка платформы.
В апреле 2005 года была выпущена версия 2.6, в которойбыло осуществлено слияние всех основных портов фреймворка.
20 февраля 2004 г. разработчики wxWindows предупредили,что проект будет переименован в wxWidgets, как результат переговоров Майкрософти Юлиана Смарта в связи с зарезервированной Майкрософт торговой маркой Windows(за смену имени разработчики wxWidgets и других связанных проектов получилиденежную компенсацию).
Проекты поддержки языков программирования:
wxBasic — для Бэйсик
wxPerl — для Perl
wxPython — для Python
wxRuby — для Руби
Anvil — для Руби, на базе wxRuby, с улучшеным синтаксисом
wxSqueak — для Smalltalk
wxLua — для Lua
wx4j — для Java
wxJS — для JavaScript
wxHaskell — для Haskell
wxEiffel — для Эйфель
wxD — для D
wx.NET — для .NET
wxErlang — для Erlang
2.4.2 wxHaskell
wxHaskell является портативной GUI библиотекой дляHaskell, построенной на wxWidgets. Очень часто используются для созданияграфического интерфейса на функциональном языке.
wxHaskell является графической библиотекой среднегоуровня. От wxHaskell есть производные библиотеки высокого уровня:
wxFruit
Phooey
В отличие от wxHaskell, на высоком уровне GUI эти библиотекиреализованы на Gtk2Hs, которая основана на gtk2.
Все вышеупомянутые GUI библиотеки являютсяэкспериментальными, с использованием современных математических понятий в ихподходе.
3. Анализ задачи
icqTest :: String -> Bool
По наличию @ в строке устанавливает ее принадлежность кполю e-mail.
pare :: [String] -> [(String,String)]
Из входной строки формирует список пар ICQ и e-mail.
pare2 :: [String] -> [(String,String)]
Из входной строки формирует список пар e-mail и ИОФ
comp :: String -> [(String,String)] -> String
Функция алгоритма поиска для получения ИОФ контакта
f :: [(String,String)] ->[(String,String)] -> String
Функция алгоритма поиска, формирует структуру таблицыhtml документа.
outFile :: String -> String ->String -> IO()
Функция, выводящая результаты поиска в файл и формирующаяhtml документ
main :: IO ()
Входная точка в программу, формирует графическийинтерфейс пользователя.
4. Программная реализация
import Graphics.UI.WX
import Graphics.UI.WXCore
import System
import Char ( toUpper)
import IO
--test for e-mail? or ICQ?
icqTest :: String -> Bool
icqTest [] = False
icqTest (x:xs) = if x=='@' then Trueelse icqTest xs
--pare ICQ and E-mail
pare :: [String] -> [(String,String)]
pare [] = []
pare [x] = (x," "):[]
pare (x:xs) = if icqTest (headxs)==False then (x,head xs):[]++pare (tail xs) else (x," "):[]++parexs
--pare E-mail and IOF
pare2 :: [String] ->[(String,String)]
pare2 [] = []
pare2 (x:xs) = if icqTest (headxs)==False then (if icqTest (head(tail xs))==False then (x++""++(head xs)++" "++(head (tail xs)),head(tail(tailxs))):[]++pare2 (tail(tail(tail xs))) else (x++" "++head xs,head(tailxs)):[]++pare2 (tail(tail xs)) ) else (x,head xs):[]++pare2 (tail xs)
--compare E-mail and return IOF
comp :: String -> [(String,String)]-> String
comp _ [("","")] =[]
comp [] _ = []
comp x (y:ys) = if x==snd y then fst yelse comp x ys
--compare pares and build html table
f :: [(String,String)] ->[(String,String)] -> String
f [([],[])] _ = ""
f (x:xs) (y:ys) =((""++"\n"++""++comp (fst x)(y:ys)) ++""++"\n"++""++ sndx ++ "" ++"\n"++""++""++fstx++""++""++"\n"++""++"\n")++ (if null xs then "" else f xs (y:ys))
--write html code in out File
outFile :: String -> String ->String -> IO()
outFile x y z = do s \n \n \n FIO \n ICQ \n E-mail \n \n"; appendFile z (f (pare(wordss))(pare2(words d)));appendFile z " \n \n"
--GUI mode
main :: IO ()
main = start gui
gui :: IO ()
gui
= do — main gui elements: frame, panel,text control, and the notebook
f
p
nb
textlog
— use text control as logger
textCtrlMakeLogActiveTarget textlog
logMessage «logging enabled»
— set f [on closing :~ \prev -> dologSetActiveTarget oldlog; logDelete log; prev]
— first page
p1
--textBoxes
txt1
txt2
txt3
--buttons
ok >", on command := do f1
quit
— specify layout
set f [layout :=
container p $
column 0
[ tabs nb
[tab «Sort Contakt List» $
container p1 $ margin 10 $ column 5[hstretch $ widget txt1,hstretch $ widget txt2,hstretch $ widget txt3,row 5[floatRight $ widget ok,floatLeft $ widget quit]]
]
, hfill $ minsize (sz 20 80) $ widgettextlog
]
, clientSize := sz 400 300 ]
return ()
5. Тестирование программы
Изначальный вид приложения при запуске:
/>
Рис.5.1
Введем Пути файлов в поля ввода:
/>
Рис.5.2
После счелкаем кнопку >> и получаем html документ:
/>
Заключение
В результате проделанной работы было получено приложение,сортирующее список контактов из файлов по ключевому полю e-mail. Для решенияпоставленной задачи был разработан и реализован алгоритм поиска для файлов синформацией, хранимой в заданном формате. Для реализации приложения былаиспользована среда разработки языка Haskell-98 GHCi 6.10.1.
Список используемой литературы
1.Н.А. Роганова «Функциональное программирование»
2.Курс лекций по функциональному программированию
3. www.intuit.ru/department/pl/haskel98/6/
4. www.rsdn.ru/article/haskell/haskell_part1.xml
5. wxhaskell.sourceforge.net/
6. en.wikipedia.org/wiki/WxWidgets