Как работают исключения в Haskell?


В GHCi:

Prelude> error (error "")
*** Exception: 
Prelude> (error . error) ""
*** Exception: *** Exception: 

почему первый не является вложенным исключением?

1 85

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)