Un problème ici est que vous retournez deux types différents: un int pour une liste vide, ou un tuple autrement. Il doit être l'un ou l'autre.
Un autre problème est que vous essayez d'ajouter 1 à test
, mais test
est une fonction, pas une valeur. Vous devez appeler test sur autre chose pour qu'il renvoie une valeur, mais même dans ce cas, il est supposé retourner un tuple, que vous ne pouvez pas ajouter à un entier.
Je n'arrive pas à comprendre ce que vous voulez que le code fasse, mais si vous mettez à jour votre question avec cette information, je peux vous aider davantage.
Une supposition que j'ai est que vous voulez compter les nombres positifs dans la liste, dans ce cas, vous pouvez l'écrire comme ceci:
let rec test l =
match l with [] -> 0
| x::xs -> if x > 0 then 1 + (test xs)
else test xs;;
Mise à jour: puisque vous avez modifié pour clarifier le problème, modifiez le code ci-dessus comme suit:
let test l =
let rec test_helper l pos nonpos =
match l with [] -> (pos, nonpos)
| x::xs -> if x > 0 then test_helper xs 1+pos, nonpos
else test_helper xs pos 1+nonpos
in test_helper l 0 0;;
L'utilisation des accumulateurs aide beaucoup dans ce cas. Cela rend également la fonction récursive à la queue, ce qui est toujours une bonne pratique.
Pourriez-vous fournir plus de détails sur ce que cette fonction est censée renvoyer? Que représente la paire d'entiers? – goggin13
donc il devrait retourner une paire de nombres entiers comme (x, y) qui est tuple dans ocaml que seul le problème que j'ai rencontré est le calcul de tuple .. donc c'est comme si un élément de liste est moins alors un certain nombre (x +1, y) else (x, y + 1) donc la valeur de retour sera (x, y) où x est le nombre d'éléments qui est supérieur à un certain nombre et y est inférieur à – REALFREE