Unknown - haskell-notes

Здесь есть возможность читать онлайн «Unknown - haskell-notes» весь текст электронной книги совершенно бесплатно (целиком полную версию без сокращений). В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Жанр: Старинная литература, на английском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

haskell-notes: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «haskell-notes»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

haskell-notes — читать онлайн бесплатно полную книгу (весь текст) целиком

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «haskell-notes», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

называть монадным трансформером (monad transformer). Он определяет композицию из нескольких монад в

данном случае одной из монад является State. Посмотрим на экземпляр класса Monadдля StateT

instance( Monadm) => Monad( StateTs m) where

return a = StateT $\s ->return (s, a)

a >>=f = StateT $\s0 ->

runStateT a s0 >>=\(b, s1) ->runStateT (f b) s1

В этом определении мы пропускаем состояние через сито методов класса Monadдля типа m. В остальном

это определение ничем не отличается от нашего. Также определены и ReaderT, WriterT, ListTи MaybeT.

Ключевым классом для всех этих типов является класс MonadTrans:

class MonadTranst where

lift :: Monadm =>m a ->t m a

Этот тип позволяет нам заворачивать специальные значения типа m в значения типа t. Посмотрим на

определение для StateT:

instance MonadTrans( StateTs) where

lift m = StateT $\s ->liftM (,s) m

Композиция монад | 139

Напомню, что функция liftM это тоже самое , что и функция fmap, только она определена через методы

класса Monad. Мы создали функцию обновлнения состояния, которая ничего не делает с состоянием, а лишь

прицепляет его к значению.

Приведём простой пример применения трансформеров. Вернёмся к примеру FSMиз предыдущей главы.

Предположим, что наш конечный автомат не только реагирует на действия, но и ведёт журнал, в который

записываются все поступающие на вход события. За переход состояний будет по прежнему отвечать тип State

только теперь он станет трансформером, для того чтобы включить воможность журналирования. За ведение

журнала будет отвечать тип Writer. Ведь мы просто накапливаем записи.

Интересно, что для добавления новой возможности нам нужно изменить лишь определение типа FSMи

функцию fsm, теперь они примут вид:

module FSMt where

import Control.Monad.Trans.Class

import Control.Monad.Trans.State

import Control.Monad.Trans.Writer

import Data.Monoid

type FSMs = StateTs ( Writer[ String]) s

fsm :: Showev =>(ev ->s ->s) ->(ev -> FSMs)

fsm transition e =log e >>run e

whererun e = StateT $\s ->return (s, transition e s)

log e =lift $tell [show e]

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

лиотеки transformers. В подфункции log мы сохраняем сообщение в журнал, а в подфункции run мы вы-

полняем функцию перехода. Посмотрим, что у нас получилось:

*FSMt> letres =mapM speaker session

*FSMt>runWriter $runStateT res ( Sleep, Level2)

(([( Sleep, Level2),( Work, Level2),( Work, Level3),( Work, Level2),

( Sleep, Level2)],( Sleep, Level3)),

[”Button”,”Louder”,”Quieter”,”Button”,”Louder”])

*FSMt>session

[ Button, Louder, Quieter, Button, Louder]

Мы видим, что цепочка событий была успешно записана в журнал.

Для трансформеров с типом IOопределён специальный класс:

class Monadm => MonadIOm where

liftIO :: IOa ->m a

Этот класс живёт в модуле Control.Monad.IO.Class. С его помощью мы можем выполнять IO-действия

ввнутри другой монады. Эта возможность бывает очень полезной. Вам она обязательно понадобится, если вы

начнёте писать веб-сайты на Haskell (например в happstack) или будете пользоваться библиотеками, которые

надстроены над C (например физический движок Hipmunk).

8.7 Краткое содержание

Наконец-то мы научились писать программы! Программы, которые можно исполнять за пределами ин-

терпретатора. Для этого нам пришлось познакомиться с типом IO. Экземпляр класса Monadдля этого типа

интерпретируется специальным образом. Он вносит упорядоченность в выполнение программы. В нашем

статическом мире описаний появляются такие понятия как “сначала”, “затем”, “до” и “после”. Но они не

смогут нанести много вреда.

Вычисление операций с побочными эффектами разбивает программу на кадры. Но это не мешает нам

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

эффектов с помощью методов из классов Functor, Applicative, Monad.

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «haskell-notes»

Представляем Вашему вниманию похожие книги на «haskell-notes» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «haskell-notes»

Обсуждение, отзывы о книге «haskell-notes» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x