58 votes

Expliquer le filtrage par correspondance

J'ai essayé d'expliquer la différence entre un énoncé de commutateur et une correspondance de modèle (F #) à quelques personnes, mais je n'ai pas vraiment été en mesure de bien l'expliquer. La plupart du temps, ils me regardaient et disaient "alors pourquoi ne vous utilisez pas juste si .. alors .. autrement ".

Comment leur expliqueriez-vous?

MODIFIER! Merci à tous pour ces bonnes réponses, j'aimerais vraiment pouvoir marquer plusieurs bonnes réponses.

38voto

Brian Points 82719

Ayant autrefois été l'un de "ces gens", je ne sais pas qu'il y a une manière succincte pour résumer pourquoi le pattern matching est tel bon bonté. C'est par expérience.

En arrière quand j'avais juste jeté un coup d'oeil au "pattern-matching" et pensait que c'était une simple instruction switch, je pense que je n'ai pas l'expérience de la programmation avec les types de données algébriques (tuples et victimes de syndicats) et de ne pas assez voir que le pattern matching est à la fois un contrôle de la construction et une liaison de construire. Maintenant que j'ai été à la programmation avec F#, j'ai enfin "l'obtenir". Le Pattern matching est la fraîcheur est due à une conjonction de caractéristiques qui se retrouvent dans les langages de programmation fonctionnelle, et il est donc non négligeable pour l'outsider-recherche-en pour l'apprécier.

J'ai essayé de résumer un aspect de pourquoi le pattern matching est utile dans le second d'un court de deux partie de la série blog sur la langue et la conception d'API; découvrez la première partie et la deuxième partie.

31voto

Bruno De Fraine Points 11478

Modèles vous donner une petite langue pour décrire la structure des valeurs que vous souhaitez faire correspondre. La structure peut être arbitrairement profond et vous pouvez lier des variables à des parties de la structure de la valeur.

Cela vous permet d'écrire des choses très succinctement. Vous pouvez illustrer cela avec un petit exemple, comme un dérivé de la fonction pour un simple type d'expressions mathématiques:

type expr =
    | Int of int
    | Var of string
    | Add of expr * expr
    | Mul of expr * expr;;

let rec d(f, x) =
    match f with
    | Var y when x=y -> Int 1
    | Int _ | Var _ -> Int 0
    | Add(f, g) -> Add(d(f, x), d(g, x))
    | Mul(f, g) -> Add(Mul(f, d(g, x)), Mul(g, d(f, x)));;

En outre, parce que la correspondance de modèle est statique construire pour les types statiques, le compilateur peut (i) vérifier que vous avez couvert tous les cas (ii) détecter redondant branches qui ne peut jamais correspondre à n'importe quelle valeur (iii) fournir une implémentation très efficace (avec des sauts etc.).

15voto

Jon Harrop Points 26951

Extrait de cet article de blog:

La correspondance de modèle a plusieurs avantages sur les instructions de commutation et de la méthode d'expédition:

  • Le motif correspond peut agir sur des entiers, des flotteurs, des cordes et d'autres types de bien que des objets.
  • Le motif correspond peut agir sur plusieurs des valeurs différentes en même temps: en parallèle pattern matching. Méthode l'expédition et le commutateur sont limités à une seule valeur, par exemple "ce".
  • Les modèles peuvent être imbriquées, permettant expédition sur les arbres de l'arbitraire de la profondeur. Méthode d'expédition et le commutateur sont limitées pour les non-imbriquées cas.
  • Ou-modèles permettent de sous-masques à partagé. La répartition de méthode permet uniquement quand le partage sont les méthodes de les classes qui partagent une base de classe. Sinon, vous devez manuellement facteur hors du commun dans un fonction distincte (en lui donnant un nom), puis d'insérer manuellement des appels de tous les endroits appropriés à votre fonction inutile.
  • La correspondance de modèle fournit une redondance la vérification qui intercepte les erreurs.
  • Imbriquées et/ou modèle parallèle les matchs sont optimisés pour vous par la Compilateur F#. L'équivalent doit OO être écrit à la main et constamment reoptimized par la main au cours de le développement, ce qui est prohibitif fastidieux et source d'erreur donc production-qualité OO code tend à être extrêmement lente en comparaison.
  • Active modèles vous permettent d'injecter de l' personnalisé envoi de la sémantique.

9voto

Benjol Points 16334

Du haut de ma tête:

  1. Le compilateur peut dire si vous n'avez pas couvert toutes les possibilités de vos correspondances
  2. Vous pouvez utiliser une correspondance comme affectation
  3. Si vous avez un syndicat discriminé, chaque match peut avoir un "type" différent

5voto

Yttrill Points 2461

Les Tuples ont "," et Variantes ont Ctor args .. ce sont les constructeurs, ils créent des choses.

Les modèles sont des destructeurs, qu'ils déchirer leur part.

Ils sont deux concepts.

Pour mettre cela avec plus de force: la notion d'un tuple ou une variante ne peut être décrite simplement par son constructeur: le destructeur est nécessaire ou la valeur que vous faites est inutile. C'est à ces deux descriptions qui définissent une valeur.

Généralement, nous pensons que des constructeurs comme des données, et les destructeurs comme le contrôle de flux. Variante destructeurs sont autres branches (un des nombreux), tuple destructeurs sont fils parallèles (tous des nombreux).

Le parallélisme est évident dans des opérations comme

(f * g) . (h * k) = (f . h * g . k) 

si vous pensez que de contrôle de l'écoulement au travers d'une fonction, les n-uplets de fournir une façon de diviser un calcul en parallèle des fils de contrôle.

Regardé de cette façon, les expressions sont des façons de composer des tuples et des variantes pour faire compliqué structures de données (penser à un AST).

Et les correspondances de modèle sont des façons de composer les destructeurs (encore une fois, pensez à un AST).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X