Учебник по Haskell - [36]
a -> [a]
Имена этих функций будут совпадать с именами функций для списков чтобы избежать коллизий имён
мы воспользуемся квалифицированным импортом функций. Делается это так:
import qualified Prelude as P( определения )
Слова qualified и as – ключевые. Теперь для использования функций из модуля Prelude мы будем писать
P.имяФункции. Такие имена называются квалифицированными. Для того чтобы пользоваться квалифициро-
ванными именами только для тех функций, для которых возможна коллизия имён можно поступить так:
70 | Глава 4: Декларативный и композиционный стиль
import qualified Prelude as P
import Prelude
Компилятор разберётся, какую функцию мы имеем в виду.
Для удобства тестирования можно определить такую функцию печати потоков:
instance Show a => Show (Stream a) where
show xs =
showInfinity (show (take 5 xs))
where showInfinity x = P. init x
P.++ ”...”
Функция P. init выделяет все элементы списка кроме последнего. В данном случае она откусит от строки
закрывающуюся скобку. После этого мы добавляем троеточие, как символ бесконечности списка.
Функции преобразования потоков:
-- Преобразование потока
map :: (a -> b) -> Stream a -> Stream b
-- Фильтрация потока
filter :: (a -> Bool) -> Stream a -> Stream a
-- zip-ы для потоков:
zip :: Stream a -> Stream b -> Stream (a, b)
zipWith :: (a -> b -> c) -> Stream a -> Stream b -> Stream c
Функция генерации потока:
iterate :: (a -> a) -> a -> Stream a
Эта функция принимает два аргумента: функцию следующего элемента потока и значение первого эле-
мента потока и возвращает поток:
iterate f a = a :& f a :& f (f a) :& f (f (f a)) :& ...
Так с помощью этой функции можно создать поток всех чисел Пеано от нуля или постоянный поток:
nats
= iterate Succ Zero
constStream a
= iterate (\x -> x) a
Возможно вас удивляет тот факт, что в этом упражнении мы оперируем бесконечными значениями, но
пока мы не будем вдаваться в детали того как это работает, просто попробуйте определить этот модуль и
посмотрите в интерпретаторе, что получится.
Упражнения | 71
Глава 5
Функции высшего порядка
Функцией высшего порядка называют функцию, которая может принимать на вход функции или возвращать
функции в качестве результата. За счёт частичного применения в Haskell все функции, которые принимают
более одного аргумента, являются функциями высшего порядка.
В этой главе мы подробно обсудим способы составления функций, недаром Haskell – функциональный
язык. В Haskell функции являются очень гибким объектом, они позволяют выделять сложные способы ком-
бинирования значений. Часто за счёт развитых средств составления новых функций в Haskell пользователь
определяет лишь базовые функции, получая остальные “на лету” применением двух-трёх операций, это вы-
глядит примерно как (2+3)*5, где вместо чисел стоят базовые функции, а операции + и * составляют новые
функции из простейших.
5.1 Обобщённые функции
В этом разделе мы познакомимся с несколькими функциями, которые принимают одни функции и состав-
ляют по ним другие. Эти функции используются в Haskell очень часто. Все они живут в модуле Data.Function.
Модуль Prelude экспортирует их из этого модуля.
Функция тождества
Начнём с самой простой функции. Это функция id. Она ничего не делает с аргументом, просто возвращает
его:
id :: a -> a
id x = x
Зачем нам может понадобиться такая функция? Сама по себе она бесполезна. Она приобретает ценность
при совместном использовании с другими функциями, поэтому пока мы не будем приводить примеров.
Константная функция
Следующая функция const принимает значение и возвращает постоянную функцию. Эта функция будет
возвращать константу для любого переданного в неё значения:
const :: a -> b -> a
const a _ = a
Функция const является конструктором постоянных функций, так например мы получаем пятёрки на
любой аргумент:
Prelude> let onlyFive = const 5
Prelude> :t onlyFive
onlyFive :: b -> Integer
Prelude> onlyFive ”Hi”
5
Prelude> onlyFive (1,2,3)
5
Prelude> map onlyFive ”abracadabra”
[5,5,5,5,5,5,5,5,5,5,5]
72 | Глава 5: Функции высшего порядка
С её помощью мы можем легко построить и постоянную функцию двух аргументов:
const2 a = const (const a)
Вспомним определение для && :
(&& ) :: Bool -> Bool -> Bool
(&& ) True
x
= x
(&& ) False
_
= False
С помощью функций id и const мы можем сократить число аргументов и уравнений:
(&& ) :: Bool -> Bool -> Bool
(&& ) a = if a then id else (const False)
Также мы можем определить и логическое “или”:
(||) :: Bool -> Bool -> Bool
(||) a = if a then (const True) else id
Функция композиции
Функция композиции принимает две функции и составляет из них последовательное применение функ-
ций:
(. ) :: (b -> c) -> (a -> b) -> a -> c
(. ) f g = \x -> f (g x)
Это очень полезная функция. Она позволяет нанизывать функции друг на друга. Мы перехватываем выход
второй функции, сразу подставляем его в первую и возвращаем её выход в качестве результата. Например
перевернём список символов и затем сделаем все буквы заглавными:
Prelude> :m +Data.Char
Prelude Data.Char> (map toUpper . reverse) ”abracadabra”
”ARBADACARBA”
Приведём пример посложнее:
add :: Nat -> Nat -> Nat
add
a
Zero
= a
add
a
(Succ b) = Succ (add a b)
Если мы определим функцию свёртки для
В книге кратко изложены ответы на основные вопросы темы «Уголовное право. Особенная часть». Издание поможет систематизировать знания, полученные на лекциях и семинарах, подготовиться к сдаче экзамена или зачета.Пособие адресовано студентам высших и средних образовательных учреждений, а также всем интересующимся данной тематикой.
В книге кратко изложены ответы на основные вопросы темы «Уголовно-исполнительное право». Издание поможет систематизировать знания, полученные на лекциях и семинарах, подготовиться к сдаче экзамена или зачета.Пособие адресовано студентам высших и средних образовательных учреждений, а также всем интересующимся данной тематикой.
Книга посвящена возможностям самого популярного средства цифрового видеомонтажа – Adobe Premiere 6.5. Описываются основные приемы работы с программой, приводятся сведения об управлении проектами и клипами, обсуждаются методы монтажа видео и звука, техника создания титров и добавления спецэффектов, а также освещается процесс окончательного монтирования фильма. На примерах рассматриваются все этапы создания и обработки фильмов для телевидения, видео и мультимедиа.Для широкого круга пользователей.
В учебном пособии в краткой и доступной форме рассмотрены все основные вопросы, предусмотренные государственным образовательным стандартом и учебной программой по дисциплине «Финансовое право».Книга позволит быстро получить основные знания по предмету, а также качественно подготовиться к зачету и экзамену.Рекомендуется студентам, аспирантам и преподавателям по юридическим, экономическим и управленческим специальностям, а также сотрудникам банков.Автор книги, Шевчук Денис Александрович, имеет опыт преподавания различных дисциплин в ведущих ВУЗах Москвы (экономические, юридические, технические, гуманитарные), два высших образования (экономическое и юридическое), более 30 публикаций (статьи и книги), Член Союза Юристов Москвы, Член Союза Журналистов России, Член Союза Журналистов Москвы, Стипендиат Правительства РФ, опыт работы в банках, коммерческих и государственных структурах (в т.ч.
Содержащиеся в пособии контрольно-измерительные материалы (КИМы) для 5 класса, аналогичные материалам ЕГЭ, составлены в соответствии с программой общеобразовательных учреждений по русскому языку и учитывают возрастные особенности учащихся. В конце пособия даны ответы на все варианты тестов, предложены диктанты различных типов.Пособие адресовано учителям, ученикам, их родителям и всем, кому необходимо закрепить и систематизировать знания перед ЕГЭ.
Цель предлагаемого пособия – систематизировать и обогатить представления о природе, структуре и особенностях художественной литературы как вида искусства, помочь совершенствованию читательского мастерства. Книга снабжена кратким словарем основных литературоведческих понятий и терминов (составлен при участии доцента О.В. Быстровой).Для студентов филологических факультетов, учителей, преподавателей литературы высших и средних учебных заведений.