Как работают исключения в Haskell?
В GHCi:
Prelude> error (error "")
*** Exception:
Prelude> (error . error) ""
*** Exception: *** Exception:
почему первый не является вложенным исключением?
1 ответ:
ответ заключается в том, что это (несколько удивительная) семантика неточного исключения
когда чистый код может быть показан для оценки до set исключительных значений (т. е. значение
errorилиundefined, и явно не типы исключений генерируется в IO), то язык позволяет возвращать любое значение этого набора. Исключительные значения в Haskell больше нравитсяNaNв коде с плавающей запятой, вместо исключений на основе потока управления в императивных языках.случайный gotcha для даже продвинутых Haskellers-это такой случай, как:
case x of 1 -> error "One" _ -> error "Not one"поскольку код оценивает набор исключений, GHC может выбрать один. При включенной оптимизации вы можете обнаружить, что это всегда оценивается как "не один".
зачем мы это делаем? Потому что в противном случае мы бы чрезмерно ограничили порядок оценки языка, например, нам пришлось бы зафиксировать детерминированный результат ибо:
f (error "a") (error "b")например, требуя, чтобы он оценивался слева направо, если присутствуют значения ошибок. Очень не-Хаскелли!
так как мы не хотим калечить оптимизации, которые могут быть сделаны на нашем коде только для поддержки
error, решение состоит в том, чтобы указать, что результат является недетерминированным выбором из набора исключительных значений: неточные исключения! В некотором смысле, все исключения возвращаются, и один выбирается.как правило, вам все равно - исключение является исключением-если вы не заботитесь о строке внутри исключения, в этом случае используя
errorдля отладки очень запутанно.
ссылки: семантика для неточных исключений, Саймон Пейтон Джонс, Аластер Рид, Тони Хор, Саймон Марлоу, Фергюс Хендерсон. Проектирование и реализация языков программирования Proc (PLDI ' 99), Атланта. ( PDF)