Как заметил комментатор, в Java есть непроверенные исключения, поэтому ошибки времени выполнения делают. Elm также имеет непроверяемые исключения для таких вещей, как деление на ноль, но избавляется от наиболее часто встречающихся на практике. И, как упоминается в ответе Чада, типы Elm Maybe
/Result
на практике работают совершенно иначе, чем проверенные исключения Java. Опытный программист Elm не стал бы писать функцию типа toIntOrZero
(а если бы и написал, то, вероятно, не стал бы использовать case ... of
, предпочитая вместо этого что-то вроде toIntOrZero = String.toInt >> Result.withDefault 0
).
Объединение нескольких операций вместе с Result.map
, Result.andThen
и т. д. дает очень выразительный способ обработки случаев ошибок, не заставляя программиста слишком углубляться в сорняки. Например, если мы хотим написать функцию, которая проверяет идентификатор, преобразовывая его в Int, ища его в какой-то структуре данных (когда его там может и не быть), а затем проверяя какое-то свойство, связанное с этим пользователем, мы можем написать что-то вроде этого:
lookupUser : Int -> Result String User
lookupUser intId = ...
userInGoodStanding : User -> Bool
userInGoodStanding user = ...
isValidId : String -> Bool
isValidId id =
String.toInt id
|> Result.andThen lookupUser
|> Result.map userInGoodStanding
|> Result.withDefault False
Это гласит: «Преобразуйте идентификатор в целое число, затем найдите связанного пользователя, затем проверьте пользователя и, если что-то не удалось, верните False». Ваш пробег может варьироваться, но как только вы привыкнете к этому, я (и многие программисты Elm, я думаю!) нахожу это действительно хорошим способом написания кода, устойчивого к ошибкам.
person
Alex Lew
schedule
20.10.2017
elm
связана с функцией проверенных исключений, которую программисты ненавидят, а Microsoft решила не включать вc#
? - person Uri Goren   schedule 18.10.2017null
и операторthrow
, останется совсем немного, чтобы вызвать исключение. Это не означает, что код не содержит ошибок, просто он не будет генерировать исключения во время выполнения. - person Andreas   schedule 18.10.2017elm
о нулевых исключениях во время выполнения, и это неверно, поскольку на самом деле они не утверждают, что имеют нулевые исключения во время выполнения. - person Andreas   schedule 19.10.20171 / 0
даетInfinity : Float
, а не исключение. - person Matt McHenry   schedule 21.10.2017