scheme: lambda() - Langages fonctionnels - Programmation
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...
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é.
Marsh Posté le 18-01-2008 à 02:26:42
C'est ballot; ca te fait 3 mots clés pour chercher donc..
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 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... |
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 :
|
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 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
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 doubler2 (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...
|
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? |
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 :
|
donc ça va tourner en boucle à l'infini et ne jamais se terminer.
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)
Marsh Posté le 18-01-2008 à 15:40:56
IrmatDen a écrit : |
C'est relativement sympas, mais:
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 ).
Mais à voir la tronche des fonctions données, en particulier celle-là:
Code :
|
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
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 ). |
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é)
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 :
|
(Et les arrows je verrais ça plus tard, pour l'instant, j'en suis encore aux monades )
Marsh Posté le 20-01-2008 à 13:18:31
IrmatDen a écrit :
|
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 :
|
qui est de type
Code :
|
(note, le code même n'a pas grand intérêt, c'est juste pour l'exemple )
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!!!