Россия, Петерубрг, СПБ-ГПУ, 1998 |
Опубликован: 19.09.2008 | Уровень: специалист | Доступ: платный
Лекция 19:
Утилиты Maybe
< Лекция 18 || Лекция 19 || Лекция 20 >
Аннотация: В этой лекции вы получите сведения о конструкторе типа Maybe. Узнаете каким образом он определен в Prelude, а так же затроним библиотеку, которую он использует
module Maybe( isJust, isNothing, fromJust, fromMaybe, listToMaybe, maybeToList, catMaybes, mapMaybe, - ...и то, что экспортирует Prelude Maybe(Nothing, Just), maybe ) where isJust, isNothing :: Maybe a -> Bool fromJust :: Maybe a -> a fromMaybe :: a -> Maybe a -> a listToMaybe :: [a] -> Maybe a maybeToList :: Maybe a -> [a] catMaybes :: [Maybe a] -> [a] mapMaybe :: (a -> Maybe b) -> [a] -> [b]
Конструктор типа Maybe определен в Prelude следующим образом:
data Maybe a = Nothing | Just a
Назначение типа Maybe заключается в том, чтобы предоставить метод обработки неправильных или необязательных значений без завершения программы, что произошло бы, если бы использовалась функция error, и без использования функции IOError из монады IO, которая потребовала бы, чтобы выражение стало монадическим. Правильный результат инкапсулируется путем обертывания его в Just ; неправильный результат возвращается в виде Nothing.
Другие операции над Maybe предусмотрены как часть монадических классов в Prelude.
18.1. Библиотека Maybe
module Maybe( isJust, isNothing, fromJust, fromMaybe, listToMaybe, maybeToList, catMaybes, mapMaybe, - ... и то, что экспортирует Prelude Maybe(Nothing, Just), maybe ) where isJust :: Maybe a -> Bool isJust (Just a) = True isJust Nothing = False isNothing :: Maybe a -> Bool isNothing = not . isJust fromJust :: Maybe a -> a fromJust (Just a) = a fromJust Nothing = error "Maybe.fromJust: Nothing" fromMaybe :: a -> Maybe a -> a fromMaybe d Nothing = d fromMaybe d (Just a) = a maybeToList :: Maybe a -> [a] maybeToList Nothing = [] maybeToList (Just a) = [a] listToMaybe :: [a] -> Maybe a listToMaybe [] = Nothing listToMaybe (a:_) = Just a catMaybes :: [Maybe a] -> [a] catMaybes ms = [ m | Just m <- ms ] mapMaybe :: (a -> Maybe b) -> [a] -> [b] mapMaybe f = catMaybes . map f
< Лекция 18 || Лекция 19 || Лекция 20 >