Я исследую механизм исключений в Haskell. Я выяснил, как работают функции catch
и handler
.
main = toTry `catch` handler
handler :: IOError -> IO ()
handler e
| isDoesNotExistError e = putStrLn "The file doesn't exist!"
| otherwise = ioError e
Тип userError
- String -> IOError
. Насколько я понимаю, это означает, что мы можем передать userError
как e
в вышеупомянутом handler
. Hoogle говорит о userError
: «Создайте значение IOError
со строкой, описывающей ошибку». Но как на самом деле построить userError
и какова его цель? userError
принимает только String
, как он вообще может что-то делать?
Например, вышеупомянутый isDoesNotExistError e
имеет свой собственный внутренний лог c (как я понимаю), который имеет дело с " не существует "случай. Но мы создаем свой собственный userError :: String -> IOError
, используя только String
, так что, в конце концов, userError
является синонимом нашего String
?
Я был бы признателен, если бы вы показали простой пример используя userError
и isUserError
.