La bonne convention est de choisir 1 pour le produit de la liste vide. Car d'une part la décomposition de 1 donne la liste vide, et d'autre part cette définition permet l'induction à partir de la liste vide. Soit tout simplement :
let rec produit xs = match xs with | [] -> 1 | x::xs -> x*produit xs ;;