Обычно считается неправильной практикой использовать не исчерпывающие шаблонные манипуляции на функциональных языках, таких как Haskell или F #, что означает, что указанные случаи не охватывают все возможные случаи ввода?
В частности, должен ли я разрешать код с ошибкой с MatchFailureException
и т.д., или я должен всегда охватывать все случаи и явно вызывать ошибку при необходимости?
Пример:
let head (x::xs) = x
или
let head list =
match list with
| x::xs -> x
| _ -> failwith "Applying head to an empty list"
F # (в отличие от Haskell) дает предупреждение для первого кода, так как []
-case не покрывается, но могу ли я игнорировать его, не нарушая функциональных условностей стиля ради лаконичности? MatchFailure очень хорошо говорит о проблеме...