|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
![]() ![]() ![]() Nicolas ValléeIngénieur d'études Inscription : décembre 2005 Messages : 9 961 ![]() |
Vous avez des codes sources dans les langages fonctionnels ?
Vous pensez que ces codes sources peuvent aider d'autres personnes ? Vous souhaitez partager vos codes avec des internautes ? Dans ce cas, participez à l'enrichissement des pages de codes sources de developpez.com et postez à la suite Pour chaque proposition, merci d'expliquer en quelques mots ce que fait le code, s'il nécessite des bibliothèques ou des options particulières. |
|
|
00
|
|
|
#2 | ||
|
Membre éclairé
![]() Inscription : mai 2004 Messages : 338 ![]() |
Voici quelques fonctions de traitement des graphes que j'avais fait il y a quelques années pour un exercice scolaire. Cela offre une alternative intéressante je trouve à l'implémentation des graphes utilisée dans le tutoriel de millie (cf forum cours et tutoriels). Je ne sais pas si elle est meilleure ou quoi, je n'ai jamais cherché à savoir, je l'avais juste trouvée jolie à ce moment là
Je donne tout le source tel quel. Il y a quelques fonctions inutiles, c'est sûrement parce qu'on avait pas le droit à grand chose dans le cadre de l'exercice. Chaque fonction est précédée d'un cartouche expliquant précisément ce qu'elle fait. C'est du Caml Light Code :
|
||
|
|
10
|
|
|
#3 | ||||||||||||||||
|
Membre à l'essai
![]() Étudiant Inscription : mai 2007 Messages : 47 ![]() |
Bonjour à tous,
Voici mon premier code en Camllight concernant le traitement d'images numériques. Ce programme calcul le produit de convolution d'une matrice u (image) et d'une matrice h (noyau) la matrice u étant de taille quelconque et la matrice h étant de taille impaire x impaire Il ne nécéssite ni bibliothèque ni options particulieres. Il se décompose en trois sous fonctions. la premiere est la suivante; elle permet de calculer u*h (produit de convolution) au point (x y) Code :
Code :
let m = vect_length h and n = vect_length h.(0) in Code :
On doit désormait appliquer cette fonction en chaque point de la matrice u; ainsi pour ne pas "déborder" on doit "grossir" la matrice u avant de lui appliquer h. C'est à cela que sert la fonction suivante: Code :
Code :
Code :
Code :
Code :
à ce stade : pour u = [|[|1;1;1|];[|2;2;2|]|] et h = [|[|0;-1;1|]|] losrqu'on exécute grossir_imp_imp u h on obtient [|[|0; 1; 1; 1; 0|]; [|0; 2; 2; 2; 0|]|] lorsqu'on exécute convol_imp_imp h u on obtient [|[|0; 0; 0; -1; 0|]; [|0; 0; 0; -2; 0|]|] On peut cependant faire la même fonction qui rend le même résultat sans ajouter les zeros sur les contours: Code :
Voilà peut-être que ça servira à quelqu'un un jour ^^ Rémy. |
||||||||||||||||
|
|
00
|
|
|
#4 |
|
Membre Expert
![]() ![]() Inscription : septembre 2006 Messages : 1 036 ![]() |
Indente le code s'il te plaît et pense à la balise .
|
|
|
00
|
|
|
#5 | ||||||
![]() ![]() Damien GuichardInscription : juin 2007 Messages : 1 512 ![]() |
Mes codes sources sont tous en Objective Caml 3.08 ou plus.
Je commence par quelques fonctions utilitaires pour les listes: make génère une liste de n éléments à partir de l'élément a et en appliquant n-1 fois la fonction u: Code :
Code :
make (fun _ l -> List.hd l + 1) [0] 10;; Code :
make (fun _ l -> List.nth l 0 + List.nth l 1) [1;0] 10;; Code :
make (fun n l -> n * List.hd l) [1;0] 10;; La fonction pair_list génère toutes les paires possibles formées à partir d'une liste l: Code :
Enfin la fonction exists_commutative teste l'existence de deux éléments de la liste l qui vérifient le prédicat 2-aire commutatif cond: Code :
|
||||||
|
00
|
|
|
#6 | ||
![]() ![]() Damien GuichardInscription : juin 2007 Messages : 1 512 ![]() |
Je continue avec un algorithme rapide de calcul de PI en goutte-à-goutte, toujours en Objective-Caml.
Code :
Code :
ocamlopt -unsafe -o pi.exe nums.cmxa pi.ml Les plus connaisseurs pourront encore accélérer l'algorithme à l'aide de la bibliothèque numerix de Michel Quercia. |
||
|
00
|
|
|
#7 | ||||||||||||
![]() ![]() Damien GuichardInscription : juin 2007 Messages : 1 512 ![]() |
Et mainenant des routines pour les inventaires.
Le type inventaire: Code :
Code :
([("livre",3);("tasse",2)] : string inventory);;
Code :
Code :
Maintenant les opérations élémentaires. L'union et l'intersection de deux inventaires: Code :
Code :
Code :
|
||||||||||||
|
00
|
|
|
#8 | ||||||||||||||||||
![]() ![]() Damien GuichardInscription : juin 2007 Messages : 1 512 ![]() |
La suite des fonctions sur les inventaires.
Ces fonctions paraissent beaucoup moins naturelles car ce sont des utilitaires pour la "grosse" fonction collect tout à la fin. Multiplier un inventaire par un entier n: Code :
Code :
Code :
Code :
Code :
Code :
Code :
Code :
Code :
|
||||||||||||||||||
|
00
|
|
|
#9 | ||||||||||||||
![]() ![]() Damien GuichardInscription : juin 2007 Messages : 1 512 ![]() |
Voici quelques fonctions de manipulation de motifs.
Le type motif et son afficheur: Code :
La fonction construct réalise l'instanciation de motif, les variables du motif pat sont remplacées par leur valeur associée dans l'environnement env: Code :
Code :
Code :
Code :
Code :
La fonction is_determinist réalise un test de déterminisme sur un filtrage, un filtrage est dit déterministe si aucuns de ses motifs ne sont unifiables deux-à-deux, dans un filtrage déterministe il n'y a toujours que zéro (le filtrage n'est pas forcément complet) ou un seul choix possible, jamais plusieurs: Code :
|
||||||||||||||
|
00
|
|
|
#10 | ||||||||||||||||||||||||||||||||
![]() ![]() Damien GuichardInscription : juin 2007 Messages : 1 512 ![]() |
Ma bibliothèque ocaml pour l'arithmétique des grands nombres.
L'implémentation utilise des tableaux d'entiers et supporte la base 10000 en 32 bits. J'ai massivement utilisé les assertions pour débugger plus vite. Le type big_int et son constructeur big_of_int: Code :
La function add_big réalise l'addition destructive des grands entiers a et b (a est écrasé): Code :
Code :
Code :
Code :
Code :
Code :
Code :
Code :
La multiplication ordinaire: Code :
Code :
Le carré et la puissance: Code :
Code :
Code :
Le nombre de permutations de p éléments parmi n: Code :
Les coefficients du binôme: Code :
|
||||||||||||||||||||||||||||||||
|
00
|
|
|
#11 |
![]() ![]() Inscription : juin 2006 Messages : 6 935 ![]() |
En tout cas. Je te remercie pour toutes les sources que tu nous proposes
__________________
Je ne répondrai à aucune question technique en privé |
|
|
00
|
|
|
#12 |
![]() ![]() Damien GuichardInscription : juin 2007 Messages : 1 512 ![]() |
Erratum:
Je ne suis plus très certain de ma division rapide Burnikel-Ziegler, elle fait parfois planter l'interpréteur OCamlWin sans que je sache pourquoi, les fonctions qui l'utilisent peuvent donc également être affectées (quomod_big et binomial_big). |
|
00
|
|
|
#13 | ||||||
![]() ![]() Damien GuichardInscription : juin 2007 Messages : 1 512 ![]() |
Un petit dérivateur formel qui simplifie raisonnablement son résultat.
Le type fonction d'une variable: Code :
Le fait d'éliminer ces redondances facilite grandement le travail de simplification d'écriture, il n'y a plus qu'à s'occuper de la factorisation (élémentaire), c'est ce que font les lignes suivantes: Code :
Code :
|
||||||
|
00
|
|
|
#14 | ||||||||
![]() ![]() Damien GuichardInscription : juin 2007 Messages : 1 512 ![]() |
Une petite fonctionnelle pour fusionner les listes triées:
Code :
Code :
Code :
Code :
|
||||||||
|
00
|
|
|
#15 | ||
![]() ![]() Damien GuichardInscription : juin 2007 Messages : 1 512 ![]() |
Voici la version corrigée de scale_down_big, c'était cette fonction qui était responsable de l'erreur dans la division Burnikel-Ziegler:
Code :
|
||
|
00
|
|
|
#16 | ||
|
Membre Expert
![]() Inscription : avril 2007 Messages : 829 ![]() |
Voici une ré-écriture du code de dérivation en utilisant des facilités syntaxiques. Je n'ai (théoriquement) absolument rien changé au comportement du code.
Code :
Les parenthèsages du style a * (b * c) pourraient être évités, mais il changerait le comportement actuel du code qui donne une priorité à droite à la multiplication, et je ne suis pas sûr de son interaction avec le simplicateur. On pourrait améliorer les patterns en utilisant la syntaxe révisée, qui utilise une jolie syntaxe curryfiée pour les constructeurs et les types, et je pensque que l'on pourrait même utiliser des pseudos-macros de pattern avec un support camlp4 plus lourd (si LLB passe par ici, il va faire de la propagande |
||
|
|
00
|
|
|
#17 |
![]() ![]() Damien GuichardInscription : juin 2007 Messages : 1 512 ![]() |
Camlp4 c'est carnaval.
Avec SpiceGuid les constructeurs ils ont le poil qui brille, et le premier qui commence à paresser ou à curryfier au lieu de construire il se prend un coup de fouet entre les homoplates, nourris à l'ancienne, rien qu'avec des tuples, miam miam les tuples c'est bon mangez en et vous aurez de belles dents. |
|
00
|
|
|
#18 | ||||
![]() ![]() Damien GuichardInscription : juin 2007 Messages : 1 512 ![]() |
Il manquait à ce fil de discussion une vraie fonctionnelle, qui renvoie une fonction utile et néanmoins plus tordue que son argument. Voilà qui est réparé avec lexicographical, un catamorphisme de la fonction compare:
Code :
Code :
('a -> 'a -> int) -> ('a list -> 'a list -> int)
Explication: Code :
|
||||
|
00
|
|
|
#19 | |
|
Expert Confirmé Sénior
![]() ![]() |
Citation:
-- Jedaï |
|
|
|
00
|
|
|
#20 | ||||
![]() ![]() Damien GuichardInscription : juin 2007 Messages : 1 512 ![]() |
Cela serait sympathique si on pouvait contrôler cette esthétique, exemples:
La version qui explicite totalement l'associativité à droite de la flèche (en explicitant l'associativité à gauche de l'application): Code :
Code :
|
||||
|
00
|
Copyright © 2000-2013 - www.developpez.com