|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Меню:
Главная
Форум
Литература: Программирование и ремонт Импульсные блоки питания Неисправности и замена Радиоэлектронная аппаратура Микросхема в ТА Рубрикатор ТА Кабельные линии Обмотки и изоляция Радиоаппаратура Гибкие диски часть 2 часть 3 часть 4 часть 5 Ремонт компьютера часть 2 Аналитика: Монтаж Справочник Электроника Мощные высокочастотные транзисторы 200 микросхем Полупроводники ч.1 Часть 2 Алгоритмические проблемы 500 микросхем 500 микросхем Сортировка и поиск Монады Передача сигнала Электроника Прием сигнала Телевидиние Проектирование Эвм Оптимизация Автомобильная электроника Поляковтрансиверы Форт Тензодатчик Силовые полевые транзисторы Распределение частот Резисторные и термопарные Оберон Открытые системы шифрования Удк |
[13] шаблона в модифицированной среде, которая содержит дополнительные переменные связи. Код, используемый в example16.hs - Это абстрактное синтаксическое представление шаблона -- Текст Переменная Назначение Включение Состав data Template data Definition T String V Template Q Template I Template [Definition] C [Template] D Template Template -- Наша среда состоит из ассоциативного списка именованных шаблонов и -- ассоциативного списка поименованных переменных величин data Environment = Env {templates::[(String,Template)], variables::[(String,String)]} -- поиск переменной в среды lookupVar lookupVar name env -- поиск шаблона в среде lookupTemplate lookupTemplate name env String -> Environment -> Maybe String lookup name (variables env) String -> Environment -> Maybe Template lookup name (templates env) -- добавляет список разрешенных определений к среде addDefs:: [(String,String)] -> Environment -> Environment addDefs defs env= env {variables = defs ++ (variables env)} -- решает определения и создает пару ( имя, величина) resolveDef:: Definition -> Reader Environment resolveDef (D t d)= do name <- resolve t value <- resolve d return (name, value) (String,String) -- переводит шаблон встроку resolve: resolve (T s)= resolve (V t)= resolve (Q t) resolve (I t ds)= tmplName <- resolve t body <- asks (lookupTemplate tmplName) Template -> Reader Environment (String) return s do varName <- resolve t varValue <- asks (lookupVar varName) return $ maybe "" id varValue do tmplName <- resolve t body <- asks (lookupTemplate tmplName) return $ maybe "" show body
case body of Just t -> do defs <- mapM resolveDef ds local (addDefs defs) (resolve t) Nothing -> return "" resolve (C ts) = (liftM concat) (mapM resolve ts) Чтобы использовать монаду Reader для перевода шаблона t в строку, вам просто нужно выполнить runReader (resolve t) env. 2.9. Монада Writer
2.9.2.Мотивация Желательно использовать для вычисления генерации выхода «на стороне». Регистрация и слежение - наиболее общие примеры, в которых данные сгенерированы в процессе вычисления, которое мы хотим сохранить, но это не первичный результат вычисления. Явное управление регистрацией или отслеживанием данных может загромоздить код и вызвать тонкие дефекты, как, например, пропущенные регистрационные данные. Монада Writer обеспечивает чистый путь для управления выходом, не загромождая основное вычисление. 2.9.3.Определение Показанное здесь определение использует классы многопараметрического типа и junDeps, которые не являются стандартными в Haskell 98. Нет необходимости полностью понимать эти детали, чтобы использовать монаду Writer.
Для того, чтобы полностью понимать это определение, вам нужно знать о классе Monoid в языке Haskell, который представляет собой математическую структуру, представляющую моноид так же, как и класс Monad представляет структуру монады. Хорошей новостью является то, что моноиды проще, чем монады. Моноид - это множество объектов, единственный элемент тождества и ассоциативный бинарный оператор над множеством объектов. Моноид должен подчиняться некоторым математическим законам, таким, при которых приложение оператора к любым величинам из установленных даёт другую величину при установке, и всякий раз, когда один операнд оператора является элементом тождества, результат равняется другому операнду. Вы можете обратить внимание, что эти законы являются такими же, как и законы, управляющие mzero и mplus для примеров MonadPlus. Это происходит потому, что монады с нулём и плюсом являются монадами, которые также являются моноидами! Одним из примеров математических моноидов являются натуральные числа с элементом тождества 0 и двоичный оператор для сложения, а также натуральные числа с элементом тождества 1 и двоичный оператор для умножения. В языке Haskell моноид состоит из типа, элемента тождества и двоичного оператора. Язык Haskell определяет класс Monoid (в Data.Monoid), чтобы обеспечивать стандартную конвенцию для работы с моноидами: элемент тождества назван mempty, а оператор назван mappend. Наиболее общий использованный стандартный моноид в языке Haskell - это список, но функции типа (а -> a) также формируют моноид. Вы должны быть внимательными при использовании списка как моноиды для Writer, так как там может быть штраф при исполнении, связанный с операцией mappend, так как выход увеличивается. В этом случае структура данных, которая поддерживает быстрые операции добавления, должна быть более подходящим выбором. newtype Writer w a= Writer { runWriter :: (a,w) } instance (Monoid w) => Monad (Writer w) where return a= Writer (a,mempty) (Writer (a,w)) >>= f = let (a, w) = runWriter $ f a in Writer (a,w mappend w) Монада Writer поддерживает пару (величина, протокол), где регистрационный тип должен быть моноидом. Возвращаемая функция просто возвращает величину вместе с пустым протоколом. Связь выполняет связанную функцию, использующую текущую величину как ввод, и добавляет любой регистрационный выход в существующий протокол. class (Monoid w, Monad m) => MonadWriter w m m -> w where pass:: m (a,w -> w) -> m a listen :: m a -> m (a,w) tell:: w -> m ()
|
Среды: Smalltalk80 MicroCap Local bus Bios Pci 12С ML Микроконтроллеры: Atmel Intel Holtek AVR MSP430 Microchip Книги: Емкостный датчик 500 схем для радиолюбителей часть 2 (4) Структура компьютерных программ Автоматическая коммутация Кондиционирование и вентиляция Ошибки при монтаже Схемы звуковоспроизведения Дроссели для питания Блоки питания Детекторы перемещения Теория электропривода Адаптивное управление Измерение параметров Печатная плата pcad pcb Физика цвета Управлении софтверными проектами Математический аппарат Битовые строки Микроконтроллер nios Команды управления выполнением программы Перехода от ahdl к vhdl Холодный спай Усилители hi-fi Электронные часы Сердечники из распылённого железа Анализ алгоритмов 8-разрядные КМОП Классификация МПК История Устройства автоматики Системы и сети Частотность Справочник микросхем Вторичного электропитания Типы видеомониторов Радиобиблиотека Электронные системы Бесконтекстный язык Управление техническими системами Монтаж печатных плат Работа с коммуникациями Создание библиотечного компонента Нейрокомпьютерная техника Parser Пи-регулятор ч.1 ПИ-регулятор ч.2 Обработка списков Интегральные схемы Шина ISAВ Шина PCI Прикладная криптография Нетематическое: Взрывной автогидролиз Нечеткая логика Бытовые установки (укр) Автоматизация проектирования Сбор и защита Дискретная математика Kb радиостанция Энергетика Ретро: Прием в автомобиле Управление шаговым двигателем Магнитная запись Ремонт микроволновки Дискретные системы часть 2 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||