Я очень новичок в Haskell и в функциональном программировании в целом. Мой вопрос довольно простой. В чем разница между совпадением шаблонов и гвардейцами?
Функция с использованием соответствия шаблонов
check :: [a] -> String
check [] = "Empty"
check (x:xs) = "Contains Elements"
Функция с защитой
check_ :: [a] -> String
check_ lst
| length lst < 1 = "Empty"
| otherwise = "Contains elements"
Мне кажется, что Pattern Matching и Guard являются принципиально одинаковыми. Оба оценивают условие, и если true выполнит выражение, связанное с ним. Правильно ли я в своем понимании?
В этом примере я могу либо использовать сопоставление шаблонов, либо охранники, чтобы получить тот же результат. Но что-то говорит мне, что я упускаю что-то важное здесь. Можем ли мы всегда заменять его другим?
Может ли кто-нибудь привести примеры, когда соответствие шаблонов предпочтительнее, чем защита и наоборот?