Quelle est la différence entre le filtrage et des Gardes?

Je suis très nouveau à Haskell et à la programmation fonctionnelle en général. Ma question est assez basique. Quelle est la différence entre le filtrage et des Gardes?

Fonction en utilisant l'appariement

check :: [a] -> String
check [] = "Empty"
check (x:xs) = "Contains Elements"

Fonction à l'aide de gardes

check_ :: [a] -> String
check_ lst
    | length lst < 1 = "Empty"
    | otherwise = "Contains elements"

Pour moi, il ressemble à la Correspondance de Modèle et les Gardes sont fondamentalement les mêmes. À la fois évaluer une condition, et si vrai exécutera l'expression accroché à elle. Ai-je raison de ma compréhension?

Dans cet exemple, je peux soit utiliser la correspondance de motif ou de gardes pour arriver au même résultat. Mais quelque chose me dit que je suis absent dehors sur quelque chose d'important ici. Pouvons-nous toujours remplacer l'une avec l'autre?

Quelqu'un pourrait-il donner des exemples où le pattern matching est préféré plus de gardes et vice-versa?

  • Il n'est pas lié directement à votre question, mais la première version de la fonction est probablement meilleur parce qu'il est plus efficace et de travail pour l'infini des listes.
  • Le filtrage est à propos de la forme de données, de gardes sur le contenu.
  • Consultez le définition de la correspondance de motif dans le Langage Haskell Rapport.