Maths et Délires
Des maths et des délires
 

Maths et Délires Index du Forum

 FAQFAQ   RechercherRechercher   Liste des MembresListe des Membres   Groupes d'utilisateursGroupes d'utilisateurs   S'enregistrerS'enregistrer 
 ProfilProfil   Se connecter pour vérifier ses messages privésSe connecter pour vérifier ses messages privés   ConnexionConnexion 

Caml et le typage...
Aller à la page 1, 2  Suivante
 
Poster un nouveau sujet   Répondre au sujet    Maths et Délires Index du Forum -> Mathématiques taupinales et supérieures
Voir le sujet précédent :: Voir le sujet suivant  
Auteur Message
Thibaut
Geek mutant fou


Inscrit le: 23 Juin 2005
Messages: 3226
Localisation: MB 318, Montrouge

MessagePosté le: 27 Oct 2006, 10:20    Sujet du message: Caml et le typage... Répondre en citant

Que pensez-vous des codes suivants ?
Code:
let pair x y z = z x y;;
let f1 y = pair y y;;
let f2 y = f1 (f1 y);;
let f3 y = f2 (f2 y);;
let f4 y = f3 (f3 y);;
let f5 y = f4 (f4 y);;


Code:
let o f g x = f (g x);;
o;;
o o;;
o o o;;
o o o o;;
o o o o o;;
o o o o o o;;
o o o o o o o;;
o o o o o o o o;;
o o o o o o o o o;;
o o o o o o o o o o;;


Code:
let rec f x = f x;;
f 0;;


Code:
let f =
 let g = fun x->x in
  g:=fun x-> !g x;
  !g;;
f 1;;


Code:
let f x = x x;;
f f;;
let g x = x x x;;

