Чтобы уточнить совершенно правильный ответ Даниэля, fail
- это функция из класса типов MonadFail
.Первоначально он был в классе типов Monad
, но на самом деле он там не принадлежал, так как у некоторых Monad
нет концепции отказа.Для тех, у кого есть концепция отказа, fail
имеет тип MonadFail m => String -> m a
.То есть для любого типа, который реализует интерфейс MonadFail
, и для любого типа a
, fail
может взять строку и создать экземпляр этого типа, параметризованный как a
.
Для Maybe a
, fail s = Nothing
.
Для [a]
, fail s = []
.
Для IO a
, fail
вызывает исключение, содержащее строку.
Многие людинапишите экземпляры MonadFail
для таких типов, как Either String a
, где fail s = Left s
.Основная причина, по которой это не входит в стандартную библиотеку, заключается в том, что Either
является довольно абстрактным типом, и хотя обычно Right
считается успешным, а Left
- неудачным, его можно разумно использовать как Monad
с перевернутой семантикой.(Например, если вы хотите попробовать N вещей и перейти к следующему, если что-то не получится, но примите первый результат, вам нужно использовать Left
в качестве примера успеха.)
Редактировать:
Кроме того, когда вы пишете некоторый код, такой как
do
Just y <- getMaybe x
return y
, который обнуляется:
do
case getMaybe x of
Just y -> return y
_ -> fail "Failed pattern match"
Это означает, что неудачное сопоставление с шаблоном вызовет исключениев IO a
, но быть пустым списком в [a]
и Nothing
в Maybe a
.