почему бы F # не удалить предупреждение
Интересно, что вы спросите это. Бесшумная инъекция источников ошибок во время выполнения абсолютно противоречит философии F # и его родственников. Это считается гротескной мерзостью. Это семейство языков все о статической проверке, поскольку система типов изначально была разработана таким образом, чтобы облегчать именно эти виды статических проверок.
Это резкое различие в философии - именно поэтому F # и Python так редко сравниваются и противопоставляются. «Никогда не встретятся двое», как говорится.
Итак, каково поведение по умолчанию в OCaml?
То же, что и F #: во время компиляции проверяется полнота и избыточность совпадений с образцами, и выдается предупреждение, если совпадение считается подозрительным. Идиоматический стиль также тот же: вы должны писать свой код так, чтобы эти предупреждения не появлялись.
Такое поведение не имеет ничего общего с .NET, и фактически эта функциональность (из OCaml) была правильно реализована только в F # совсем недавно.
Например, если вы используете шаблон в привязке let
для извлечения первого элемента списка, потому что вы знаете, что в списке всегда будет хотя бы один элемент:
let x::_ = myList
В этом семействе языков это почти всегда свидетельствует о недостатке дизайна. Правильным решением является представление вашего непустого списка с использованием типа, который делает невозможным представление пустого списка. Затем проверка статического типа подтверждает, что ваш список не может быть пустым, и, следовательно, гарантирует, что этот источник ошибок времени выполнения был полностью исключен из вашего кода.
Например, вы можете представить непустой список в виде кортежа, содержащего заголовок и хвостовой список. Ваше совпадение с шаблоном становится:
let x, _ = myList
Это исчерпывающе, поэтому компилятор доволен и не выдает предупреждение. Этот код не может ошибаться во время выполнения .
Я стал сторонником этого метода еще в 2004 году, когда я произвел рефакторинг около 1kLOC коммерческого кода OCaml, который был основным источником ошибок времени выполнения в приложении (даже если они были явными в форме универсального кода). сопоставлять случаи, когда возникли исключения). Мой рефакторинг удалил все источники ошибок времени выполнения из большей части кода. Надежность всего приложения значительно улучшилась. Более того, мы потратили недели на поиск ошибок с помощью отладки, но мой рефакторинг был завершен в течение 2 дней. Так что эта техника действительно приносит дивиденды в реальном мире.