Полагаю, вы используете monads-fd
.
$ ghci t.hs -hide-package mtl
*Main Data.List> testMyDiv1 1 0
"*** Exception: My divison by zero
*Main Data.List> :i Either
...
instance Monad (Either e) -- Defined in Control.Monad.Trans.Error
...
Посмотрев в пакет transformers , где monads-fd
получает экземпляр, мы видим:
instance Monad (Either e) where
return = Right
Left l >>= _ = Left l
Right r >>= k = k r
Итак, нет определения для Fail вообще.В целом, fail
не рекомендуется, так как не всегда гарантируется, что в монаде произойдет сбой (многие люди хотели бы видеть fail
удаленным из класса Monad).
РЕДАКТИРОВАТЬ: я должен добавить, чтоконечно, неясно, что fail
предполагалось оставить как вызов по умолчанию error
.Пинг в haskell-cafe или сопровождающего может стоить того.
EDIT2: экземпляр mtl
был перемещен на базу , этот ход включает удаление определения fail = Left
иобсуждение того, почему это решение было принято.Предположительно, они хотят, чтобы люди чаще использовали ErrorT при сбое монад, таким образом резервируя fail
для чего-то более катастрофического, например, плохих совпадений с образцом (например: Just x <- e
, где e -->* m Nothing
).