Accueil > > > LIST.ML D'OCAML EN JAVASCRIPT
LIST.ML D'OCAML EN JAVASCRIPT
Information sur la source
Description
J'ai recode une partie de List.ml d'ocaml, de la facon dont ces fonctions sont codees en ocaml, histoire de montrer qu'on pouvait coder fonctionnel en javascript. les alert que j'ai mis en commentaires servent a tester ces fonctions. idem pour les deux lignes suivantes var a = List.coller (0) (List.coller (4) (List.coller (2) (List.coller (5) (List.coller (6) (List.coller (1) (List.coller (-7) (List.coller (9) (List.Vide)))))))); var b=List.coller (1) (List.coller (3)(List.Vide)); c'est evidement une tres mauvaise idee d'utiliser ca dans un programme ensuite, car ca "risque" d'etre un peu lent... Ouais, recoder une liste chaineee en javascript, c'est pas une bonne idee... Ce qu'il manque a javascript : separer la notion de valeur de la notion de variable (pouvoir faire un let fonctionnel et pas une affectation imperative) les types algebriques
Source
- <html>
- <head>
- <title>javascript : du fonctionnel ocaml like</title>
- </head>
- <body>
-
- <script type="text/javascript">
-
- //curry
- function add (x){ return function(y){return x+y;}}
- //document.write(add(4)(5));
- function compose (func){
- return function (g){ return function (x){ return f(g(x));; } }
- }
- //function f(x){return x*x;}
- //function g(x){return x+1;}
- //document.write(compose(f)(g)(1));
-
- function raise(a, li){
- alert("raise : "+a+li);
- }
-
- var List={};
- List.Vide = {vide:1}
- List.hd=function (li){
- if (List.Vide==li){
- raise('List.hd', li);
- }else{
- return li.hd;
- }
- };
- List.tl=function (li){
- if (List.Vide==li){
- raise('List.tl', li);
- }else{
- return li.tl;
- }
- };
- List.coller=function (e){
- return function (li){
- var a={};
- a.hd=e;
- a.tl=li;
- return a;
- }
- }
- List.toString=function(li){
- if (List.Vide==li){
- return "";
- }else {
- var hd = List.hd(li);
- var tl = List.tl(li);
- if (tl==List.Vide){
- return hd;
- }else{
- return hd+", "+List.toString(tl);
- }
- }
- }
- //controle des effets de bords
- //var a=List.Vide;
- //var b=List.coller (0) (List.coller (1) (List.coller (2) (a)));
- //alert(List.hd( List.tl(b)));
- //alert(List.hd(a)) // doit renvoyer wtf
-
- var a = List.coller (0) (List.coller (4) (List.coller (2) (List.coller (5) (List.coller (6) (List.coller (1) (List.coller (-7) (List.coller (9) (List.Vide))))))));
-
- var b=List.coller (1) (List.coller (3)(List.Vide));
-
- List.len=function (li){
- if (li==List.Vide){
- return 0;
- }else{
- return 1+ List.len ( List.tl(li) );
- }
- }
-
- List.rev = function (li){
- var f = function (acc, li){
- if (li==List.Vide)
- return acc;
- else
- return f (
- List.coller(List.hd(li))(acc),
- List.tl(li)
- );
- }
- return f (List.Vide, li);
- }
-
- //alert(List.toString(a));
- //alert(List.toString(List.rev(a)));
- //alert(List.len (a) );
-
- List.map = function (fonction) {
- return function (li){
- if (li==List.Vide)
- return List.Vide;
- else
- return List.coller
- (fonction(List.hd(li)))
- (List.map (fonction)(List.tl(li)));
- }
- }
- /*
- En ocaml, on a le tail rec qui nous permet d'ecrire rev_map de facon plus optimisee que map, en js, c'est pas forcement le cas
-
- (par optimisee, j'entends : suppression de la recursivite lors de l'execution)
- */
- List.rev_map = function (fonction) {
- return function (li){
- var f = function (acc, li){
- if (li==List.Vide)
- return acc;
- else
- return f (List.coller(fonction(List.hd(li)))(acc),List.tl(li));
- }
- return f (List.Vide, li);
- }
- }
-
-
- List.filter = function (fonction) {
- return function (li){
- if (li==List.Vide)
- return List.Vide;
- else{
- var hd=List.hd(li);
- if (fonction(hd))
- return List.coller
- (hd)
- (List.filter (fonction) (List.tl(li)));
- else
- return List.filter (fonction) (List.tl(li));
- }
- }
- }
- //alert(List.toString(List.filter (function(x){return x%2==0;}) (a) ));
-
- List.rev_append = function (liste1) {
- return function (liste2){
- if (liste1==List.Vide){
- return liste2;
- }else{
- var hd=List.hd(liste1);
- var tl=List.tl(liste1);
- return List.rev_append
- (tl)
- (List.coller
- (hd)
- (liste2)
- );
- }
- }
- }
-
- List.append = function (liste1) {
- return function (liste2){
- if (liste1==List.Vide){
- return liste2;
- }else{
- return List.coller
- (List.hd(liste1))
- (List.append
- (List.tl(liste1))
- (liste2)
- );
- }
- }
- }
-
- //alert( List.toString (List.rev_append(a)(b)) );
-
-
-
- </script>
- </body>
- </html>
<html>
<head>
<title>javascript : du fonctionnel ocaml like</title>
</head>
<body>
<script type="text/javascript">
//curry
function add (x){ return function(y){return x+y;}}
//document.write(add(4)(5));
function compose (func){
return function (g){ return function (x){ return f(g(x));; } }
}
//function f(x){return x*x;}
//function g(x){return x+1;}
//document.write(compose(f)(g)(1));
function raise(a, li){
alert("raise : "+a+li);
}
var List={};
List.Vide = {vide:1}
List.hd=function (li){
if (List.Vide==li){
raise('List.hd', li);
}else{
return li.hd;
}
};
List.tl=function (li){
if (List.Vide==li){
raise('List.tl', li);
}else{
return li.tl;
}
};
List.coller=function (e){
return function (li){
var a={};
a.hd=e;
a.tl=li;
return a;
}
}
List.toString=function(li){
if (List.Vide==li){
return "";
}else {
var hd = List.hd(li);
var tl = List.tl(li);
if (tl==List.Vide){
return hd;
}else{
return hd+", "+List.toString(tl);
}
}
}
//controle des effets de bords
//var a=List.Vide;
//var b=List.coller (0) (List.coller (1) (List.coller (2) (a)));
//alert(List.hd( List.tl(b)));
//alert(List.hd(a)) // doit renvoyer wtf
var a = List.coller (0) (List.coller (4) (List.coller (2) (List.coller (5) (List.coller (6) (List.coller (1) (List.coller (-7) (List.coller (9) (List.Vide))))))));
var b=List.coller (1) (List.coller (3)(List.Vide));
List.len=function (li){
if (li==List.Vide){
return 0;
}else{
return 1+ List.len ( List.tl(li) );
}
}
List.rev = function (li){
var f = function (acc, li){
if (li==List.Vide)
return acc;
else
return f (
List.coller(List.hd(li))(acc),
List.tl(li)
);
}
return f (List.Vide, li);
}
//alert(List.toString(a));
//alert(List.toString(List.rev(a)));
//alert(List.len (a) );
List.map = function (fonction) {
return function (li){
if (li==List.Vide)
return List.Vide;
else
return List.coller
(fonction(List.hd(li)))
(List.map (fonction)(List.tl(li)));
}
}
/*
En ocaml, on a le tail rec qui nous permet d'ecrire rev_map de facon plus optimisee que map, en js, c'est pas forcement le cas
(par optimisee, j'entends : suppression de la recursivite lors de l'execution)
*/
List.rev_map = function (fonction) {
return function (li){
var f = function (acc, li){
if (li==List.Vide)
return acc;
else
return f (List.coller(fonction(List.hd(li)))(acc),List.tl(li));
}
return f (List.Vide, li);
}
}
List.filter = function (fonction) {
return function (li){
if (li==List.Vide)
return List.Vide;
else{
var hd=List.hd(li);
if (fonction(hd))
return List.coller
(hd)
(List.filter (fonction) (List.tl(li)));
else
return List.filter (fonction) (List.tl(li));
}
}
}
//alert(List.toString(List.filter (function(x){return x%2==0;}) (a) ));
List.rev_append = function (liste1) {
return function (liste2){
if (liste1==List.Vide){
return liste2;
}else{
var hd=List.hd(liste1);
var tl=List.tl(liste1);
return List.rev_append
(tl)
(List.coller
(hd)
(liste2)
);
}
}
}
List.append = function (liste1) {
return function (liste2){
if (liste1==List.Vide){
return liste2;
}else{
return List.coller
(List.hd(liste1))
(List.append
(List.tl(liste1))
(liste2)
);
}
}
}
//alert( List.toString (List.rev_append(a)(b)) );
</script>
</body>
</html>
Historique
- 22 mars 2008 18:23:47 :
- ajout des mots clefs
Sources du même auteur
Sources de la même categorie
Commentaires et avis
|
Derniers Blogs
SLIDE & DéMO TECHDAYS 2012 - FAST & FURIOUS XAML APPSSLIDE & DéMO TECHDAYS 2012 - FAST & FURIOUS XAML APPS par Vko
Retrouvez les slides et les démo de ma session Fast & Furious XAML Apps. A ceux qui se posent la question : "est-ce que le code de la DataGrid est disponible?", je vous répondrais "pas encore". Je vais mettre en place un projet codeplex pour part...
Cliquez pour lire la suite de l'article par Vko XNA IS DEAD!XNA IS DEAD! par richardc
Depuis la semaine dernière (et grâce aux TechDays 2012), je me penche activement sur la nouvelle version de Windows, aka Windows 8. Vous me direz, il était temps puisque la première preview date de Septembre dernier.
OK. Remarquez, on n'en est qu'aux...
Cliquez pour lire la suite de l'article par richardc TECHDAYS PARIS 2012 : WINDOWS SERVER "8" QUOI DE 9 !TECHDAYS PARIS 2012 : WINDOWS SERVER "8" QUOI DE 9 ! par ROMELARD Fabrice
Speakers: Fabrice Meillon et Stanislas Quastana Cette session est basée entièrement sur celle donnée lors de la BUILD cet hiver. Il n'y a pas d'ajout d'information en rapport avec cet évènement passé. Windows 8 Server sera intégralem...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice [HTML5] AUTOUR DU W3C : NOUVEAUX STANDARDS ET WEB MOBILE (LILLE)[HTML5] AUTOUR DU W3C : NOUVEAUX STANDARDS ET WEB MOBILE (LILLE) par Gio
Je m'y prends un peu tard je sais, mais bon je suis développeur web et donc hyper fainéant ! Toujours dans le cadre des technologies émergentes, ici HTML5, parce qu'on aime HTML5 chez Wyg , nous seront présent, le vieux ( Aurélien V.) et moi, pour pr...
Cliquez pour lire la suite de l'article par Gio
Logiciels
DocTranslate (V3.1.0.0)DOCTRANSLATE (V3.1.0.0)DocTranslate est un traducteur de document Microsoft Word, PowerPoint et Excel. Il permet d'autom... Cliquez pour télécharger DocTranslate Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System
|