[ocaml] erreur de syntax oui, mais où ?

Fermé
dead brain - 18 févr. 2015 à 18:47
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 - 18 févr. 2015 à 20:13
Salut !

J'ai attaqué le ocaml ce matin et je me retrouve face à pas mal d'erreur de syntaxe.
Sans doute de grosses bourde de débutant qui connait pas les subtilité du langage mais ça tombe bien ! c'est mon cas !

Bref, je vous explique le principe :
Dans une boucle, je demande au user de rentrer une valeur, j'ajoute cette dernière dans une liste et je fais la moyenne des données présentes dans la liste.

Le code :


let rec longeur ls =
match ls with
| [] -> 0
| head :: queue -> 1 + longeur queue ;;

let rec somme ls =
match ls with
| [] -> 0
| head :: queue -> head + somme queue;;

let moyenne ls = float_of_int (somme ls) /. float_of_int (longeur ls) ;;

let main x =
let tab = []
let intern_loop() =
let nbr = get_user_input in
tab := nbr :: tab
moyenne tab
in intern_loop() ;;


Les erreurs semblent être liées aux lignes
 let tab = [] ; 

et
 nbr :: tab  (* ajout dans le tableau *)


Le retour du compilateur :
$ ocamlc typestat.ml
$ ocamlc typestat.ml
File "typestat.ml", line 15, characters 4-7:
Error: Syntax error


mais sincèrement, étant tout frais la dedans, j'ai pas le recul pour comprendre.

Merci d'avance !

1 réponse

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
18 févr. 2015 à 19:00
Bonjour,

Ligne 15 (comme indiqué par le compilateur) il te manque un
in
pour déclarer (let) une variable à l'intérieur d'une déclaration (let) de la fonction.

let tab = [] in

Mais clairement l'imbrication de fonctions doit être éviter, donc découpes ton main pour en sortir intern_loop.
0
Bon, suite a tes recommandations, j'ai fait des modifs, et une chose est sûre : je maitrise pas les scopes ^^'

let rec longeur ls =
match ls with
| [] -> 0
| head :: queue -> 1 + longeur queue ;;

let rec somme ls =
match ls with
| [] -> 0
| head :: queue -> head + somme queue;;

let moyenne ls = float_of_int(somme ls) /. float_of_int(longeur ls) ;;

let rec infinite_loop tableau =
moyenne tableau ;;
let nbr = read_int() in
infinite_loop (nbr :: tableau)

let main x =
let values = [] in
infinite_loop values ;;


amène des erreur unbound values.
File "typestat.ml", line 16, characters 31-38:
Error: Unbound value tableau


alors que tableau est fourni en argument ...

qu'on soit clair : il y a aussi des problèmes d'algo, plein. mais ça, je verrais par moi même, ici le but c'est de comprendre mes erreurs de syntaxe.
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
Modifié par KX le 18/02/2015 à 20:15
La déclaration de
infinite_loop 
se termine ligne 14 après
;;
donc les lignes qui suivent ne sont plus dans cette déclaration, en particulier on ne peut plus utiliser
tableau
ligne 16.
0