CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Incompréhension Ocaml

WhatTF
WhatTF
Niveau 7
10 juin 2018 à 15:15:11

Bonjour,

Je débute en Ocaml, et j'apprends par moi-même, donc j'essaye de comprendre comment fonctionne le langage, et comment la machine interprète les choses. Et je suis face à une incompréhension. A la base, je voulais étudier les piles/files. Donc concernant les files, je voulais faire un programme qui renvoie le contenu d'une file, et voici donc ce que j'ai fais :

#open "queue" ;;
let file = new ();;
for i=1 to 5 do add i file done;;

let non_vide f = try peek f ; true with Empty -> false;;

let show_file f = 
	let b = ref true in
		while !b do	
			print_int (peek f);
			take f;
			b := non_vide f;
		done;;
show_file file;; 

let non_vide f = take f ; true;;

Et voici le message d'erreur d'Ocaml : Attention: cette expression est de type int,
mais est utilisée avec le type unit.
(néanmoins, ça m'affiche ce que je voulais)

Donc je pensais que c'était parce que take f enlève la tête de file puis la renvoie, et justement ici vu que c'est dans une séquence, ça ne renverra rien, et ce serait pour ça qu'il m'alarme ? Mais bon, moi ce que je voulais, c'était juste retirer la tête de file. C'est un exemple très con car je pourrais directement enlever l'instruction take f; et remplacer le print_int au-dessus par print_int(take f);, mais ce que je veux c'est comprendre pourquoi il m'affiche ici cette erreur alors que plus haut, j'ai écris :
let non_vide f = try peek f ; true with Empty -> false;;

et là il ne m'affiche aucune erreur, alors que pourtant le peek f renvoie aussi normalement la tête de file, et ici il est utilisé dans une séquence d'instruction et donc ne renvoie rien (donc devrait être aussi de type unit non ?). Je devrais donc avoir la même alarme, non ?

Merci d'avance de m'aider ! :)

Fuligule
Fuligule
Niveau 10
10 juin 2018 à 16:45:43

Donc je pensais que c'était parce que take f enlève la tête de file puis la renvoie, et justement ici vu que c'est dans une séquence, ça ne renverra rien, et ce serait pour ça qu'il m'alarme ?

Oui, c'est pour ça. Si tu veux pas qu'il te mette de warning, tu peux écrire ignore(take f) pour dire au compilateur que la valeur de retour ne t'intéresse pas.

et là il ne m'affiche aucune erreur, alors que pourtant le peek f renvoie aussi normalement la tête de file, et ici il est utilisé dans une séquence d'instruction et donc ne renvoie rien (donc devrait être aussi de type unit non ?). Je devrais donc avoir la même alarme, non ?

Moralement, oui, tu devrais. Mais là OCaml n'arrive pas à s'en rendre compte car il n'a pas assez d'infos.
Quand t'écris :

let non_vide f = try peek f; true with Empty -> false

On ne sait pas de quel type sont les éléments de la file. Peut être que c'est une file qui contient des trucs de type unit, auquel cas il n'y aurait aucun problème.
Au contraire dans ton autre fonction tu as la ligne print_int (peek f); qui lui fait comprendre que les éléments de la file sont des entiers, et donc il te met un warning.
Si tu mets explicitement le type dans ta première fonction, t'auras aussi un warning :

let non_vide (f : int Queue.t) = try peek f; true with Empty -> false
FleurDeLys5
FleurDeLys5
Niveau 7
10 juin 2018 à 17:00:07

Ah, super ! Merci beaucoup, c'est beaucoup plus clair pour moi ! Encore merci ! :ok:

Sous forums
  • Aide à l'achat Mac
  • Internet
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment