OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 13 Декабрь, 2019 03:42

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: Монада AND THEN
СообщениеДобавлено: Среда, 19 Январь, 2011 15:06 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Навеяно темой "Конструкция AND THEN?".
Илья Ермаков писал(а):
В ряде задач нужно ещё различать, на каком этапе неуспех. Но это делается явной переменной, хранящей текущий этап.
Код:
step := 1;
Первый_этап;
IF первый этап удался THEN
  step := 2;
  Второй этап;
AND второй этап удался THEN
  ...
ELSE
  Log.String("Ошибка на этапе "); Log.Int(step)
END

По аналогии с монадой Maybe делаем новый тип данных и прикручиваем к нему монаду:
Код:
data AndThen a = AndThen Int (Maybe a)

instance Monad AndThen where
    return a                   = AndThen 0 (Just a)
    fail _                     = AndThen 0 Nothing
    (AndThen x Nothing)  >>= _ = AndThen x Nothing
    (AndThen x (Just y)) >>= f = f y

calcAndThen x done failed =
    case x of
        AndThen _    (Just a) -> done   a
        AndThen step  Nothing -> failed step

Выполняемые (вычисляемые) шаги оформляются как "AndThen номер_шага вычисление". Вычисление должно выдать "Nothing" в случае неуспеха или "Just значение" в случае успеха.
Функция calcAndThen вычисляет цепочку шагов, помещённых в блок do, в случае успеха всех шагов вычисляет над результатом функцию done, в случае неуспеха -- вычисляет ф-цию failed над шагом, в котором произошёл сбой.

Тест:
Код:
main = do
    calcAndThen
        (do a <- AndThen 1 (Just 10)
            b <- AndThen 2 (Just 20)
            c <- AndThen 3 (Just 30)
            return $ a + b + c
        )
        (\x -> putStrLn $ "Result = " ++ show x)
        (\y -> putStrLn $ "Error on step " ++ show y)
Здесь все шаги успешны и результат:
Код:
Result = 60

А здесь в одном из шагов (во втором) -- сбой:
Код:
main = do
    calcAndThen
        (do a <- AndThen 1 (Just 10)
            b <- AndThen 2  Nothing
            c <- AndThen 3 (Just 30)
            return $ a + b + c
        )
        (\x -> putStrLn $ "Result = " ++ show x)
        (\y -> putStrLn $ "Error on step " ++ show y)
и результат:
Код:
Error on step 2

Не хватает синтаксического сахара, поэтому не очень наглядно. Надо подумать ещё.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Монада AND THEN
СообщениеДобавлено: Среда, 19 Январь, 2011 15:34 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
По моему, получилось почти 1 в 1 вот это: http://www.haskell.org/haskellwiki/Exception
:-)
Да и в первой задаче вроде как не нужно было определять на каком шаге у нас всё отвалилось.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Монада AND THEN
СообщениеДобавлено: Среда, 19 Январь, 2011 18:36 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Alexey Veselovsky писал(а):
По моему, получилось почти 1 в 1 вот это: http://www.haskell.org/haskellwiki/Exception :-)
Не могу согласиться с "почти 1 в 1" -- всё-таки протаскивания номера шага там нет. Там по сути вариация на тему монады Maybe, точнее -- это монада Either.
Alexey Veselovsky писал(а):
Да и в первой задаче вроде как не нужно было определять на каком шаге у нас всё отвалилось.
Если бы не было нужды определять шаг сбоя, можно было бы обойтись просто монадой Maybe.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2019, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB