Рефераты. Адресная книжка на Haskell

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++ кодом.

Страницы: 1, 2, 3



2012 © Все права защищены
При использовании материалов активная ссылка на источник обязательна.