scheme: lambda()

scheme: lambda() - Langages fonctionnels - Programmation

Marsh Posté le 17-01-2008 à 21:46:31    

Bonsoir, nous recevons des cours de scheme à la fac, mais j'ai quelques difficultés avec lambda...
 
Je sais que dans le cas suivant:
(define fonction
(lambda (f g) (* (f g))))
 
 
lambda sert à definir les arguments, mais là où je bloque, c'est dans le cas suivant:
 
(define fonction
(lambda (f g)
(lambda (x) (f (g x)))))
 
Je bute dans le sens où je ne sais pas ce que fait (f (g x)), ni d'où on sort ce x ou quelle valeur il a, puisqu'on appelle la fonction avec comme seuls arguments f et g...
 
 
Autre problème, dans l'exercice que nous a donné le prof, je suis incapable de répondre à la question "qu'est ce qui est retourné? :" avec pour code:
(define doubler1
(lambda (f)     ;okay, parametre de doubler1
(lambda(x)(f x x))))    ;que fait donc ce f x x, et d'où sort ce x??
 
(define doubler2
(lambda (f x)     ;bon, deux parametres
((doubler1 f) x)))    ;on appelle doubler1 sur f, et... que fait-on avec x???
 
(doubler2 doubler2 doubler2)   ; là je comprends pas... on ne file pas d'arguments, rien... a moins que ce soient ces "doubler2", mais je comprends vraiment pas...
 
 
Merci d'avance!!!

Reply

Marsh Posté le 17-01-2008 à 21:46:31   

Reply

Marsh Posté le 18-01-2008 à 00:01:59    

Salut,

 

Ca sent le currying, non? Est-ce qu'il vous a parlé de ce terme ou d'applications partielles?
Je connais pas scheme, mais ça y ressemble fortement...


Message édité par IrmatDen le 18-01-2008 à 00:20:48
Reply

Marsh Posté le 18-01-2008 à 01:21:23    

Euuuuuh, disons que je n'étais pas énormément en cours (honte à moi, je sais, mais boulot oblige), mais il ne me semble pas qu'il en ait parlé.

Reply

Marsh Posté le 18-01-2008 à 02:26:42    

C'est ballot; ca te fait 3 mots clés pour chercher donc..

Reply

Marsh Posté le 18-01-2008 à 08:37:04    

strayyy2 a écrit :

lambda sert à definir les arguments


Ca commence bien... premier échec critique, (lambda) sert à définir une fonction anonyme, absolument pas à "définir les arguments", qui n'a de toute façon aucun sens

 
strayyy2 a écrit :

mais là où je bloque, c'est dans le cas suivant:

 

(define fonction
(lambda (f g)
(lambda (x) (f (g x)))))

 

Je bute dans le sens où je ne sais pas ce que fait (f (g x)), ni d'où on sort ce x ou quelle valeur il a, puisqu'on appelle la fonction avec comme seuls arguments f et g...


 [:prozac]
T'as pas eu l'idée 30 secondes de regarder ce que ça faisait dans un interpréteur scheme?

 

Et accessoirement, tu devrais penser à indenter, parce qu'indenté ça donne:

Code :
  1. (define fonction
  2.    (lambda (f g)
  3.        (lambda (x)
  4.            (f (g x)))))


Donc on a

 

(lambda (f g) ...), qui définit une fonction anonyme prenant deux paramètres "f" et "g".
(lambda (x) ...), qui définit une autre fonction anonyme, prenant ici un seul paramètre "x". Cette fonction anonyme est renvoyée par la fonction créée par (lambda (f g) ...)
(f (g x)), est une application de fonction tout ce qu'il y a de plus classique en scheme [:spamafote] on applique "g" à "x", puis on applique "f" à son résultat

 

Donc c'est juste de la composition: en mathématique, c'est équivalent à écrire
http://upload.wikimedia.org/math/2/6/0/260f99c4b815ee35b7089e91d13650dc.png
On renvoie une fonction résultant de la composition des fonctions f et g.

 
strayyy2 a écrit :

Autre problème, dans l'exercice que nous a donné le prof, je suis incapable de répondre à la question "qu'est ce qui est retourné? :" avec pour code:
(define doubler1
(lambda (f)     ;okay, parametre de doubler1
(lambda(x)(f x x))))    ;que fait donc ce f x x, et d'où sort ce x??

 

(define doubler2
(lambda (f x)     ;bon, deux parametres
((doubler1 f) x)))    ;on appelle doubler1 sur f, et... que fait-on avec x???

 

(doubler2 doubler2 doubler2)   ; là je comprends pas... on ne file pas d'arguments, rien... a moins que ce soient ces "doubler2", mais je comprends vraiment pas...

 


Merci d'avance!!!


Je suggère que tu ailles lire tes cours, ou l'un des très bon tuto Scheme qu'on peut trouver sur le net.

IrmatDen a écrit :

Salut,

 

Ca sent le currying, non? Est-ce qu'il vous a parlé de ce terme ou d'applications partielles?
Je connais pas scheme, mais ça y ressemble fortement...


