Question

Dans « Programmation F # » Je suis tombé sur un motif correspondant comme celui-ci (j'ai simplifié un peu):

let rec len list = 
  match list with
  | [] -> 0
  | [_] -> 1
  | head :: tail -> 1 + len tail;;

Pratiquement, je comprends que le dernier match reconnaît la tête et la queue de la liste. Conceptuellement, je ne comprends pas pourquoi cela fonctionne. Pour autant que je comprends, :: est l'opérateur contre, ce qui ajoute une valeur en position de tête d'une liste, mais il ne semble pas à moi comme il est utilisé comme un opérateur ici. Dois-je comprendre cela comme une « syntaxe spéciale » pour les listes, où :: est interprété comme un opérateur ou un « modèle de correspondance » selon le contexte? Ou peut-être la même idée étendue pour les types autres que les listes, avec d'autres opérateurs?

Était-ce utile?

La solution

En plus de la réponse de Brian, il y a quelques points qui méritent d'être soulignées. La syntaxe de h::t peut être utilisé à la fois comme opérateur et comme motif:

let l = 1::2::[]                    // As an operator
match l with x::xs -> 1 | [] -> 0   // As a pattern

Cela signifie qu'il est un peu construction spéciale, parce que d'autres opérateurs (par exemple +) ne peuvent pas être utilisés comme modèles (pour décomposer le résultat de retour aux arguments de l'opérateur) - De toute évidence, pour +, ce serait ambigu.

En outre, le motif [_] est intéressant, car il est un exemple de modèle imbriqué. Il compose:

  • _ - Souligné modèle, qui correspond à une valeur et ne se lie pas les symboles
  • [ <pattern> ] - motif list-élément unique, qui correspond à une liste avec des éléments simples et correspond à l'élément de la liste avec le <pattern> imbriquée
  • .

Vous pouvez aussi écrire match 1::[] with | [x] -> x qui renvoie la valeur de l'élément unique (dans ce cas 1).

Autres conseils

Il est une syntaxe spéciale pour les listes. Vous pouvez penser du type de list comme une union discriminée ainsi:

type list<'T> =         // '
    | Nil
    | Cons of 'T * list<'T>

sauf que il y a une syntaxe spéciale qui fait Nil être [] et Cons(h,t) être h::t. Ensuite, il est juste correspondance de motif normale sur une union discriminée. Est-ce que l'aide?

(Peut-être aussi voir cette entrée de blog .)

Il est utilisé comme formatter ou formellement pattern, `la liste » est adaptée aux trois modèles:

[] signifie que la liste est vide

[_] signifie que la liste est un élément, puisque vous ne se soucient pas de ce que l'élément est, alors mettez simplement _ là, vous pouvez également utiliser [a].

:: tête des moyens de queue que la liste ne présente deux parties: une tête et une queue.

Vous pouvez voir F # correspondance de motif comme un puissant si la structure puis d'autre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top