2017-09-15 5 views
8

Ce code compile très bien en F #, ainsi que OCaml:Pourquoi cette expression F #/OCaml "match" compile-t-elle?

let testmatch k = 
    match k with 
    | jqk3jtl23jtlk123 -> true 

Je l'ai testé dans les deux FSI et utop. Il renvoie toujours true.

Le jqk3jtl23jtlk123 est totalement aléatoire, et son type est inféré comme 'a. Même si je contrains k avec un type de données (par exemple let testmatch (k: int) =) il compile (bien que quelqu'un évidemment contraignant type de » testmatch-int -> bool au lieu de 'a -> bool

Pourriez s'il vous plaît expliquer ce qui se passe précisément.?

  • Pourquoi est-ce le compilateur accepte un littéral jqk3jtl23jtlk123 totalement aléatoire?
  • pourquoi je ne reçois un avertissement match inexhaustive?
  • ce qui est le match en train de faire
  • ?
+7

Vous n'êtes pas correspondant à la valeur 'jqk3jtl23jtlk123', vous créez une valeur nommée' jqk3jtl23jtlk123' qui correspond à ce 'K' est. – Marth

+2

Dans ces langues, vous êtes généralement dans une expression de valeur ou une expression de correspondance de modèle, et ces deux comportements se comportent différemment. La correspondance de modèle se produit après 'match ... with', après' function', et dans n'importe quel paramètre de fonction/méthode. – TheQuickBrownFox

Répondre

15

Dans ce cas, le « littéral » jqk3jtl23jtlk123 est un nom de variable valide, et donc ce que le modèle à gauche de -> décrit est le même que si vous avez écrit let jqk3jtl23jtlk123 = k. Puisque ceci accepte n'importe quelle valeur de k, et ne contraint pas son type parce que la liaison fonctionne pour tous les types, le type déduit est 'a, la valeur la plus générique que le système de type peut représenter.

Si vous transformez le littéral en quelque chose qui n'est pas un identifiant valide, par exemple en commençant par un chiffre, il ne pourra pas être compilé.

Si vous placez le littéral entre guillemets, il sera interprété comme un littéral de valeur de chaîne, vous obtiendrez l'avertissement de correspondance inexhaustif et il contraindra le type de k à string.

9

Il s'agit d'un motif générique qui désigne tout ce que k est égal à. Cela équivaut à

let testmatch k = 
    let jqk3jtl23jtlk123 = k in 
    true