Ответ 1
Ну, вы можете попробовать
foo :: String -> IO ()
foo x = do
if null x
then error "Oops!" else putStrLn "okay"
Или, если вы намерены в конечном итоге поймать ошибку, тогда
import Control.Exception
data MyException = ThisException | ThatException
deriving (Show, Typeable)
instance Exception MyException
...
foo :: String -> IO ()
foo x = do
if null x
then throw ThisException else putStrLn "okay"
Часто существует больше механизмов haskelly, которые вы могли бы использовать, например, возвращаемые значения, упакованные в тип Maybe или какую-либо другую структуру, описывающую отказ. Исключения, по-видимому, лучше подходят в тех случаях, когда возвращение сложных типов затруднит использование повторно используемых интерфейсов.