Unknown - haskell-notes

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

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

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

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

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

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

Интервал:

Закладка:

Сделать

putStr

:: String -> IO()

putStr s

=

hPutStr stdout s

А так читаем строку с клавиатуры:

getLine

:: IO String

getLine

=

hGetLine stdin

В этих функциях используются дескрипторы стандартных потоков данных stdin и stdout. Отметим функ-

цию withFile:

withFile :: FilePath -> IOMode ->( Handle -> IOr) -> IOr

Она открывает файл в заданном режиме выполняет функцию на его дескрипторе и и закрывает файл.

Например через эту функцию определены функции readFile и appendFile:

appendFile

:: FilePath -> String -> IO()

appendFile f txt =withFile f AppendMode(\hdl ->hPutStr hdl txt)

writeFile :: FilePath -> String -> IO()

writeFile f txt =withFile f WriteMode(\hdl ->hPutStr hdl txt)

8.5 Форточка в мир побочных эффектов

В самом начале главы я сказал о том, что из мира IO

нет выхода. Нет функции с типом IOa ->a. На самом деле выход есть. Функция с таким типом живёт в

модуле System.IO.Unsafe:

unsafePerformIO :: IOa ->a

Длинное имя функции намекает на то, что её необходимо использовать с крайней осторожностью. По-

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

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

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

то мы можем считать, что его значение окажется неизменным на протяжении работы программы. Это говорит

о том, что нам не важно когда читать данные. Поэтому здесь мы вроде бы ничем не рискуем. “Вроде бы”

потому что ответственность за постоянство файла лежит на наших плечах.

Эта функция часто используется при вызове функций С через Haskell. В Haskell есть возможность вызывать

функции, написанные на C. Но по умолчанию такие функции заворачиваются в тип IO. Если функция является

чистой в С, то она будет чистой и при вызове через Haskell. Мы можем поручиться за её чистоту и вычислитель

нам поверит. Но если мы его обманули, мы пожнём плоды своего обмана.

138 | Глава 8: IO

Отладка программ

Раз уж речь зашла о “грязных” возможностях языка стоит упомянуть функцию trace из модуля

Debug.Trace. Посмотрим на её тип:

trace :: String ->a ->a

Это служебная функция эхо-печати. Когда дело доходит до вычисления функции trace на экран выводит-

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

Это функция id с побочным эффектом вывода сообщения на экран. Ею можно пользоваться для отладки. На-

пример так можно вернуть значение и распечатать его:

echo :: Showa =>a ->a

echo a =trace (show a) a

8.6 Композиция монад

Эта глава завершает наше путешествие в мире типов-монад. Мы начали наше знакомство с монадами с

композиции, мы определили класс Monadчерез класс Kleisli, который упрощал составление специальных

функций вида a ->m b. Тогда мы познакомились с самыми простыми типами монадами (списки и частично

определённые функции), потом мы перешли к типам посложнее, мы научились проводить вычисления с

состоянием. В этой главе мы рассмотрели самый важный тип монаду IO. Мне бы хотелось замкнуть этот

рассказ на теме композиции. Мы поговорим о композиции нескольких монад.

Если вы посмотрите в исходный код библиотеки transformers, то увидите совсем другое определение для

State:

type States = StateTs Identity

newtype StateTs m a = StateT{ runStateT ::s ->m (a,s) }

newtype Identitya = Identity{ runIdentity ::a }

Но так ли оно далеко от нашего? Давайте разберёмся. Identityэто тривиальный тип обёртка. Мы просто

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

делить экземпляры всех рассмотренных в этой главе классов для этого типа. Тип StateTбольше похож на

наше определение для State, единственное отличие – это дополнительный параметр m в который завёрнут

результат функции обновления состояния. Если мы сотрём m, то получим наше определение. Это и сказано

в определении для State

type States = StateTs Identity

Мы передаём дополнительным параметром в StateTтип Identity, который как раз ничего и не делает

с типом. Так мы получим наше исходное определение, но зачем такие премудрости? Такой тип принято

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

Интервал:

Закладка:

Сделать

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

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


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

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

x