(essayer avec et sans l'option rectypes...)

Code:
let rec f x = f 1;f true;;
let rec g x = g 1;g 2;;
g 0;;


Code:
(fun f->(fun x->f (f x))) (fun y->0);;
let f y = 0 in (fun x->f (f x));;
let g f x = f (f x) in g (fun y->0);;


Code:
(fun f->f true, f 0) (fun x->x);;
let id x = x in f true, f 0;;
let rec f x = f true, f 0 in f (fun x->x);;


Code:
let rec f = fun x->(((fun z->fun y->z) 0) (f 0));;

Son type n'est pas le même dans la version de 1989 et celle de 1991...

Code:
let rec map f = function []->[]|h::t->(f h)::map f t;;
let rec map f = function []->[]|h::t->(f h)::map f t
and incr_l = map (fun x->x+1);;


Et bien sûr, le classique :
Code:
type arbre = Nil | Noeud of arbre*int*arbre;;
let rec hauteur = function Nil-> -1|Noeud(x,_,y)->1+max (hauteur x) (hauteur y);;
type arbre = Nil | Noeuf of arbre*int*arbre;;
hauteur Nil;;

_________________
"“The Sith who were famous for being bad, Jacen, were the way they were because they were badly damaged men or women to start with. Not because they were Sith. Usually, they were weak, or deluded, or greedy to begin with. Like your grandfather.”"
Shira Brie aka Lumiya aka Brisha Syo, Legacy of the Force, #1: Betrayal
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé Envoyer l'e-mail
antony
Mathématicien(ne) fou (folle)


Inscrit le: 24 Juin 2005
Messages: 2176
Localisation: Vincennes/Aulnay

MessagePosté le: 27 Oct 2006, 19:28    Sujet du message: Répondre en citant

Le message d'erreur du dernier est en fait assez compréhensible : quand tu redéfinis le type arbre, tu écrases le précédent, auquel fait pourtant référence le typage de la fonction, d'où le message d'erreur "This variable has type arbre (nouveau) but is used with type arbre (ancien)"... de même que quand tu fais let c = 1 in let c = 2 in ... la première définition de c n'est plus récupérable.
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
Thibaut
Geek mutant fou


Inscrit le: 23 Juin 2005
Messages: 3226
Localisation: MB 318, Montrouge

MessagePosté le: 28 Oct 2006, 8:21    Sujet du message: Répondre en citant

Je sais, je sais, mais le message d'erreur en lui-même est tellement magnifique que je n'ai pas pu m'empêcher de le remettre...
Que penses-tu des autres ?
_________________
"“The Sith who were famous for being bad, Jacen, were the way they were because they were badly damaged men or women to start with. Not because they were Sith. Usually, they were weak, or deluded, or greedy to begin with. Like your grandfather.”"
Shira Brie aka Lumiya aka Brisha Syo, Legacy of the Force, #1: Betrayal
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé Envoyer l'e-mail
antony
Mathématicien(ne) fou (folle)


Inscrit le: 24 Juin 2005
Messages: 2176
Localisation: Vincennes/Aulnay

MessagePosté le: 28 Oct 2006, 10:26    Sujet du message: Répondre en citant

Bizarrement, OCaml refuse l'avant-dernier code chez moi... tu sais pourquoi ?
Sinon, en ce qui concerne les autres, mouais... disons que les problèmes de typage ont presque toujours été plus des ennuis que des sources d'intérêt à mes yeux.
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
Emir Sabah al Sabah
Légère tendance aux maths et aux délires


Inscrit le: 08 Mar 2006
Messages: 96

MessagePosté le: 28 Oct 2006, 19:04    Sujet du message: Re: Caml et le typage... Répondre en citant

Thibaut a écrit:

Code:
let rec f = fun x->(((fun z->fun y->z) 0) (f 0));;

Son type n'est pas le même dans la version de 1989 et celle de 1991...


Merci pour tes participations toujours aussi instructives. Pense tu que cela puisse être relié à la chute du mur de berlin ?
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
metalogik
Mathématicien(ne)


Inscrit le: 24 Juin 2005
Messages: 1779
Localisation: devant un PC

MessagePosté le: 28 Oct 2006, 22:21    Sujet du message: Répondre en citant

ben sûrement : les maçons soviétiques ont dû se mettre à l'informatique...
_________________
A VOS RANGS ! FIXE !

Repos.
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
Thibaut
Geek mutant fou


Inscrit le: 23 Juin 2005
Messages: 3226
Localisation: MB 318, Montrouge

MessagePosté le: 28 Oct 2006, 23:20    Sujet du message: Répondre en citant

Citation:
Bizarrement, OCaml refuse l'avant-dernier code chez moi... tu sais pourquoi ?

Oui. Missa s'être planté.
Code:
let rec map f = function []->[]|h::t->(f h)::map f t;;
 let rec map f = function []->[]|h::t->(f h)::map f t
 and incr_l l = map (fun x->x+1) l;;

_________________
"“The Sith who were famous for being bad, Jacen, were the way they were because they were badly damaged men or women to start with. Not because they were Sith. Usually, they were weak, or deluded, or greedy to begin with. Like your grandfather.”"
Shira Brie aka Lumiya aka Brisha Syo, Legacy of the Force, #1: Betrayal
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé Envoyer l'e-mail
Thibaut
Geek mutant fou


Inscrit le: 23 Juin 2005
Messages: 3226
Localisation: MB 318, Montrouge

MessagePosté le: 23 Jan 2007, 2:49    Sujet du message: Répondre en citant

Tiens, j'ai enfin trouvé une fonction quelques fonctions d'intérêt non nul qu'on ne peut définir qu'à l'aide de l'option rectypes. Moi qui croyais que ça ne faisait que des fonctions qui bouclent tout le temps, ou qui retourne l'un de leurs arguments...

Code:

let s l = l::l;;

let rec rang = function
|[]->0
|t::q->max (1+rang t) (rang q);;

(* Quelques fonctions auxiliaires "classiques" *)
let insere x l = if List.mem x l then l else x::l;;
let rec union_bin u = function
|[]->u
|t::q->union_bin (insere t u) q;;

let rec union = function
|[]->[]
|t::q->union_bin (union q) t;;

(* Nouvelle fonction *)
let rec clot_trans l = if l=[] then l else union_bin (clot_trans (union l)) l;;

(* Encore des fonctions auxiliaires "classiques" *)
let rec itere f n x = if n=0 then x else itere f (n-1) (f x);;

let rec ens_part = function
|[]->[[]]
|t::q->let p = ens_part q in p @ List.map (function l->t::l) p;;

(* Puis encore deux nouvelles *)
let v n = itere ens_part n [];;
let ord_of_int n = itere s n [];;

_________________
"“The Sith who were famous for being bad, Jacen, were the way they were because they were badly damaged men or women to start with. Not because they were Sith. Usually, they were weak, or deluded, or greedy to begin with. Like your grandfather.”"
Shira Brie aka Lumiya aka Brisha Syo, Legacy of the Force, #1: Betrayal
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé Envoyer l'e-mail
antony
Mathématicien(ne) fou (folle)


Inscrit le: 24 Juin 2005
Messages: 2176
Localisation: Vincennes/Aulnay

MessagePosté le: 23 Jan 2007, 10:30    Sujet du message: Répondre en citant

Beurk... j'ai à peu près suivi jusqu'à itere, mais je ne vois pas du tout ce que fait ens_part...
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
Thibaut
Geek mutant fou


Inscrit le: 23 Juin 2005
Messages: 3226
Localisation: MB 318, Montrouge

MessagePosté le: 23 Jan 2007, 10:52    Sujet du message: Répondre en citant

Oh ?
Si ça n'est pas une fonction qui retourne l'ensemble des parties de son argument (en assimilant liste et ensemble), je n'ai plus qu'à retourner en taupe...
De toute façon, à part en considérant les listes comme des ensembles, je ne vois pas quel sens intéressant on puisse donner à ces fonctions...
_________________
"“The Sith who were famous for being bad, Jacen, were the way they were because they were badly damaged men or women to start with. Not because they were Sith. Usually, they were weak, or deluded, or greedy to begin with. Like your grandfather.”"
Shira Brie aka Lumiya aka Brisha Syo, Legacy of the Force, #1: Betrayal
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé Envoyer l'e-mail
antony
Mathématicien(ne) fou (folle)


Inscrit le: 24 Juin 2005
Messages: 2176
Localisation: Vincennes/Aulnay

MessagePosté le: 23 Jan 2007, 12:02    Sujet du message: Répondre en citant

Groumpf... oui, évidemment. Et rectypes là-dedans ?
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
Thibaut
Geek mutant fou


Inscrit le: 23 Juin 2005
Messages: 3226
Localisation: MB 318, Montrouge

MessagePosté le: 23 Jan 2007, 12:30    Sujet du message: Répondre en citant

C'est l'option pour autoriser le type
Code:
'a list as 'a
, qui apparaît dans chacune des fonctions "nouvelles".
Tu peux même lui donner un nom par
Code:
type ens = ens list;;

_________________
"“The Sith who were famous for being bad, Jacen, were the way they were because they were badly damaged men or women to start with. Not because they were Sith. Usually, they were weak, or deluded, or greedy to begin with. Like your grandfather.”"
Shira Brie aka Lumiya aka Brisha Syo, Legacy of the Force, #1: Betrayal
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé Envoyer l'e-mail
antony
Mathématicien(ne) fou (folle)


Inscrit le: 24 Juin 2005
Messages: 2176
Localisation: Vincennes/Aulnay

MessagePosté le: 23 Jan 2007, 19:06    Sujet du message: Répondre en citant

Et sans rectypes, il refuse de compiler, j'imagine ?
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
Thibaut
Geek mutant fou


Inscrit le: 23 Juin 2005
Messages: 3226
Localisation: MB 318, Montrouge

MessagePosté le: 23 Jan 2007, 19:34    Sujet du message: Répondre en citant

Yep. Sauf les fonctions que j'ai qualifiées de classiques.
_________________
"“The Sith who were famous for being bad, Jacen, were the way they were because they were badly damaged men or women to start with. Not because they were Sith. Usually, they were weak, or deluded, or greedy to begin with. Like your grandfather.”"
Shira Brie aka Lumiya aka Brisha Syo, Legacy of the Force, #1: Betrayal
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé Envoyer l'e-mail
antony
Mathématicien(ne) fou (folle)


Inscrit le: 24 Juin 2005
Messages: 2176
Localisation: Vincennes/Aulnay

MessagePosté le: 24 Jan 2007, 10:03    Sujet du message: Répondre en citant

Ca ne marche pas,
type a = Nil | a * a ;;
?
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
Thibaut
Geek mutant fou


Inscrit le: 23 Juin 2005
Messages: 3226
Localisation: MB 318, Montrouge

MessagePosté le: 24 Jan 2007, 11:41    Sujet du message: Répondre en citant

J'ai peur qu'il te faille un constructeur de type, du genre :
Code:
type a = Nil | Noeud of a*a

Mais je vais vérifier...
Edit : Je confirme. Par contre :
Code:
type a = a*a
marche tout à fait (avec rectypes, bien sûr), puisqu'il s'agit du type
Code:
'a * 'a as 'a
.
_________________
"“The Sith who were famous for being bad, Jacen, were the way they were because they were badly damaged men or women to start with. Not because they were Sith. Usually, they were weak, or deluded, or greedy to begin with. Like your grandfather.”"
Shira Brie aka Lumiya aka Brisha Syo, Legacy of the Force, #1: Betrayal
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé Envoyer l'e-mail
antony
Mathématicien(ne) fou (folle)


Inscrit le: 24 Juin 2005
Messages: 2176
Localisation: Vincennes/Aulnay

MessagePosté le: 24 Jan 2007, 12:59    Sujet du message: Répondre en citant

Oui, bien sûr, mais je voulais dire, est-ce que ma proposition marche sans rectypes ?

Et sinon, on peut encore essayer
Code:
type 'a cons = Nil | Cons of 'a * 'a ;;
type a = b cons and b = a cons ;;

qui compile sûrement sans rectypes.

Et si on veut identifier les types a et b, on doit pouvoir faire
Code:
type a_or_b = A | B ;;
type 'a cons = Nil | Cons of 'a * 'a ;;
type a = b cons and b = a cons ;;
type rec_list = {a : a ; b : b ; ab = a_or_b} ;;

où je triche un peu, une rec_list l contient en fait deux listes dont une seule est valable (celle indiquée par l.ab). A chaque fois que je veux coder une fonction prenant un argument rec_list, je commence par regarder quelle est la liste valable et ensuite j'utilise les bon filtrages pour que ça marche.

Oui, c'est un peu plus simple avec rectypes Wink
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
Thibaut
Geek mutant fou


Inscrit le: 23 Juin 2005
Messages: 3226
Localisation: MB 318, Montrouge

MessagePosté le: 25 Jan 2007, 1:05    Sujet du message: Répondre en citant

antony a écrit:
Oui, bien sûr, mais je voulais dire, est-ce que ma proposition marche sans rectypes ?

Tu parles de
Code:
type a = Nil | a * a ;;
? Ca ne marche ni avec rectypes ni sans (Caml me dit "Syntax error, en pointant sur le premier "a" qui suit le "|").

antony a écrit:
qui compile sûrement sans rectypes.

La première ligne marche avec ou sans rectypes. Pour la deuxième, il faut rectypes (sinon : "The type abbreviation a is cyclic").

Par contre, si tu veux faire
Code:
type 'a cons = Nil | Cons of ('a cons * 'a cons)
ça marche aussi bien avec rectypes que sans, c'est même la construction classique des arbres binaires non étiquetés.

Et du coup, la fin que tu fais ne fonctionne qu'avec rectypes.
_________________
"“The Sith who were famous for being bad, Jacen, were the way they were because they were badly damaged men or women to start with. Not because they were Sith. Usually, they were weak, or deluded, or greedy to begin with. Like your grandfather.”"
Shira Brie aka Lumiya aka Brisha Syo, Legacy of the Force, #1: Betrayal
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé Envoyer l'e-mail
antony
Mathématicien(ne) fou (folle)


Inscrit le: 24 Juin 2005
Messages: 2176
Localisation: Vincennes/Aulnay

MessagePosté le: 25 Jan 2007, 12:51    Sujet du message: Répondre en citant

En fait, je ne comprends pas pourquoi
Code:
type 'a cons = Nil | Cons of 'a cons
(oui, j'ai oublié un constructeur dans ma proposition initiale) ne compile pas sans rectypes alors que
Code:
type 'a cons = Nil | Cons of ('a cons * 'a cons)
le peut...
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
Thibaut
Geek mutant fou


Inscrit le: 23 Juin 2005
Messages: 3226
Localisation: MB 318, Montrouge

MessagePosté le: 25 Jan 2007, 14:23    Sujet du message: Répondre en citant

antony a écrit:
En fait, je ne comprends pas pourquoi
Code:
type 'a cons = Nil | Cons of 'a cons
(oui, j'ai oublié un constructeur dans ma proposition initiale) ne compile pas sans rectypes

Sisi, ça marche sans rectypes. Heureusement, d'ailleurs...
_________________
"“The Sith who were famous for being bad, Jacen, were the way they were because they were badly damaged men or women to start with. Not because they were Sith. Usually, they were weak, or deluded, or greedy to begin with. Like your grandfather.”"
Shira Brie aka Lumiya aka Brisha Syo, Legacy of the Force, #1: Betrayal
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé Envoyer l'e-mail
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    Maths et Délires Index du Forum -> Mathématiques taupinales et supérieures Toutes les heures sont au format GMT + 2 Heures
Aller à la page 1, 2  Suivante
Page 1 sur 2

 
Sauter vers:  
Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum


Powered by phpBB © 2001, 2005 phpBB Group
Traduction par : phpBB-fr.com