Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1882 connectés 

  FORUM HardWare.fr
  Programmation
  Langages fonctionnels

  scheme: lambda()

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

scheme: lambda()

n°1673016
strayyy2
Posté le 17-01-2008 à 21:46:31  profilanswer
 

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!!!

mood
Publicité
Posté le 17-01-2008 à 21:46:31  profilanswer
 

n°1673076
IrmatDen
Posté le 18-01-2008 à 00:01:59  profilanswer
 

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
n°1673083
strayyy2
Posté le 18-01-2008 à 01:21:23  profilanswer
 

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é.

n°1673091
IrmatDen
Posté le 18-01-2008 à 02:26:42  profilanswer
 

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

n°1673108
masklinn
í dag viðrar vel til loftárása
Posté le 18-01-2008 à 08:37:04  profilanswer
 

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

---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°1673382
IrmatDen
Posté le 18-01-2008 à 14:58:05  profilanswer
 

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:

n°1673458
masklinn
í dag viðrar vel til loftárása
Posté le 18-01-2008 à 15:40:56  profilanswer
 

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.


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°1673482
IrmatDen
Posté le 18-01-2008 à 16:11:52  profilanswer
 

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 :/

n°1673852
masklinn
í dag viðrar vel til loftárása
Posté le 19-01-2008 à 19:33:25  profilanswer
 

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

---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°1673971
IrmatDen
Posté le 20-01-2008 à 11:07:38  profilanswer
 

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)

mood
Publicité
Posté le 20-01-2008 à 11:07:38  profilanswer
 

n°1673989
masklinn
í dag viðrar vel til loftárása
Posté le 20-01-2008 à 13:18:31  profilanswer
 

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

---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°1674038
IrmatDen
Posté le 20-01-2008 à 16:19:00  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Langages fonctionnels

  scheme: lambda()

 

Sujets relatifs
Procédure lambda en schemeAidez moi en Scheme svp
pb en programmation scheme[instruction lambda] variable non initialisée
utiliser mount() dans un prog execute par lambda[Scheme] Fonction d'affichage
[Scheme] Questions de noob'[Scheme for FLUENT].... partage d'informations
[scheme] Soyez futés: utilisez scheme 
Plus de sujets relatifs à : scheme: lambda()


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)