|
Publicité ' | ||||||||||||||||||||||||
|
|
#141 | ||
|
Membre Expert
![]() Inscription : avril 2007 Messages : 829 ![]() |
Code haskell :
Note : ça ne suffit pas pour briller en société, j'ai été démasqué par mon utilisation des underscore_plus_lisibles. |
||
|
|
00
|
|
|
#142 |
![]() ![]() Damien GuichardInscription : juin 2007 Messages : 1 512 ![]() |
Et qu'est-ce qu'elle fait la gendarmerie Haskell quand un véhicule grille un real_cmp [] [] ?
__________________
Du même auteur: le cours OCaml, le dernier article publié, le projet, le blog dvp et le jeu vidéo. Avant de poser une question je lis les règles du forum. |
|
00
|
|
|
#143 | ||
|
Membre Expert
![]() Inscription : avril 2007 Messages : 829 ![]() |
Comme le précise le commentaire, on considère comme réels les séquences *infinies* de booléens. C'est ce que fait la fonction "randoms" (que personne n'est censée connaître et que d'ailleurs j'avais déjà oubliée) : à partir d'un générateur de nombre aléatoire, elle génère un flux infini d'objets tirés au hasard (ici des booléens).
Hop: Code ocaml :
|
||
|
|
00
|
|
|
#144 |
![]() ![]() Damien GuichardInscription : juin 2007 Messages : 1 512 ![]() |
Merci, c'est plus clair comme ça, c'est une co-récursion sur une co-donnée, on ne lui demande pas d'être bien fondée, on lui demande d'être productive.
La gendarmerie te souhaites bonne route
__________________
Du même auteur: le cours OCaml, le dernier article publié, le projet, le blog dvp et le jeu vidéo. Avant de poser une question je lis les règles du forum. |
|
00
|
|
|
#145 | ||||||||||
![]() ![]() Damien GuichardInscription : juin 2007 Messages : 1 512 ![]() |
Il s'agit d'un TAD qui ressemble fort à un arbre binaire ordonné sauf qu'en plus il fait aussi "annuaire inversé". C'est-à-dire que le domaine d'arrivée est lui aussi totalement ordonné et peut faire office de domaine de départ.
On pourrait implanter ce TAD à l'aide d'un quadtree mais alors chaque feuille aurait 4 sous-arbres vides ce qui consomme trop de mémoire, surtout en ces temps où le 64bits devient à la mode. On pourrait aussi implanter ce TAD à l'aide de deux arbres binaires, un pour chaque direction, mais alors on dupliquerait les données. Dans un cas on a "trop" de structure, dans l'autre on a "trop" de données. On va trouver le compromis idéal. Qui consistera à alterner les niveaux, un niveau pour le domaine de départ, un niveau pour le domaine d'arrivée, puis à nouveau un niveau pour le domaine de départ,... Code OCaml :
Grâce à ce type récursif non-régulier il est facile d'exprimer l'insertion et l'appartenance : Code OCaml :
Les requêtes possibles sont de deux sortes puisqu'on peut choisir l'un ou l'autre des deux domaines pour la clé de recherche. On commence par une fonction utilitaire qui permet de traverser les niveaux non-discriminants. Code OCaml :
Code OCaml :
Enfin, on peut compter le nombre d'éléments situés dans le 'rectangle' (xmin,xmax,ymin,ymax). Code OCaml :
Edit:
__________________
Du même auteur: le cours OCaml, le dernier article publié, le projet, le blog dvp et le jeu vidéo. Avant de poser une question je lis les règles du forum. |
||||||||||
|
00
|
|
|
#146 |
|
Membre Expert
![]() Inscription : avril 2007 Messages : 829 ![]() |
C'est une structure diabolique. C'est dingue ce qu'on peut faire avec les types non-réguliers.
Pour ton problème de typage, c'est lié à l'inférence des fonctions récursives. Il faut forcer la récursivité polymorphe en mettant une annotation (possible seulement depuis 3.12) : Code :
let insert : 'a 'b . 'a -> 'b -> ('a, 'b) rev_map -> ('a, 'b) rev_map = ...
|
|
|
10
|
|
|
#147 |
![]() ![]() Damien GuichardInscription : juin 2007 Messages : 1 512 ![]() |
Merci. J'ai corrigé mon code selon tes indications et j'ai ajouté 1 ou 2 idées d'extensions non triviales.
__________________
Du même auteur: le cours OCaml, le dernier article publié, le projet, le blog dvp et le jeu vidéo. Avant de poser une question je lis les règles du forum. |
|
00
|
|
|
#148 |
|
Membre Expert
![]() Inscription : avril 2007 Messages : 829 ![]() |
SpiceGuid > on parle de toi sur StackOverflow ! :-'
J'ai mis en ligne une version un peu nettoyée de ton code : http://hpaste.org/45805/bimap_as_a_nonregular_recursi J'ai retiré les accumulateurs tail-rec parce que je n'arrivais pas à garantir l'ordre en les utilisant (avec ton code, la valeur du nœud est placée en premier dans l'accumulateur, puis les valeurs de droite, puis celles de gauche, alors que je voudrais un retour ordonné). De toute façon, je pense que pour une structure aussi bizarre à premier abord il vaut mieux favoriser la lisibilité plutôt que l'efficacité, au moins pour une première présentation. PS : pour la fonction "rectangle" je pense que tu pourrais commencer par implémenter une fonction qui renvoie le rectangle sous la forme de cette même structure de donnée, c'est à dire qui se contente d'"élager" les bords. Je ne sais pas si c'est évident (peut-être qu'il faut faire des fusions ?). |
|
|
00
|
|
|
#149 | ||||
![]() ![]() Damien GuichardInscription : juin 2007 Messages : 1 512 ![]() |
Pour ce qui est de la structure de données je t'encourage à chercher du côté du Kd-Tree.
C'est généralisable à plus de 2 dimensions : Code OCaml :
Pour ce qui est de la fonction "rectangle" je n'ai pas trouvé plus simple que la répétition brutale pour séparer le cas (u,v)::acc du cas (v,u)::acc : Code OCaml :
__________________
Du même auteur: le cours OCaml, le dernier article publié, le projet, le blog dvp et le jeu vidéo. Avant de poser une question je lis les règles du forum. |
||||
|
00
|
|
|
#150 | ||||
|
Membre Expert
![]() Inscription : avril 2007 Messages : 829 ![]() |
Tu pourrais t'inspirer des fonctions suivantes (qui me semble être comme rectangle, mais sans bornes) :
Code :
Code :
Version complète : http://hpaste.org/45831/bimap_as_a_nonregular_recursi |
||||
|
|
10
|
|
|
#151 | |||
![]() ![]() Damien GuichardInscription : juin 2007 Messages : 1 512 ![]() |
Citation:
tu as eu l'idée lumineuse que j'espérais, malheureusement je ne peux pas modifier le code dans mon message original (parce que, pour une raison que j'ignore, je n'y ai pas de bouton Editer)Code OCaml 3.12 :
__________________
Du même auteur: le cours OCaml, le dernier article publié, le projet, le blog dvp et le jeu vidéo. Avant de poser une question je lis les règles du forum. |
|||
|
00
|
|
|
#152 | |
![]() ![]() ![]() Nicolas ValléeIngénieur d'études Inscription : décembre 2005 Messages : 9 961 ![]() |
Citation:
![]() après un certain temps, les messages ne sont plus éditables afin d'éviter qu'un membre se mette à saboter ses contributions une fois le problème résolu |
|
|
|
10
|
|
|
#153 | ||
|
Membre Expert
![]() Inscription : avril 2007 Messages : 829 ![]() |
Un petit code d'exemple pour montrer comment faire un "make_matrix" généralisé en dimension arbitraire à la sauce "functional unparsing" (Olivier Danvy).
Code :
|
||
|
|
00
|
|
|
#154 | ||
![]() ![]() Damien GuichardInscription : juin 2007 Messages : 1 512 ![]() |
Souvent, par facilité, pour coder un environnment on utilise une simple liste d'association d'un string vers un élément.
Pour faire un peu mieux on peut désigner les variables par leur indice De Bruijn et demander List.nth. Ici je propose une solution similaire, on désigne toujours les variables par leur indice De Bruijn mais cette fois on demande l'élément de rang correspondant dans un arbre de braun. Code OCaml :
edit: non, je n'ai pas fait de bench
__________________
Du même auteur: le cours OCaml, le dernier article publié, le projet, le blog dvp et le jeu vidéo. Avant de poser une question je lis les règles du forum. |
||
|
00
|
|
|
#155 |
|
Membre Expert
![]() Inscription : avril 2007 Messages : 829 ![]() |
C'est moins spécialisé mais j'avais essayé, pour un petit interprète de bytecode, d'utiliser un Map.Make(Int) comme environnement, et malgré la meilleure complexité théorique c'était sensiblement moins bon qu'une liste en pratique; je pense que ça venait du fait que la plupart des variables étaient en fait sur de "petits" indices (mais ça fait combien ? Je dirais inférieur à 5) et que la complexité en plus n'était donc pas rentabilisée.
|
|
|
00
|
|
|
#156 |
|
Membre chevronné
![]() Inscription : mars 2010 Messages : 281 ![]() |
|
|
|
00
|
|
|
#157 |
![]() ![]() Damien GuichardInscription : juin 2007 Messages : 1 512 ![]() |
Et oui, il y a forcément un nombre d'éléments en dessous duquel un algo avancé fait moins bien que l'algo naïf. Le contournement habituel consiste à trouver le point où ça bascule (par exemple environ une trentaine de digits pour la multiplication Karatsuba) et à passer à l'algo avancé seulement quand on le dépasse.
Mais le cas qui nous occupe, c'est trop dynamique, il n'y a pas de solution toute prête qui me vienne immédiatement à l'esprit. En plus ça dépend de la fréquence d'accès à la variable. Car l'insertion/suppression est plus coûteuse dans un Map.Make(Int) qu'en tête d'une liste. C'est l'accès aléatoire qui est plus rapide, mais seulement à partir d'un certain entier. En pratique je suppose que les accès à une variable sont d'autant plus fréquents que son indice de Bruijn est petit, ça rend la liste d'autant plus difficile à battre.
__________________
Du même auteur: le cours OCaml, le dernier article publié, le projet, le blog dvp et le jeu vidéo. Avant de poser une question je lis les règles du forum. |
|
00
|
|
|
#158 | ||
![]() ![]() Damien GuichardInscription : juin 2007 Messages : 1 512 ![]() |
Code OCaml :
__________________
Du même auteur: le cours OCaml, le dernier article publié, le projet, le blog dvp et le jeu vidéo. Avant de poser une question je lis les règles du forum. |
||
|
00
|
Copyright © 2000-2013 - www.developpez.com