Учебник по Haskell - [26]

Шрифт
Интервал

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

*Nat> let (#) = (-)

*Nat> (2#) 1

1

*Nat> (#2) 1

-1

Эти правила левого и правого применения работают и для буквенных имён в инфиксной форме записи:

*Nat> let minus = (-)

*Nat> (2 ‘minus‘ ) 1

1

*Nat> ( ‘minus‘ 2) 1

-1

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

написать:

... = ... ( ‘fun‘ x) ...

Частичное применение для функций в инфиксной форме записи называют сечением (section), они бывают

соответственно левыми и правыми.

Связь с логикой

Отметим связь основного правила применения с Modus Ponens, известным правилом вывода в логике:

a -> b,

a

-------------

b

Оно говорит о том, что если у нас есть выражение из a следует b и мы знаем, что a истинно, мы смело

можем утверждать, что b тоже истинно. Если перевести это правило на Haskell, то мы получим: Если у нас

определена функция типа a -> b и у нас есть значение типа a, то мы можем получить значение типа b.

Декомпозиция и сопоставление с образцом

Декомпозиция применяется слева от знака равно, при этом наша задача состоит в том, чтобы опознать

дерево определённого вида и выделить из него некоторые поддеревья. Мы уже пользовались декомпозицией

много раз в предыдущих главах, давайте выпишем примеры декомпозиции:

not :: Bool -> Bool

not True

= ...

not False

= ...

xor :: Bool -> Bool -> Bool

xor a b = ...

show :: Show a => a -> String

show (Time h m s) = ...

addZero :: String -> String

addZero (a:[])

= ...

addZero as

= ...

(*)

a

Zero

= ...

(*)

a

(Succ b)

= ...

48 | Глава 3: Типы

Декомпозицию можно проводить в аргументах функции. Там мы видим строчную запись дерева, в узлах

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

ной переменой (подчёркивание).

С помощью конструкторов, мы указываем те части, которые обязательно должны быть в дереве для дан-

ного уравнения. Так уравнение

not True

= ...

сработает, только если на вход функции поступит значение True. Мы можем углубляться в дерево значе-

ния настолько, насколько нам позволят типы, так мы можем определить функцию:

is7 :: Nat -> Bool

is7

(Succ (Succ (Succ (Succ (Succ (Succ (Succ Zero)))))))

= True

is7

_

= False

С помощью переменных мы даём синонимы поддеревьям. Этими синонимами мы можем пользоваться в

правой части функции. Так в уравнении

addZero (a:[])

мы извлекаем первый элемент из списка, и одновременно говорим о том, что список может содержать

только один элемент. Отметим, что если мы хотим дать синоним всему дереву а не какой-то части, мы просто

пишем на месте аргумента переменную, как в случае функции xor:

xor a b = ...

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

Уравнения в определении синонима обходятся сверху вниз, поэтому часто безразличной переменной поль-

зуются в смысле “а во всех остальных случаях”, как в:

instance Eq Nat where

(==) Zero

Zero

= True

(==) (Succ a) (Succ b) = a == b

(==) _

_

= False

Переменные и безразличные переменные также могут уходить вглубь дерева сколь угодно далеко (или

ввысь дерева, поскольку первый уровень в строчной записи это корень):

lessThan7 :: Nat -> Bool

lessThan7

(Succ (Succ (Succ (Succ (Succ (Succ (Succ _)))))))

= False

lessThan7

_

= True

Декомпозицию можно применять только к значениям-константам. Проявляется интересная закономер-

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

случае декомпозиции нам нужно значение с типом без стрелок (константа). Это говорит о том, что все функ-

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

ожидаем на входе функцию, то мы можем только дать ей синоним с помощью с помощью переменной или

проигнорировать её безразличной переменной.

Как в

name

(Succ (Succ Zero))

= ...

name

(Zero : Succ Zero : [])

= ...

Но не

name

Succ

= ...

name

(Zero :)

= ...

Отметим, что для композиции это допустимые значения, в первом случае это функция Nat -> Nat, а во

втором это функция типа [Nat] -> [Nat].

Ещё одна особенность декомпозиции заключается в том, что при декомпозиции мы можем пользоваться

только “настоящими” значениями, то есть конструкторами, объявленными в типах. В случае композиции мы

могли пользоваться как конструкторами, так и синонимами.

Например мы не можем написать в декомпозиции:

name

(add Zero Zero)

= ...

name

(or (xor a b) True)

= ...

В Haskell декомпозицию принято называть сопоставлением с образцом (pattern matching). Термин намекает

на то, что в аргументе мы выписываем шаблон (или заготовку) для целого набора значений. Наборы значений

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

вид ожидаемого на вход дерева.

Структура функций | 49

3.4 Проверка типов

В этом разделе мы поговорим об ошибках проверки типов. Почти все ошибки, которые происходят в

Haskell, связаны с проверкой типов. Проверка типов происходит согласно правилам применения, которые

встретились нам в разделе о композиции значений. Мы остановимся лишь на случае для префиксной формы

записи, правила для сечений работают аналогично. Давайте вспомним основное правило:


Рекомендуем почитать
Уголовное право. Особенная часть

В книге кратко изложены ответы на основные вопросы темы «Уголовное право. Особенная часть». Издание поможет систематизировать знания, полученные на лекциях и семинарах, подготовиться к сдаче экзамена или зачета.Пособие адресовано студентам высших и средних образовательных учреждений, а также всем интересующимся данной тематикой.


Уголовно-исполнительное право

В книге кратко изложены ответы на основные вопросы темы «Уголовно-исполнительное право». Издание поможет систематизировать знания, полученные на лекциях и семинарах, подготовиться к сдаче экзамена или зачета.Пособие адресовано студентам высших и средних образовательных учреждений, а также всем интересующимся данной тематикой.


Самоучитель Adobe Premiere 6.5

Книга посвящена возможностям самого популярного средства цифрового видеомонтажа – Adobe Premiere 6.5. Описываются основные приемы работы с программой, приводятся сведения об управлении проектами и клипами, обсуждаются методы монтажа видео и звука, техника создания титров и добавления спецэффектов, а также освещается процесс окончательного монтирования фильма. На примерах рассматриваются все этапы создания и обработки фильмов для телевидения, видео и мультимедиа.Для широкого круга пользователей.


Финансовое право

В учебном пособии в краткой и доступной форме рассмотрены все основные вопросы, предусмотренные государственным образовательным стандартом и учебной программой по дисциплине «Финансовое право».Книга позволит быстро получить основные знания по предмету, а также качественно подготовиться к зачету и экзамену.Рекомендуется студентам, аспирантам и преподавателям по юридическим, экономическим и управленческим специальностям, а также сотрудникам банков.Автор книги, Шевчук Денис Александрович, имеет опыт преподавания различных дисциплин в ведущих ВУЗах Москвы (экономические, юридические, технические, гуманитарные), два высших образования (экономическое и юридическое), более 30 публикаций (статьи и книги), Член Союза Юристов Москвы, Член Союза Журналистов России, Член Союза Журналистов Москвы, Стипендиат Правительства РФ, опыт работы в банках, коммерческих и государственных структурах (в т.ч.


фгос  ответы

Содержащиеся в пособии контрольно-измерительные материалы (КИМы) для 5 класса, аналогичные материалам ЕГЭ, составлены в соответствии с программой общеобразовательных учреждений по русскому языку и учитывают возрастные особенности учащихся. В конце пособия даны ответы на все варианты тестов, предложены диктанты различных типов.Пособие адресовано учителям, ученикам, их родителям и всем, кому необходимо закрепить и систематизировать знания перед ЕГЭ.


Теория литературы. Чтение как творчество

Цель предлагаемого пособия – систематизировать и обогатить представления о природе, структуре и особенностях художественной литературы как вида искусства, помочь совершенствованию читательского мастерства. Книга снабжена кратким словарем основных литературоведческих понятий и терминов (составлен при участии доцента О.В. Быстровой).Для студентов филологических факультетов, учителей, преподавателей литературы высших и средних учебных заведений.