Как справиться с этим исключением? - PullRequest
3 голосов
/ 04 января 2009

Хаскелл причиняет мне головную боль сегодня. Я хочу обработать исключение. Когда он достигает вершины, он печатает так:

*** Исключение: ../p/trip/Trip.hs:(88,16)-(89,50): неисчерпывающие шаблоны в разделении функций

Мне кажется, это PatternMatchFail, но это не работает:

handle (\(PatternMatchFail _) -> return env) f

Я имею в виду, он компилируется, но не обрабатывает исключение. Что я делаю неправильно? Это неправильное исключение или как? Есть ли способ поймать какое-либо исключение?

1 Ответ

1 голос
/ 05 января 2009

Если исправить источник ошибки невозможно, вы должны посмотреть на это: http://www.haskell.org/ghc/docs/latest/html/libraries/base/Control-Exception.html

Я полагаю, что использование «handle», «try», «catch» или чего-либо еще из Control.Exception является ключевым здесь: функции в стандартной прелюдии имеют дело только с IO-Exception, а не с ошибками в чистом коде.

В Haskell98 чистый код не может обрабатывать исключения. Чистые функции должны возвращать значение, исключение составляет невозможность возврата значения.

Пример:

import qualified Control.Exception as C
x ::String
x = undefined
y = "return value"

main = do C.handle (\_ -> return "caught") (C.evaluate x) >>= print
          C.handle (\_ -> return "caught") (C.evaluate y) >>= print

Призыв к оценке состоит в том, чтобы заставить вычислять x и y, при этом haskell ленив и все.

Если вы позволите вычислению x быть отложенным на более поздний срок (лениво), исключение также будет сгенерировано позже, в другом месте (в данном случае это «print», использующее значение), где оно может не быть. пойманы.

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