Вот пример, который я написал, в котором используются ветки if-else
и защитные выражения. Когда одно лучше другого? Основная причина, по которой я хочу это знать, заключается в том, что у языков обычно есть идиоматический способ действий.
test1 a b =
if mod b 3 ≡ 0 then a + b
else if mod b 5 ≡ 0 then a + b
else a
test2 a b
| mod b 3 ≡ 0 = a + b
| mod b 5 ≡ 0 = a + b
| otherwise = a
Приведенный вами пример очень хорошо демонстрирует, насколько охранники лучше.
С охранниками у вас есть очень простой и читаемый список условий и результатов - очень близко к тому, как функция была бы написана математиком.
С if
, с другой стороны, у вас есть несколько сложная (по существу, O (n 2 ) сложность чтения) структура вложенных выражений с ключевыми словами, добавляемыми через нерегулярные промежутки времени.
Для простых случаев это просто бросоквверх между if
и охранниками - if
может быть даже более читаемым в некоторых очень простых случаях, потому что легче писать в одной строке. Однако для более сложной логики охранники - лучший способ выразить ту же идею.
Я всегда думал, что это вопрос предпочтений. Лично я предпочитаю второй, я думаю, что if-elses дает более императивное чувство, чем охранники, и я считаю, что охранники легче читать.