Unknown - haskell-notes

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

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

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

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

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

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

Интервал:

Закладка:

Сделать

--

действия

data Date

= Date{

day

:: Int,

month

:: Int,

year

:: Int

} deriving( Show, Eq)

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

ступны две операции:

• Чтение полей

hello :: Passport -> String

hello p =”Hello, ” ++givenName p ++”!”

114 | Глава 7: Функторы и монады: примеры

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

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

поле givenName.

• Обновление полей. Для обновления полей мы пользуемся таким синтаксисом:

value { fieldName1 =newValue1, fieldName2 =newValue2, ...}

Мы присваиваем в значении value полю с именем fieldName новое значение newFieldValue. К примеру

продлим срок действия паспорта на десять лет:

prolongate :: Passport -> Passport

prolongate p =p{ dateOfExpiry =newDate }

wherenewDate =oldDate { year =year oldDate +10 }

oldDate =dateOfExpiry p

Вернёмся к типам Sumи Prod:

newtype Sum

a = Sum

{ getSum

::a }

newtype Proda = Prod{ getProd ::a }

Этой записью мы определили два типа-обёртки. У нас есть две функции, которые заворачивают обычное

значение, это Sumи Prod. С помощью записей мы тут же в определении типа определили функции которые

разворачивают значения, это getSum и getProd.

Вспомним определение для типа State:

data States a = State(s ->(a, s))

runState :: States a ->(s ->(a, s))

runState ( Statef) =f

Было бы гораздо лучше определить его так:

newtype States a = State{ runState ::s ->(a, s) }

Накопление чисел

Но вернёмся к нашей задаче. Мы будем накапливать сумму в значении типа Sum. Поскольку нас интере-

сует лишь значение накопителя, наша функция будет возвращать значение единичного типа ().

countBiFuns :: Exp -> Int

countBiFuns =getSum .execWriter .countBiFuns’

countBiFuns’ :: Exp -> Writer( Sum Int) ()

countBiFuns’ x = casex of

Adda b ->tell ( Sum1) *>bi a b

Mula b ->tell ( Sum1) *>bi a b

Nega

->un a

_

->pure ()

wherebi a b =countBiFuns’ a *>countBiFuns’ b

un

=countBiFuns’

tell :: Monoida =>a -> Writera ()

tell a = Writer((), a)

execWriter :: Writermsg a ->msg

execWriter ( Writer(a, msg)) =msg

Первая функция countBiFuns извлекает значение из типов Writerи Sum. А вторая функция countBiFuns’

вычисляет значение.

Мы определили две вспомогательные функции tell, которая записывает сообщение в накопитель и

execWriter, которая возвращает лишь сообщение. Это стандартные для Writerфункции.

Посмотрим как работает эта функция:

*Exp>countBiFuns (n 2)

0

*Exp>countBiFuns (n 2 +n 1 +2 +3)

3

Накопление результата | 115

Накопление логических значений

В модуле Data.Monoidопределены два типа для накопления логических значений. Это типы Allи Any. С

помощью типа Allмы можем проверить выполняется ли некоторое свойство для всех значений. А с помощью

типа Anyмы можем узнать, что существует хотя бы один элемент, для которых это свойство выполнено.

Посмотрим на определение экземпляров класса Monoidдля этих типов:

newtype All = All{ getAll :: Bool}

instance Monoid All where

mempty = All True

Allx ‘mappend‘ Ally = All(x &&y)

В типе Allмы накапливаем значения с помощью логического “и”. Нейтральным элементом является кон-

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

сообщения были равны True.

В типе Anyвсё наоборот:

instance Monoid Any where

mempty = Any False

Anyx ‘mappend‘ Anyy = Any(x ||y)

Посмотрим как работают эти типы. Составим функцию, которая проверяет отсутствие оператора минус

в выражении:

noNeg :: Exp -> Bool

noNeg =not .getAny .execWriter .anyNeg

anyNeg :: Exp -> Writer Any()

anyNeg x = casex of

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

Интервал:

Закладка:

Сделать

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

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


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

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

x