Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

une lambda objet ?

Une lambda, c'est quoi ? C'est une fonction anonyme. Ca a l'air assez etrange dit comme ca, pourtant, on ne peut pas le presenter autrement, ces fonctions peuvent-etre passees en parametre a d'autres fonctions, on peut les mettre comme "valeurs" a des variables, bref, ces fonctions sont des valeurs comme les autres.

Dans les langages de programmation fonctionnels, on peut creer des lambdas tres facilement : exemple en ocaml

(fun x -> x+1)(2);;

Ca donne 3

En javascript, la syntaxe est la suivante :

function(x){ return x+1; }

La syntaxe est plus lourde, mais c'est pour ce genre de bout de code, que javascript EST un langage fonctionnel (en plus d'etre imperatif)

Ces fonctions sont meme la caracteristique des langages fonctionnels, d'ailleur, le premier langage de programmation etait fonctionnel, et n'integrait QUE le principe des lambdas.

Un exemple d'application de ces fonctions :

List.map (fun x -> x+1) [1; 2; 3; 4; 5; 6; 7];;

ca donne [2; 3; 4; 5; 6; 7; 8]

Ces choses semblent vraiment propres aux langages de programmations fonctionnels, cependant, il parait que microsoft l'a implemente a C#.

Le langage php ne possede pas de closures, ni de type "function", ce qui limite ce genre de choses, cependant, on peut faire des choses comme :

$foo = 'function_name';
$result=$foo($param1, $param2);

et la fonction est appellee, sur le meme principe, on peut creer une fonction anonyme, grace a create_function, mais le typage est mauvais : ca renvoie un string...

En java, j'aurais bien voulu pouvoir en faire, pour pouvoir creer un "filtre d'iterateurs", qui serait parametrable, bien sur, j'aurais pu faire une classe abstraite : filtred_iterator<E> implements Iterator<E> et ensuite faire :

Iterator it = new FiltredIterator(malistechainee.iterator()){
private boolean filtre(Truc t){ return truc.isValide(); }
};

Ca aurait parfaitement fonctionne, sauf que le fait de pouvoir composer deux fonctions offre parfois un avantage majeur (pour filtre, pas forcement, mais pour map, l'avantage est evident), et donc, j'ai pense pousser le vice beaucoup plus loin : offrir a java des fausses lambdas, avec un type, et une vraie vie. Une lambda, c'est juste une fonction qui prend un parametre pour renvoyer une valeur. En pratique, on a jamais besoin de plusieurs parametres : on utilise la currification si on veut plusieurs parametres.

interface lambda{
    E a(F p);
}

la lambda incrementer peut s'ecrire comme ceci :

        lambda increment = new lambda(){
            public Integer a(Integer i){
                return new Integer(i.intValue()+1);
            }
        };
        System.out.println(increment.a(new Integer(5)));

La syntaxe est tres lourde, on est oblige d'utiliser la methode "a" pour appliquer la fonction, mais ca fonctionne tres bien. Pour aller plus loin, voici un exemple de currification : une lambda qui renvoie une lambda :

         lambda> increment = new lambda>(){
            public lambda a(final Integer i){
                return new lambda(){
                    public Integer a(Integer j){
                        return j.intValue()+i.intValue();
                    }
                };
            }
        };
        System.out.println(increment.a(new Integer(5)).a(new Integer(9)));

Pour la lambda de composition, elle se doit d'etre generique, on doit donc faire une classe pour elle :

class composer implements lambda{
     private lambda f;
     private lambda g;
    public composer( lambda f, lambda g){
        this.f = f; this.g=g;
    }
    public E a(F p){
        return f.a(g.a(p));
    }
}

et voici un exemple d'utilisation de la composition :

        lambda f =new composer(
                new lambda(){
                   public Integer a(Integer i){
                      return new Integer(i.intValue()+1); } },
                new lambda(){
                   public Integer a(Integer i){
                      return new Integer(i.intValue() * 2); } }
                );
        System.out.println(f.a(new Integer(5)));

C'est tres particulier, mais tres interessant (et euh... a eviter dans des projets serieux, c'est tres marrant a taper, mais je doute que ca soit tres politiquement correct...)

Publié lundi 1 septembre 2008 11:16 par coucou747
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

# re: une lambda objet ?

Je trouve assez réducteur de considérer une Lambda à une fonction anonyme. On loupe la notion de "description" de la lambda : la lambda décrit un comportement.

Un exemple simple, si l'on prend C# : Représenter à l'aide d'une lambda un filtre Where sur une source de données IQueryable ne génère pas de méthode anonyme, car cette représentation, plutot que d'être évaluée, est simplement utilisée pour générer autre chose (pour Linq to SQL, ce sera du SQL, pour Linq to Sharepoint ce sera un prédicat XML...).

lundi 1 septembre 2008 12:09 by simon ferquel

# re: une lambda objet ?

apres la lecture de :

http://www.developer.com/net/csharp/article.php/3598381

je dirais : en effet, en C#, ca peut aussi etre un "pointeur" sur fonction, mais euh... dans un langage fonctionnel, c'est innexact... si on met : let inc x = x+1;; let foo = inc;;

alors foo et inc sont tout les deux des fonctions, mais ce ne sont pas des lambdas.

lundi 1 septembre 2008 12:24 by coucou747
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- 3 articles sur SQL Server (Data Structures, Scans and seeks, Data access strategies) par Code is poetry le il y a 6 heures et 35 minutes

- Mais que peut bien faire un MVP quand il ne code pas ??? par .net is good... C# is better ;) le il y a 9 heures et 1 minutes

- PowerShell : Comment exécuter un script PS depuis une fenêtre MS DOS ou Scheduled Task par Blog Technique de Romelard Fabrice le il y a 9 heures et 10 minutes

- EDM Designer par Matthieu MEZIL le il y a 12 heures et 39 minutes

- Small basic - un projet intéressant par Pierrick's Blog le 01-06-2009, 17:11

- SharePoint 2007 : Liste Personnalisée, Colonnes de Site et Menu Contextuel par Philippe Sentenac [MVP SharePoint] le 01-06-2009, 16:38

- [WPF/Silverlight] Ternary Converters par NeuroCypher's Blog le 01-06-2009, 15:18

- Bonne année, bonne santé et surtout de bons PowerPoint !!! par The Mit's Blog le 01-06-2009, 14:38

- Suggestions Visual Studio par BruNews le 01-06-2009, 12:06

- C++ VS 2010 et développement parallèle par Michel Perfetti [Miiitch] le 01-06-2009, 11:00