|
Publicité ' | ||||||||||||||||||||||||
|
|
#61 | |||||
|
Invité(e)
![]() Messages : n/a ![]() |
Euh non, je n'avais vraiment pas lu, encore désolé...
Citation:
Code :
|
|||||
00
|
|
|
#62 | ||||
|
Membre Expert
![]() Inscription : avril 2007 Messages : 829 ![]() |
Ça n'a rien d'un hack. Tu représentes ton type comme 'a + 'a, et moi comme 2 * 'a.
En plus, ma version est mieux. Dans ton cas tu dupliques de l'information (tu précises deux fois que le contenu est de type 'a), et ça a un coût. Par exemple pour appliquer une fonction sur l'élément de type 'a, tu dois faire un filtrage alors que moi je peux y accéder directement (les joies de la factorisation) par "snd", quel que soit le type ouvert/fermé de la borne. Alors certes, on peut recoder une fonction "get" qui aurait le même effet que snd, mais ça c'est un hack. De manière générale, un type somme est adapté pour les types disjoints, alors que moi justement je veux qu'ils ne soient pas trop disjoints pour pouvoir les manipuler pareil (sémantiquement, les deux 'a désignent le même objet, si tu veux). Ceci dit, le type openclosed actuel ne marche pas : Open et Closed (ou true et false) doivent avoir des comportements différents selon que l'on est sur une borne inférieure ou supérieure, et ce n'est actuellement pas le cas (donc l'intersection est mal implémentée). Je vais voir ce que je peux faire pour corriger ça. En attendant j'ai refactorisé le truc avec des foncteurs, et je trouve ça plutôt joli : Code :
Code :
|
||||
|
|
00
|
|
|
#63 | |
|
Membre Expert
![]() Inscription : mars 2002 Messages : 962 ![]() |
Citation:
Mais tu sais, c'est ce qu'on avait déjà avec la solution naïve en F#. Plutôt que de trimbaler partout tes opérations de comparaison et de risquer d'insérer des bugs vicieux si jamais tu appelles par erreur = ou <, F# possède déjà ces comparateurs. C'est transparent et ça fait ce qu'on veut. Ca s'appelle =, <, compare, min, max, etc., c'est fournit par défaut et c'est plus joli que eq, inf et autres bidouilles. Si jamais tu veux utiliser une autre fonction de temps en temps, rien ne t'empêche de définir une classe avec une nouvelle fonction de comparaison. Et comme c'est une nouvelle classe, le compilateur t'empêchera de mélanger des types identiques avec une comparateur différent. En bref, 75% du code que tu as écrit n'est pas nécessaire, vu qu'on est dans un thread consacré à F# (si, si |
|
|
|
00
|
|
|
#64 | ||
|
Expert Confirmé Sénior
![]() ![]() |
En Haskell, sur le même modèle que la dernière proposition de Bluestorm :
Code Haskell :
(Tes inf et sup de ton OpenClosed sont un peu bizarres...) (NB : Si on veut utiliser un ordre spécial pour les valeurs (pas celui de sa classe Ord), il suffit d'utiliser un newtype (qui sera supprimé à la compilation) avec une classe Ord personnalisée) -- Jedaï |
||
|
|
00
|
|
|
#65 |
|
Membre Expert
![]() Inscription : avril 2007 Messages : 829 ![]() |
Sauf que les fonctions de comparaison ne remplacent pas sup et inf.
Par exemple, dans le cas d'un type produit, tu as sup (2, 5) (3, 4) = (3, 5). Comment tu fais ça avec tes fonctions de comparaison (sans définir le produit inductivement, je veux dire) ? Alors oui, tu peux aussi faire des classes qui apportent ces opérateurs, mais à ce moment là tu as à priori de nouveau le problème des comparateurs hétérogènes. Comment garantir que les objets que tu manipules ont la même méthode pour inf et sup ? Jedai > oui, le OpenClosed actuel est flawed, on y travaille :-' Je me demande si un Closed | OpenRight | OpenLeft ne pourrait pas faire l'affaire (où Closed veut dire "borne inclue" dans tous les cas, OpenRight borne exclue seulement si il est à droite, et closed sinon, et OpenLeft symétrique), mais je ne sais pas encore (et là je fais autre chose). |
|
|
00
|
|
|
#66 | |
|
Membre Expert
![]() Inscription : mars 2002 Messages : 962 ![]() |
Citation:
S'il y a vraiment besoin du type produit et sans réécrire tout le code (comme tu l'as fait), on peut jouer avec l'introspection. Il suffit de tester dynamiquement si les objets possèdent les méthodes Inf et Sup et les appeler. S'il n'y a pas ces méthodes, on appelle la version normale. OK, au final le code ne sera pas beaucoup plus simple que le tien, mais ça devrait être plus joli pour l'utilisateur. |
|
|
|
00
|
|
|
#67 |
|
Membre Expert
![]() Inscription : avril 2007 Messages : 829 ![]() |
Mais l'introspection ne résout pas le problème de savoir si les méthodes sont bien les mêmes sur les deux objets, si ?
|
|
|
00
|
|
|
#68 | |
![]() ![]() ![]() Nicolas ValléeIngénieur d'études Inscription : décembre 2005 Messages : 9 962 ![]() |
Citation:
Au passage, ceci était censé être une page de code source... on dérive un peu, donc ne vous étonnez pas si je construis d'ici demain matin 2/3 threads avec celui-ci <hs> enfin si jamais je réussis à finir mon ****** parseur ![]() </hs> |
|
|
|
00
|
|
|
#69 |
|
Membre Expert
![]() Inscription : mars 2002 Messages : 962 ![]() |
Non : on a la garantie au moment de la compilation.
Si tu fais une classe qui encapsule un int et possède sa propre méthode de comparaison, le compilateur fera la différence entre les deux (et t'empêchera de les mélanger). L'introspection servirait juste à appeler la méthode Inf ou Sup lorsqu'elle est disponible. J'ai la flemme d'implémenter ça, mais ça semble marcher. |
|
|
00
|
|
|
#70 | |
![]() ![]() Damien GuichardInscription : juin 2007 Messages : 1 512 ![]() |
Citation:
__________________
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
|
|
|
#71 | ||
![]() ![]() Damien GuichardInscription : juin 2007 Messages : 1 512 ![]() |
Un TAD tableaux creux fonctionnels.
Implémenté comme un arbre binaire parfait. L'indice (entier) est décomposé en base 2 puis, de droite à gauche:
Les accesseurs get et set sont les composantes d'un enregistrement t_array. Code :
__________________
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
|
|
|
#72 |
![]() ![]() ![]() Nicolas ValléeIngénieur d'études Inscription : décembre 2005 Messages : 9 962 ![]() |
j'ai un GROS doute...
certes je suis très fatigué, mais quand je lis ton code j'ai l'impression que l'argument node de make_node n'est pas utilisé par ailleurs, le principe d'un tableau est d'avoir un accès en temps constant à un élément... et avec ton arbre binaire, il sera certainement logarithmique c'est normal ?
|
|
|
00
|
|
|
#73 |
|
Membre Expert
![]() Inscription : avril 2007 Messages : 829 ![]() |
Si, il est utilisé par get et set, en tant qu'argument initial à leur fonction "helper' (puique c'est le node courant).
|
|
|
00
|
|
|
#74 | |
![]() ![]() ![]() Nicolas ValléeIngénieur d'études Inscription : décembre 2005 Messages : 9 962 ![]() |
Citation:
par ailleurs, je n'aime pas la construction let rec set ... and get = ... in qui est normalement destinée pour les fonctions mutuellement récurives (odd / even par exemple). ça peut embrouiller les débutants ^^ |
|
|
|
00
|
|
|
#75 | |
![]() ![]() Damien GuichardInscription : juin 2007 Messages : 1 512 ![]() |
Citation:
(donc oui logarithmique dans le pire des cas, c'est-à-dire la clé la plus grande) Cette structure de données est sans doute "inutile", je ne le nie pas, cependant elle me paraît optimale. Je ne vois pas comment obtenir les mêmes propriétés (tableau creux et persistant) en un meilleur temps ou meilleur espace, même avec un style impératif.
__________________
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
|
|
|
#76 | |
![]() ![]() ![]() Nicolas ValléeIngénieur d'études Inscription : décembre 2005 Messages : 9 962 ![]() |
Citation:
ce ne serait pas un peu équivalent aux AVL ? |
|
|
|
00
|
|
|
#77 | |
|
Membre régulier
![]() Inscription : septembre 2007 Messages : 99 ![]() |
Citation:
|
|
|
|
00
|
|
|
#78 | |
![]() ![]() Damien GuichardInscription : juin 2007 Messages : 1 512 ![]() |
NokyDaOneEffectivement mon tad est non borné (a une taille infinie), on pourrait mettre des Big_int en indice ça ne changerait rien à la complexité. Citation:
__________________
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
|
|
|
#79 | |
|
Membre Expert
![]() ![]() Inscription : septembre 2006 Messages : 1 036 ![]() |
Citation:
Concernant ta concaténation de barettes de RAM, je ne peux que te conseiller de te précipiter urgemment sur le premier chapitre du livre d'O'Reilly expliquant le kernel Linux et les accès mémoire : les explications valent aussi pour tous les autres OS. Ca te permettra d'éviter ce genre de commentaires
__________________
When Colt produced the first practical repeating handgun, it gave rise to the saying God created men, but Colt made them equal. |
|
|
|
00
|
|
|
#80 | ||
|
Membre régulier
![]() Inscription : septembre 2007 Messages : 99 ![]() |
Citation:
Citation:
|
||
|
|
00
|
Copyright © 2000-2013 - www.developpez.com