2017-09-24 3 views
0

Je suis en train de faire de cette fonction récursive qui prend une int x et une liste, puis supprime la première x quantité d'éléments de la liste:Caml/Ocaml: modèle correspondant à de multiples fonctions argument

let rec nthcdr int_t list_t = 
    match int_t with 
    | 0 -> list_t 
    | _ -> (match list_t with 
      | [] -> [] 
      | h::tail -> nthcdr (int_t -1) tail) 
    ;; 

mais cela ne fonctionne pas, h::tail semble ne jamais correspondre, et il revient toujours []

+1

Impossible de reproduire. Comment le testez-vous? – melpomene

+0

Je suis d'accord avec @melpomene. Vous codez fonctionne pour moi, alors peut-être que c'est votre test qui est défectueux. Voici mon test: 'nthcdr 3 [1; 2; 3; 4; 5]' ==> 'int list = [4; 5] '. –

+1

mes méchants! Je testais à tort. – Jose

Répondre

1

Je voudrais offrir une amélioration au code comme réponse (puisque OP avait déjà trouvé la solution).

Il semble redondant que le motif corresponde à un nombre entier int_t. Vous pouvez le faire bien sûr, mais l'avantage de l'appariement de formes devient évident lorsqu'il est utilisé avec des types de données algébriques comme des enregistrements ou des variantes ou des collections comme des listes. En outre, l'utilisation de if..else pour l'entier rend le code plus propre et différencie le cas de base des cas inductifs.

let rec drop n li = 
    if n = 0 then li else 
    match li with 
    | [] -> [] 
    | h::t -> drop (n-1) t