Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Свет мой, error, скажи, ДА всю правду доложи
К этому времени вы знаете, что монада Maybe используется, чтобы добавить к значениям контекст возможной неудачи. Значением
может быть Just < нечто > либо Nothing. Как бы это ни было полезно, всё, что нам известно, когда у нас есть значение Nothing, – это со- стоявшийся факт некоей неудачи: туда не втиснуть больше инфор- мации, сообщающей нам, что именно произошло. И тип Either e a позволяет нам включать контекст возможной неудачи в наши значения. С его помощью тоже можно прикреплять значения к неудаче, чтобы они могли описать, что именно пошло не так, либо предоставить другую полезную информацию относи- тельно ошибки. Значение типа Either e a может быть либо значени- ем Right (правильный ответ и успех) либо значением Left (неудача). Вот пример: ghci>:t Right 4 Right 4:: (Num t) => Either a t ghci>:t Left "ошибка нехватки сыра" Left "ошибка нехватки сыра":: Either [Char] b Это практически всего лишь улучшенный тип Maybe, поэтому имеет смысл, чтобы он был монадой. Он может рассматриваться и как значение с добавленным контекстом возможной неудачи, только теперь при возникновении ошибки также имеется при- креплённое значение. Его экземпляр класса Monad похож на экземпляр для типа Maybe и может быть обнаружен в модуле Control.Monad.Error1: instance (Error e) => Monad (Either e) where return x = Right x Right x >>= f = f x Left err >>= f = Left err fail msg = Left (strMsg msg) Функция return, как и всегда, принимает значение и помеща- ет его в минимальный контекст по умолчанию. Она оборачивает наше значение в конструктор Right, потому что мы используем его для представления успешных вычислений, где присутствует 1 Если версия пакетов языка Haskell base и mtl, установленных в вашей системе, выше соответственно 4.3.1.0 и 2.0.1.0, вам нужно импортировать модуль Control. Monad.Error в ваш скрипт или Control.Monad.Instances в интерпретатор GHCi, пе- ред тем как вы сможете использовать функции экземпляра класса Monad для типа Either. Это связано с тем, что в этих версиях пакетов объявления экземпляров были перенесены в модуль Control.Monad.Instances. – Прим. перев. результат. Это очень похоже на определение метода return для типа Maybe. Оператор >>= проверяет два возможных случая: Left и Right. В случае Right к значению внутри него применяется функция f, подобно случаю Just, где к его содержимому просто применяется функция. В случае ошибки сохраняется значение Left вместе с его содержимым, которое описывает неудачу.
Экземпляр класса Monad для типа Either e имеет дополнительное требование. Тип значения, содержащегося в Left, – тот, что указан параметром типа e, – должен быть экземпляром класса Error. Класс Error предназначен для типов, значения которых могут действовать как сообщения об ошибках. Он определяет функцию strMsg, которая принимает ошибку в виде строки и возвращает такое значение. Хо- роший пример экземпляра Error – тип String! В случае со String функ- ция strMsg просто возвращает строку, которую она получила: ghci>:t strMsg strMsg:: (Error a) => String –> a ghci> strMsg "Бум!":: String "Бум!" Но поскольку при использовании типа Either для описания ошибки мы обычно задействуем тип String, нам не нужно об этом сильно беспокоиться. Когда сопоставление с образцом терпит не- удачу в нотации do, то для оповещения об этой неудаче использует- ся значение Left. Вот несколько практических примеров: ghci> Left "Бум" >>= \x –>return (x+1) Left "Бум" ghci> Left "Бум " >>= \x –> Left "нет пути!" Left "Бум " ghci> Right 100 >>= \x –> Left "нет пути!" Left "нет пути!" Когда мы используем операцию >>=, чтобы передать функции значение Left, функция игнорируется и возвращается идентичное значение Left. Когда мы передаём функции значение Right, функ- ция применяется к тому, что находится внутри, но в данном случае эта функция всё равно произвела значение Left!
Использование монады Error очень похоже на использование монады Maybe. ПРИМЕЧАНИЕ. В предыдущей главе мы использовали монади- ческие аспекты типа Maybe для симуляции приземления птиц на балансировочный шест канатоходца. В качестве упражнения вы можете переписать код с использованием монады Error, что- бы, когда канатоходец поскальзывался и падал, вы запоминали, сколько птиц было на каждой стороне шеста в момент падения.
|
||||||||||||||||||||||||||||||||
Последнее изменение этой страницы: 2017-02-17; просмотров: 178; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.224.60.220 (0.005 с.) |