Адресна книжка на Haskell

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

Федеральне міністерство з освіти РФ
Володимирський Державний Університет
Кафедра ФіПМ
ЗВІТ
По курсовому проекту
З дисципліни
«Функціональний програмування»
Виконав: Миколаєва А. М.
Прийняв: Медведєва О.М.
Володимир 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>
<HEAD>
</ HEAD>
<BODY>
</ BODY>
</ HTML>
Програма клієнт-браузер при перегляді файлів з цими тегами виконує відображення документа у вікні. Кожен такий файл має розширення html або htm, а набрати його можна в будь-якому текстовому редакторі. Теги грають роль команд змушують браузер виконати передбачені ними дії. Область дії тега визначається тим місцем, де він зазначений, і тим місцем, де він закритий (записаний в кутових дужках з попередньою косою рисою).
2.1.2 Основні Теги
<html> </ html>
Тег HTML вказує початок і кінець HTML документа.
<head> </ head>
Тег HEAD (заголовок HTML-документа) містить інформацію, що відноситься до документа в цілому.
<body> </ body>
Тег BODY охоплює ту частину HTML-документа (текст, зображення та елементи формування), яка буде видно користувачеві.
<title> </ title>
Тег TITLE встановлює заголовок HTML-документа, що виводиться в рядку заголовка вікна броузера.
<body bgcolor=?>
Атрибут BGCOLOR встановлює колір фону HTML-документа. Колір може бути вказаний за допомогою за допомогою назви або шестнадцатірічное коду.
<body text=?>
Атрибут TEXT встановлює колір для всього тексту HTML-документа. Колір може бути вказаний за допомогою за допомогою назви або шестнадцатірічное коду.
<font size=?> </ font>
Атрибут SIZE тега FONT встановлює відносний розмір шрифту. Список можливих значень складається з позитивних і негативних чисел від 0 до 7.
<font color=?> </ font>
Атрибут COLOR тега FONT встановлює колір тексту. Колір може бути вказаний за допомогою за допомогою назви або шестнадцатірічное коду.
<table> </ table>
Тег TABLE встановлює початок і кінець таблиці. Всі теги, що визначають структуру таблиці, повинні розташовуватися між тегами TABLE.
<tr> </ tr>
Тег TR визначає рядок таблиці.
<td> </ td>
Тег TD визначає колонку таблиці. Текст, укладений між тегами TD ("table data" - табличні дані), відображається всередині одного осередку.
<th> </ th>
Тег TH встановлює режим відображення тексту у вигляді заголовка таблиці.
<table border=?>
Атрибут BORDER тега TABLE встановлює ширину рамки таблиці в пікселах.
<tr align=?> or <td align=?>
Атрибут ALIGN встановлює вирівнювання вмісту осередку по її лівому краю (LEFT), по центру (CENTER) або за її правому краю (RIGHT).
2.1.3 Тег для створення посилання на поштову скриньку
<a "URL"> </ a>
Тег A встановлює зв'язок з деякою точкою всередині того ж HTML-документа або з іншим URL (гіпертествовая посилання). Атрибут HREF тега A описує об'єкт, що представляє собою текст або малюнок всередині HTML-документа, або текст або малюнок в зовнішньому документі.
<a name="NAME"> </ a>
Тег A встановлює зв'язок з деякою точкою всередині того ж HTML-документа або з іншим URL (гіпертествовая посилання). Атрибут NAME тега A описує точку всередині HTML-документа, до якої потрібно перемістити користувача.
Поставити посилання на чиюсь адресу електронної пошти не складає труднощів. Ми просто пишемо:
<a "mailto:foo@mail.com"> Спамте мене, хлопці! </ a>
2.2 Вирази в Haskell
2.2.1 Кортежі
Кортежі записуються у вигляді (e1,..., Ek) і можуть бути довільної довжини
k> = 2. Конструктор для кортежу розміром n позначається (,...,), де n - 1 ком.
Таким чином, (a, b, c) і (,,) abc позначають одне і те ж значення. Стандартні операції над кортежами описані в 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
writeFile:: FilePath -> String -> IO ()
appendFile:: FilePath -> String -> IO ()
readFile:: FilePath -> IO String
Зверніть увагу, що writeFile і appendFile записують літеральну рядок у файл. Для того щоб записати значення будь-якого придатного для друку типу, як у print, спочатку використовується функція show для перетворення значення в рядок.
main = appendFile "квадрати" (show [(x, x * x) | x <- [0,0.1 .. 2]])
2.4 GUI
2.4.1 wxWidgets
wxWidgets (раніше відома як wxWindows) - це крос-платформна бібліотека інструментів з відкритим вихідним кодом для побудови графічного інтерфейсу користувача (GUI).
wxWidgets випущений під «роздільної зміни (але явно схваленою OSI) LGPL». Проект був запущений в 1992 Юліаном Смартом (Julian Smart), який до цих пір залишається головним розробником.
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, Pocket PC, або 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 почав запускатися на Windows CE, а Роберт Ройблінг продемонстрував 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 True else icqTest xs
- Pare ICQ and E-mail
pare:: [String] -> [(String, String)]
pare [] = []
pare [x] = (x, ""):[]
pare (x: xs) = if icqTest (head xs) == False then (x, head xs ):[]++ pare (tail xs) else (x, ""):[]++ pare xs
- Pare E-mail and IOF
pare2:: [String] -> [(String, String)]
pare2 [] = []
pare2 (x: xs) = if icqTest (head xs) == False then (if icqTest (head (tail xs)) == False then (x + + "" + + (head xs) + + "" + + (head ( tail xs)), head (tail (tail xs ))):[]++ pare2 (tail (tail (tail xs))) else (x + + "" + + head xs, head (tail xs )):[]+ + 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 y else comp x ys
- Compare pares and build html table
f:: [(String, String)] -> [(String, String)] -> String
f [([],[])] _ = ""
f (x: xs) (y: ys) = (("<TR>" + + "\ n "++"< TD>" + + comp (fst x) (y: ys)) ++"</ TD >"++" \ n "++"< TD> "+ + snd x + +" </ TD> "+ +" \ n "++"< TD >"++"< a href = "+ + "\ ""++" mailto:" + + fst x + + "\ ""++">"++ fst x ++"</ a >"++"</ TD >"++" \ n" ++"</ TR >"++" \ n ") + + (if null xs then" "else f xs (y: ys))
- Write html code in out File
outFile:: String -> String -> String -> IO ()
outFile xyz = do s <- readFile x; d <- readFile y; writeFile z "<HTML> \ n <Body bgcolor = floralwhite> \ n <TABLE border=5 alight = center> \ n <TR> <TH> FIO </ TH> \ n <TH> ICQ </ TH> \ n <TH> E-mail </ TH> \ n </ TR> \ n "; appendFile z (f (pare (words s)) (pare2 ( words d))); appendFile z "</ TABLE> \ n </ BODY> \ n </ HTML>"
- GUI mode
main:: IO ()
main = start gui
gui:: IO ()
gui
= Do - main gui elements: frame, panel, text control, and the notebook
f <- frame [text: = "Controls"]
p <- panel f []
nb <- notebook p []
textlog <- textCtrl p [enabled: = False, wrap: = WrapNone]
- Use text control as logger
textCtrlMakeLogActiveTarget textlog
logMessage "logging enabled"
- Set f [on closing: ~ \ divv -> do logSetActiveTarget oldlog; logDelete log; divv]
- First page
p1 <- panel nb []
- TextBoxes
txt1 <- textEntry p1 [alignment: = AlignLeft, text: = "icq file name"]
txt2 <- textEntry p1 [alignment: = AlignLeft, text: = "e-mail file name"]
txt3 <- textEntry p1 [alignment: = AlignLeft, text: = "out file name"]
- Buttons
ok <- button p1 [text: = ">>", on command: = do f1 <- get txt1 text; f2 <- get txt2 text; f3 <- get txt3 text; logMessage f1; logMessage f2; logMessage f3; outFile f1 f2 f3;]
quit <- button p1 [text: = "Close", on command: = close f]
- 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) $ widget textlog
]
, 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. http://wxhaskell.sourceforge.net/
6. http://en.wikipedia.org/wiki/WxWidgets
Додати в блог або на сайт

Цей текст може містити помилки.

Програмування, комп'ютери, інформатика і кібернетика | Курсова
50.4кб. | скачати


Схожі роботи:
Адресна книга
Адресна соціальна допомога в Ростовській області
Адресна книга на мові Visual Basic
Трудова книжка
Трудова книжка 2
Трудова книжка
Трудова книжка 2 Історія трудової
Розробка СУБД Записна книжка керівника
Порядок укладення трудового договору Випробувальний термін Трудова книжка
© Усі права захищені
написати до нас