Nope, c'est de la composition de fonctions (enfin la première partie), ça correspond à l'opérateur (.) de Haskell ( http://haskell.org/ghc/docs/latest [...] ml#v%3A%2e )

 

La 2e est une HoF sans grand intérêt visible (elle permet simplement d'appliquer une fonction à deux arguments identiques en ne spécifiant qu'une seule fois l'argument). La seconde est équivalente à la première, sauf que l'intégralité de l'opération se fait en un seul appel de fonction (alors que pour la première il en faut 2 de suite, donc plus de parenthèses)

 

Par contre pour autant que je puisse en juger l'appel à la fin du truc va pêter (et mon scheme48 semble confirmer): si on déroule l'opération on se retrouve avec

 
Code :
  1. (double2 double2 double2)
  2. ;; on applique double2 à double2 et double2, ce qui correspond donc à
  3. (double2 double2 double2)
  4. ;; On se retrouve avec exactement la même expression \o/


donc ça va tourner en boucle à l'infini et ne jamais se terminer.

Message cité 1 fois
Message édité par masklinn le 18-01-2008 à 08:48:03

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 18-01-2008 à 14:58:05    

masklinn a écrit :

Nope, c'est de la composition de fonctions (enfin la première partie), ça correspond à l'opérateur (.) de Haskell ( http://haskell.org/ghc/docs/latest [...] ml#v%3A%2e )


Merci, j'aurais jamais fait le lien avec ça (et j'ai du mal à le saisir pour l'instant, ça va m'occuper pour l'aprés-midi) :jap:

Reply

Marsh Posté le 18-01-2008 à 15:40:56    

IrmatDen a écrit :


Merci, j'aurais jamais fait le lien avec ça (et j'ai du mal à le saisir pour l'instant, ça va m'occuper pour l'aprés-midi) :jap:


C'est relativement sympas, mais:
 

  • Dispo uniquement dans les langages avec first-class functions
  • Un peu long à utiliser quand on a pas un opérateur pour (à la haskell), on a souvent aussi vite fait de composer les fonctions à la main dans une fonction explicite, au coup par coup
  • Rarement utilisé dans les langages où c'est pas natif. Dans du code haskell on trouve ça en permanence, dans les autres langages je le vois rarement.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 18-01-2008 à 16:11:52    

Etant toujours en train d'apprendre Haskell, je l'utilise déjà pas mal (pour l'instant, uniquement quand ça rend le code plus lisible, ce qui n'est peut-être pas le meilleur argument :D).
Mais à voir la tronche des fonctions données, en particulier celle-là:

Code :
  1. (define fonction
  2.         (lambda (f g)
  3.             (lambda (x)
  4.                 (f (g x)))))


Je l'ai compris de travers en fait; à y réfléchir à avec ton message, cette fonction et sa signature dans ghci, je comprends un peu mieux le fonctionnement de (.)  :)
 
Désolé strayyy2 pour les mauvaises pistes données initialement :/

Reply

Marsh Posté le 19-01-2008 à 19:33:25    

IrmatDen a écrit :

Etant toujours en train d'apprendre Haskell, je l'utilise déjà pas mal (pour l'instant, uniquement quand ça rend le code plus lisible, ce qui n'est peut-être pas le meilleur argument :D).


C'est très utilisé en pointfree, (le pointfree ayant, comme son nom ne l'indique pas, plus de points \o/)

IrmatDen a écrit :

Je l'ai compris de travers en fait; à y réfléchir à avec ton message, cette fonction et sa signature dans ghci, je comprends un peu mieux le fonctionnement de (.)  :)


Là où (.) est très chiant, par contre, c'est qu'il ne permet que des fonctions à un seul argument, donc quand on veut composer des fonctions à arguments multiples, faut jouer avec curry et uncurry :(
(ou alors passer par les trucs dans Control.Arrow, mais pour l'instant je comprend pas grand chose aux arrows)
(j'ai pas trop joué avec, d'un autre côté)

Message cité 1 fois
Message édité par masklinn le 19-01-2008 à 19:34:51

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 20-01-2008 à 11:07:38    

masklinn a écrit :

Là où (.) est très chiant, par contre, c'est qu'il ne permet que des fonctions à un seul argument, donc quand on veut composer des fonctions à arguments multiples, faut jouer avec curry et uncurry :(


Hum, j'imagine que tu dois avoir de bonnes raisons pour l'utiliser, mais quel serait le problème en mettant des parenthéses pour préparer les fonctions? Genre:

Code :
  1. ((+2) . (*20)) 2


(Et les arrows je verrais ça  plus tard, pour l'instant, j'en suis encore aux monades :D)

Reply

Marsh Posté le 20-01-2008 à 11:07:38   

Reply

Marsh Posté le 20-01-2008 à 13:18:31    

IrmatDen a écrit :


Hum, j'imagine que tu dois avoir de bonnes raisons pour l'utiliser, mais quel serait le problème en mettant des parenthéses pour préparer les fonctions? Genre:

Code :
  1. ((+2) . (*20)) 2


(Et les arrows je verrais ça  plus tard, pour l'instant, j'en suis encore aux monades :D)


Je parlais pas de ça, là tu utilises les 2 trucs avec un seul argument puisque tu composes (+2) :: (Num a) => a -> a et (*20) :: (Num a) => a -> a

 

Je parlais de composer des fonctions à 2 arguments, genre de composer un truc avec map :: (a -> b) -> [a] -> [b]

 

Imaginons que je veuille composer filter odd :: (Integral a) => [a] -> [a] avec map, dans la mesure où map prend deux arguments il faut que j'écrive:

 
Code :
  1. curry (filter odd . uncurry map)


qui est de type

Code :
  1. curry (filter odd . uncurry map) :: (Integral b) => (a -> b) -> [a] -> [b]


(note, le code même n'a pas grand intérêt, c'est juste pour l'exemple [:aloy] )


Message édité par masklinn le 20-01-2008 à 13:19:09

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 20-01-2008 à 16:19:00    

Ah oui, c'est pas la même souplesse. Merci beaucoup :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed