2010-04-29 3 views
4

Existe-t-il un moyen d'obtenir un modèle correspondant à ma valeur avec un nombre négatif? Peu importe le nombre négatif, je dois juste faire correspondre avec un négatif.OCaml: Correspondance avec n'importe quel négatif

j'ai accompli ce que je veux avec ce code simple:

let y = if(n < 0) then 0 else n in 
match y with 
0 -> [] 
| _ -> [x] @ clone x (n - 1) 

Mais je veux éliminer cette déclaration if et juste obtenir pour vérifier un autre cas dans la déclaration match

Répondre

9

Oui, utiliser un gardien:

match n with 
    _ when n < 0 -> [] 
    | _ -> [x] @ clone x (n - 1) 
+0

Oh je vois, je vais devoir faire quelques recherches sur les gardes. Merci! – nicotine

0

Il est le mot-clé quand. Par tête (je ne peux pas tester maintenant)

let y = correspond à n avec | lorsque n < 0 -> 0 | 0 -> [] | _ -> [x] @ clone x (n - 1)

Cependant, même votre exemple ne devrait pas fonctionner. Comme d'un côté vous retournez un int, et de l'autre une liste.

+0

Non, les deux chemins dans le match sont des listes. L'opérateur '@' a le type ''a list ->' une liste -> 'une liste'. – Chuck

+0

Je pense que vous ne comprenez pas mon code, l'instruction if est juste une ligne de code supplémentaire pour définir la valeur de l'instruction de correspondance lorsque n est inférieur à 0. Elle est supposée faire la même chose que le cas 0 et retourner une liste vide. – nicotine

+0

Oh oui! Il était trop tard pour que je réponde à SO hier ... Mon mauvais:/ –

8

Vous pouvez rendre votre code un peu plus propre comme ceci:

match n < 0 with 
| true -> [] 
| false -> [x] @ clone x (n - 1) 

serait encore mieux:

if n < 0 then [] else [x] @ clone x (n - 1) 

En général, si les instructions sont plus claires que les correspondances pour les tests logiques simples.

Pendant que nous y sommes, nous pourrions aussi bien utiliser :: en place de @:

if n < 0 then [] else x :: clone x (n - 1) 
+0

Mais pendant que nous faisons tout cela, nous introduisons aussi un bug où 'n = 0' est mappé à' 0 :: clone x (-1) 'au lieu de' [] '. Il est généralement préférable d'essayer de répondre à la question, comme dans la réponse de Chuck, à la fois pour éviter cela et au cas où la situation réelle serait plus compliquée. –