Ремонт принтеров, сканнеров, факсов и остальной офисной техники


назад Оглавление вперед




[10]

toString n

return $ show n

- Преобразование строки, состоящей из шестнадцатиричного представления -- числа в строку, содержащую десятичное представление этого числа. -- Разбираемая ошибка во введённой строке будет создавать -- описание сообщения об ошибке, как строку вывода. convert:: String -> String

convert s= let (Right str) =

do {n <- parseHex s; toString n} "catchError" printError

where printError e = return $ "At index " ++ (show (location e)) ++ ":" ++ (reason e)

2.5. Монада List 2.5.1. Обзор

Таблица 5. Свойства монады List

Тип вычисления:

Вычисления, которые могут возвращать 0, 1, или более возможных результатов.

Стратегия связывания:

Связанная функция применена ко всем возможным величинам во входном списке, и результирующие списки конкатенированы, чтобы произвести список всех возможных результатов.

Полезна для:

Построение вычислений из последовательностей недетерминированных операций. Общим примером являются неоднозначные грамматики синтаксического анализа.

Нуль и плюс:

[] - нуль и ++ - операция «+».

Пример:

2.5.2.Мотивация

Монада List включает стратегию объединения цепи недетерминированных вычислений путём приложения операций ко всем возможным величинам на каждом шаге. Это полезно, когда вычисления имеют дело с неоднозначностью. В этом случае допускаются все возможности, которые нужно изучить для разрешения неоднозначности.

2.5.3.Определение

instance Monad []

m >>= f =

return x = fail s =

where concatMap f m

instance MonadPlus [] where

mzero = []

ФП 02005-03 01

Лист 36

№ докум.


mplus= (++)

2.5.4. Пример

Канонический пример использования монады List - для синтаксического анализа неоднозначных грамматик. Пример ниже показывает просто небольшой пример синтаксического преобразования данных в шестнадцатеричные величины, десятичные величины и слова, содержащие только буквенно-числовые символы. Заметьте, что шестнадцатеричные цифры перекрывают как десятичные цифры так и буквенно-числовые символы, приводящие к неоднозначной грамматике. «Мёртвый» - это как правильная шестнадцатеричная величина, так и слово, например, «10» - как десятичная величина 10, так и шестнадцатеричная величина 16.

Код, имеющийся в example13.hs

- мы можем выполнить грамматический разбор трёх разных типов условий data Parsed = Digit Integer Hex Integer Word String deriving Show

-- попытки добавить символ к грамматически разобранному представлению -- шестнадцатеричного числа

parseHexDigit:: Parsed -> Char -> [Parsed]

parseHexDigit (Hex n) c= if isHexDigit c

return (Hex ((n*16) + (toInteger (digitToInt c)))) else

parseHexDigit = mzero

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

parseDigit:: Parsed -> Char -> [Parsed]

parseDigit (Digit n) c= if isDigit c

return (Digit ((n*10) + (toInteger (digitToInt c)))) else

parseDigit = mzero

-- попытки добавить символ к грамматически разобранному представлению слова parseWord:: Parsed -> Char -> [Parsed]

parseWord (Word s) c= if isAlpha c

return (Word (s ++ [c]))

parseWord = mzero

ФП 02005-03 01

Лист 37

№ докум.

Копипова Фопмат


- пытаемся выполнять грамматический разбор цифры как шестнадцатеричной -- величины, десятичной величины и слова; результатом является список -- возможных разборов

parse:: Parsed -> Char -> [Parsed]

parse p c= (parseHexDigit p c) "mplus"

(parseDigit p c) "mplus"

(parseWord p c)

-- выполняет грамматический разбор целой строки и возвращает список возможных -- разобранных величин

parseArg:: String -> [Parsed]

parseArg s = do

init <- (return (Hex 0)) "mplus"

(return (Digit 0)) "mplus"

(return (Word ""))

foldM parse init s

2.6. Монада IO

2.6.1. Обзор

Таблица 6. Свойства монады IO

Тип вычисления:

Вычисления, которые выполняют ввод/вывод.

Стратегия связывания:

Действия ввода/вывода выполнены в том порядке, в котором они связаны. Неудачи отбрасывают ошибки ввода/вывода, которые могут быть отслежены и подданы управлению.

Полезна для:

Выполнение ввода/вывода в пределах программы на языке Haskell.

Нуль и плюс:

Пример:

2.6.2.Мотивация

Ввод/вывод несовместим с чистым функциональным языком, так как он не является прозрачным и не может избежать побочных эффектов. Монада IO решает эту проблему, ограничивая вычисления, которые выполняют ввод/вывод в пределах монады IO.

2.6.3.Определение

Определение монады IO является платформо-зависимым. Никакие конструкторы данных не экспортированы и никакие функции не предусмотрены, чтобы удалять данные из монады IO. Это делает монаду IO односторонней монадой и существенной в обеспечении безопасности функциональных программ с помощью изоляции побочных эффектов и непрозрачных действий в пределах необходимого стиля вычислений монады

№ докум.

ФП 02005-03 01



[стр.Начало] [стр.1] [стр.2] [стр.3] [стр.4] [стр.5] [стр.6] [стр.7] [стр.8] [стр.9] [стр.10] [стр.11] [стр.12] [стр.13] [стр.14] [стр.15] [стр.16] [стр.17] [стр.18] [стр.19] [стр.20] [стр.21] [стр.22] [стр.23] [стр.24] [стр.25]