[nosmile]T'as eu des cours de caml?
Bon je vais t'expliquer quelques petits trucs. Quand tu fais let rec filtre liste = fun ça veut dire qu'il y a deux arguments, un appellé liste, et un défini par pattern matching. Je pense pas que ça soit ce que tu aies envie de faire.
Avec OCaml, t'as une fonction, List.filter, qui permet de créer une liste en ne gardant que ceux d'une autre liste qui vérifient un prédicat, le prédicat c'est une fonction ('a -> bool), donc la fonction filter c'est ('a -> bool) -> 'a list -> 'a list.
En utilisant filter, c'est simple, ta fonction donne
let filtre liste = filter (function x -> x = 2) liste;;
Mais en caml light, il n'y a pas filter je crois, donc tu dois la définir, c'est pas compliqué, quand il y a la liste vide, on renvoie la liste vide, quand la tête vérifie le prédicat, on l'ajoute à l'appel récursif, sinon on fait juste l'appel récursif.
let rec filter p = function
| [] -> []
| t::q when p t -> t::(filter p q)
| _::q -> filter p q
;;
Tu aurais pu directement définir
let rec filtre = function
| [] -> []
| 2::q -> 2::(filtre q)
| _::q -> filtre q
;;
D'ailleurs c'est un peu con parce que c'est pas récursif terminal, et comme l'ordre des élements n'intervient pas vu qu'il ne restera que des 2, tu peux faire:
let filtre liste =
let rec aux accu = function
| [] -> accu
| 2::q -> filtre (2::accu) q
| _::q -> filtre accu q
in aux [] liste
;;
Et ça, ça sera récursif terminal. (Enfin selon la doc d'OCaml, le fait que ça soit récursif terminal ou non est presque négligeable tant que tes listes font moins de 10 000 élements)