Какова цель функций userError и isUserError? - PullRequest
1 голос
/ 11 июля 2020

Я исследую механизм исключений в 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.

1 Ответ

3 голосов
/ 11 июля 2020

userError - это умный конструктор для значения типа IOError (который сам по себе является псевдонимом для IOException), который использует единственный конструктор данных, также называемый IOError. Два из полей - ice_type :: IOErrorType и ioe_description :: String; остальные поля не относятся к UserError, поэтому userError на самом деле просто оболочка вокруг конструктора данных IOError:

userError       :: String  -> IOError
userError str   =  IOError Nothing UserError "" str Nothing Nothing

Когда вы хотите поднять свой собственный IOError , вы используете userError для его создания; результирующее значение IOError передается обработчику.

isUserError e просто проверяет, соответствует ли ioe_type e UserError.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...