Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

LIST.ML D'OCAML EN JAVASCRIPT


Information sur la source

Catégorie :Trucs Amusants Classé sous : ocaml, fonctionnel, paradigme, list, type Niveau : Initié Date de création : 22/03/2008 Date de mise à jour : 22/03/2008 18:23:47 Vu : 2 452

Note :
Aucune note

Commentaire sur cette source (0)
Ajouter un commentaire et/ou une note


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

Commentaires et avis

Aucun commentaire pour le moment.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Faire deux textbox permettant la saisie d'1 pseudo et d'1 mot de passe et accéder à une page du type www.monnomdedomaine.com/monpseudo_et_monmotdepasse.html [ par Nicolas RUIZ ] Slu !Je cherche un moyen de faire saisir à un visiteur un pseudo et un mot de passe et le faire atterrir sur une page de type www.monnomdedomaine.com/ Mailing List [ par Myles ] J'aimerais savoir comment on fait un mailing list, pour ne pas que toute les adresse Email soit visible pour ceux qui recoive le message? Est-ce que q test [ par alcatraz ] Bonjour a tous,petite question au sujet du javascript.J'ai un formulaire de saisie de données avec plusieurs champs du type textarea.Je voudrais teste Faire apparaitre une fenetre type Alert [ par jcharles ] Voici mon code actuel&lt;SCRIPT language=Javascript&gt;alert ('coucou les amis')&lt;/SCRIPT&gt;&lt;%response.redirect("default.asp")%&gt;le probleme c le type "select" devient un "text" [ par enis ] J'ai une liste déroulante contenant différents métier : &lt;SELECT name="Profession"&gt;&lt;option&gt;----------&lt;/option&gt; &lt;option value= type=hidden et type=text [ par lolo4492 ] SalutJe souhaite changer un input de type hidden en input de type text.J'ai essayé document.monform.moninput.type="text";mais j'ai eu une erreur : "I Formulaire : changer le type d'élémént en fonction d'une valeur ... [ par Dexterin ] Bonjour, je suis un débutant (très débutant) ... merci de votre évenuelle aide...J'ai le script suivant :function Choix(fiche) { i = document.fiche.c Formulaire : changer le type d'élémént en fonction d'une valeur ... [ par Dexterin ] Bonjour, je suis un débutant (très débutant) ... merci de votre évenuelle aide...J'ai le script suivant :function Choix(fiche) { i = document.fiche.c Ajouter un élément à une Drop-Down list [ par bob ] Je ne sais pas comment ajouter un élément à une drop-down list pendant que la page est en cour.Est-ce que quelqu'un pourrait m'aider.Merci Comment ajouter un élément à une drop-down list. [ par bob ] Je ne sais pas comment ajouter un élément à une drop-down list pendant que la page est en cours.Est-ce que quelqu'un pourrait m'aider S.V.P. ?Merci


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,484 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.