Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mars 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : mars 2019
    Messages : 2
    Points : 1
    Points
    1

    Par défaut Soucis de syntaxe Ocaml

    Bonjour à tous, ayant commencé Ocaml il y a peu (de manière purement fonctionnelle) il y a des choses que je ne comprends pas, surtout sur la syntaxe, l'indentation propre, la place des parenthèses, des points-virgules simples (j'ai compris l'utilité des ";;" qui servent à finir une instruction). Je suis surtout déconcerté face à un petit code sur le tri fusion, le premier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    let rec decoupe l = (* fonction qui découpe une liste en deux sous listes en alternant "gauche droite" *)
    	match l with
    	|x::y::ll -> let (l1,l2) = decoupe ll in
    		(x::l1,y::l2)
    	|x::ll -> let (l1,l2) = decoupe ll in
    		(x::l1,l2)
    	|[] -> ([],[]);;
     
    (* relations d'ordres pour des scalaires *)
     
    let sup x y =
    	if x > y = true then true
    	else false;;
    let inf x y =
    	if x < y = true then true
    	else false;;
     
    (* entrelacement des listes sans généricité *)
     
    let rec fusion l1 l2 =
    	match (l1,l2) with
    	|([],[]) -> []
    	|(x::ll1,[]) -> let l = fusion ll1 [] in x::l
    	|([],y::ll2) -> let l = fusion [] ll2 in y::l
    	|(x::ll1,y::ll2)-> if (x > y) = false
    		then let l = fusion ll1 l2 in 
    			x::l
    		else let l = fusion l1 ll2 in
    			y::l;;
     
    (* tri fusion sans généricité *)
    let rec tri_fusion l =
    	match l with
    	|[] -> [];
    	|x::[] -> l;
    	|_ -> 
    		begin
    			let (l1,l2) = decoupe l in 
    			fusion (tri_fusion (l1)) (tri_fusion (l2));
    		end;;
    qui est totalement opérationnel, tandis que le second qui se veut générique (donc modification de la fusion et du tri fusion) ne fonctionne pas du tout (syntaxe invalide) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    let rec fusion l1 l2 rel = (* rel étant la relation d'ordre utilisée *)
    	match (l1,l2) with
    	|([],[]) -> []
    	|(x::ll1,[]) -> let l = fusion ll1 [] rel in x::l
    	|([],y::ll2) -> let l = fusion [] ll2 rel in y::l
    	|(x::ll1,y::ll2)-> if (rel x y) = false
    		then let l = fusion ll1 l2 rel in 
    			x::l
    		else let l = fusion l1 ll2 rel in
    			y::l;;
    let rec tri_fusion l rel = 
    	match l with
    	|[] -> [];
    	|x::[] -> l;
    	|_ -> 
    		begin
    			let (l1,l2) = decoupe l in 
    			fusion (tri_fusion (l1) rel) (tri_fusion (l2) rel) rel;
    		end;;
    En tout cas merci d'avance pour votre aide.
    Bonne fin de journée à tous.

  2. #2
    Membre émérite
    Avatar de SpiceGuid
    Homme Profil pro
    Inscrit en
    juin 2007
    Messages
    1 686
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : juin 2007
    Messages : 1 686
    Points : 2 932
    Points
    2 932

    Par défaut Le problème vient de ta configuration, pas de ton code.

    Bonjour,
    Et bienvenue sur les forums de developpez.net

    C'est du code idiomatique qui fonctionne correctement. Pas d'erreur de typage. Pas d'erreur de syntaxe.
    Code OCaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    # tri_fusion [42;48;56;23;41;71] (>);;
    - : int list = [23; 41; 42; 48; 56; 71]

    Est-ce que tu utilises une console windows du genre OCamlWin ou OCamlWinPlus ?
    Si oui alors opte plutôt pour Crimson Editor(pour windows) ou Geany(pour linux) plus la commande ocamlc.opt.exe -w +A-ez $(FileName).

    Sinon est-ce que tu utilises un éditeur ocaml comme Merlin ou utop ?
    Du même auteur: le cours OCaml, le dernier article publié, le blog dvp et le jeu vidéo.
    Avant de poser une question je lis les règles du forum.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mars 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : mars 2019
    Messages : 2
    Points : 1
    Points
    1

    Par défaut

    Bonsoir SpiceGuid, tout d'abord merci de m'avoir répondu aussi vite. C'est vrai que c'est assez spécial de passer de l'impératif à un langage fonctionnel. Pour répondre, j'utilise l'interpréteur interactif sur Linux Mint (avant je compilais à la main sur Powershell Windows mais j'ai vite abandonné et suis passé sur une VM).

Discussions similaires

  1. petit soucis de syntaxe
    Par teen6517 dans le forum Formulaires
    Réponses: 2
    Dernier message: 03/04/2007, 19h58
  2. Soucis de Syntaxe Popup
    Par kaki33 dans le forum Syntaxe
    Réponses: 2
    Dernier message: 28/03/2006, 09h12
  3. Réponses: 4
    Dernier message: 20/03/2006, 11h21
  4. [ASP] Souci de syntaxe
    Par Mvu dans le forum ASP
    Réponses: 6
    Dernier message: 04/02/2006, 08h38
  5. [langage] ptit souci de syntaxe
    Par marouanitos dans le forum Langage
    Réponses: 2
    Dernier message: 26/09/2003, 10h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo