Форум программистов, компьютерный форум, киберфорум
Mysterious Light
Войти
Регистрация
Восстановить пароль
Оценить эту запись

Внезапное открытие: fail оператор в монадах

Запись от Mysterious Light размещена 10.07.2014 в 03:17
Метки haskell

Вообще-то я привык рассматривать наличие fail-оператора в Monad как тяжелое наследие плохого дизайна.
Но тут меня удивили тем, что он не так уж и бесполезен. Например, он играет ключевую роль при «рассахаривании» do-нотации с шаблонами (pattern matching). Например, следующие куски эквивалентны:
Haskell
1
2
3
4
5
-- с сахаром
do { Just x <- getFromIO "foo"; f x }
 
-- без сахара
getFromIO "foo" >>= \ a -> case a of { Just x -> f x; _ -> fail ""}
Когда я увидел это, сразу возник вопрос: а почему бы не написать просто
Haskell
1
getFromIO "foo" >>= \ (Just x) -> f x
Оказывается, последний вариант выбросит ошибку сопоставления в случае Nothing, в то время как первый вариант (дефолтный для do-нотации) обработает его согласно логике fail. Путем доопределения fail можно добиться гибкости в обработке «нешаблонных» ситуаций.

Самый смак:
Haskell
1
2
3
do { Just x <- [Nothing, Just 5, Just 2, Nothing]; return (show x) }
-- вернет
[5,2]
Это же встроенный в do-нотацию filter! Правда, в ограниченной форме.
Размещено в Без категории
Просмотров 420 Комментарии 0
Всего комментариев 0
Комментарии
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.