IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Haskell Discussion :

[Haskell] Flot et fonctions


Sujet :

Haskell

  1. #1
    Membre éprouvé
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Par défaut [Haskell] Flot et fonctions
    Bonjour,

    J'ai un petit probleme avec une fonction toute bête sur un flot infini.

    Supposons une fonction apply qui prend en parametre une fonction unaire et qui l'applique à toutes les valeurs d'un flot (infini dans notre cas) passé en parametre.

    Voila le type de la fonction :

    (a -> b) -> [a] -> [b]

    Or j'ai essayé ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    apply1 fonction flot = (fonction (last(take (1 flot)))): (apply1 (fonction takeWhile (vrai 2 flot)))
    et la fonction vrai :
    vrai a = True
    Dans ma logique, il applique la fonction au dernier element de la liste contenant le premier element du flot () qu'il concatene avec apply1 du reste. Or il me met une erreur de type :

    (line 10): Type error in application
    *** Expression : vrai 2 flot
    *** Term : vrai
    *** Type : d -> Bool
    *** Does not match : a -> b -> c
    Ou est l'erreur ? je comprend pas trop

    Merci

    Fred

  2. #2
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Citation Envoyé par mavina
    Ou est l'erreur ? je comprend pas trop

    Merci

    Fred
    Je ne suis pas sûr du tout du reste de ta fonction, mais de toute façon, tu n'as pas l'air d'avoir compris ce que faisait "vrai" : d'après ta définition, vrai prend un paramètre et renvoie True, donc :
    est équivalent à
    Ce qui n'a aucun sens...

    Que voulais-tu faire ?
    (NB : cela fait de vrai un synonyme de (==))

    --
    Jedaï

  3. #3
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Citation Envoyé par mavina
    Bonjour,

    J'ai un petit probleme avec une fonction toute bête sur un flot infini.

    Supposons une fonction apply qui prend en parametre une fonction unaire et qui l'applique à toutes les valeurs d'un flot (infini dans notre cas) passé en parametre.

    Voila le type de la fonction :

    (a -> b) -> [a] -> [b]
    Ta définition fait de apply un synonyme de map, ce qui s'écrit simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    apply f l = f (head l) : apply f (tail l)
    Ca marche aussi bien pour une liste infinie que finie.

    Peut-être essaie-tu de faire quelque chose de différent, mais dans ce cas tu n'as pas l'air d'être très sûr de quoi, pourrais-tu l'expliquer plus clairement ?

    --
    Jedaï

  4. #4
    Membre éprouvé
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Par défaut
    Coucou,

    Oui je suis débutant et j'ai un peu de mal avec Haskell

    C'est bien la solution de Jedai

    Pour ce qui est de vrai, j'ai fait une erreur de parenthèse, je voulais écrire (vrai 2) flot .

    En fait, takeWhile prend les elements d'une liste avec une condition d'arret, je voulais la condition d'arret toujours vrai.

    Ta définition marche parfaitement. En fait, mon problème n'était pas dans le principe, mais j'ignorais l'existance de head et tail, je n'ai pas trouvé dans le peu de documentation que j'ai trouvée

    En fait oui c'était la redéfinition de map

    Merci beaucoup

    Fred

  5. #5
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Citation Envoyé par mavina
    Ta définition marche parfaitement. En fait, mon problème n'était pas dans le principe, mais j'ignorais l'existance de head et tail, je n'ai pas trouvé dans le peu de documentation que j'ai trouvée
    Quel compilateur/interpréteur Haskell utilises-tu ? Je te recommande GHC.
    En tout cas, tu dois avoir une doc avec, lis le "Prelude" au moins une fois (ou au moins par petits bouts), ça t'aidera beaucoup. (le Prelude est plein de méthodes très utiles).

    --
    Jedaï

  6. #6
    Membre éprouvé
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Par défaut
    J'utilise Hugs98

    Je ne cache pas que je seche sur les exos qu'on me fait faire là, je n'ai absolument pas l'habitude de programmer en fonctionnel

    Une derniere question : admétons une fonction définie ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fonction a = (...)
    supposons ensuite que a est une fonction qui prend un parametre : a->b

    Comment dans le corps de "fonction" récupérer le parametre de a ?

    Merci

    Fred

  7. #7
    Membre Expert
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Par défaut
    Ca n'a pas de sens ce que tu dis-là : peux-tu préciser ta pensée ? C'est quoi fonction ? un mot-clef ? C'est quoi a ?

    Une fonction, ça reste une fonction ! C'est comme en C ! On l'applique à un paramètre mais on obtient alors une valeur du type de retour.

  8. #8
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Citation Envoyé par mavina
    J'utilise Hugs98
    Je te conseille plutôt GHC si tu as le choix. En plus, c'est ce que j'utilise, donc je pourrais plus facilement t'aider sur les questions techniques.

    Citation Envoyé par mavina
    Je ne cache pas que je seche sur les exos qu'on me fait faire là, je n'ai absolument pas l'habitude de programmer en fonctionnel

    Une derniere question : admétons une fonction définie ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fonction a = (...)
    supposons ensuite que a est une fonction qui prend un parametre : a->b

    Comment dans le corps de "fonction" récupérer le parametre de a ?
    fonction n'est pas un mot clé de haskell, je ne comprend pas la question...
    Veux-tu parler des "lambda" (ou fonction anonyme) ?
    --
    Jedaï

  9. #9
    Membre éprouvé
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Par défaut
    On va faire plus simple pour le moment

    supposons la fonction carré suivante :

    tout bêtement programmée.

    Maintenant, j'aimerai faire une fonction qui transforme cette fonction carrée en une fonction carrée qui prend un flux et retourne ce flux "elevé au carré"

    En clair, je veux que la fonction retournée prenne un flux ( au hasard [1,2,5,6,3,4] et me retourne le même flux dont les elements sont retournés au carré (dans notre exemple [1,3,25,36,9,16]).

    J'avoue que je seche un peu beaucoup :s

    pour faire ceci, j'ai acces à plusieurs fonctions que j'ai faites précédemment :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    --flot constant de 0
    f_0 = 0:f_0
     
    --prend un a et renvoie un flot constant de a
    constant a = a:constant a
     
    --prend une fonction et l'applique a un flot
    apply1 fonction flot = fonction (head flot) : apply1 fonction (tail flot)
     
     
    --prend une fonction binaire et l'applique a toutes les valeurs de deux flots
    apply2 fonction flot1 flot2 = fonction (head flot1) (head flot2) : apply2 fonction (tail flot1) (tail flot2)
     
    --racourci pour constant
    raise0 a = constant a
    Je ne demande évidemment pas la solution (tu n'es pas là pour faire mes exos non plus ^^), à la base j'avais pensé à utiliser apply1 mais en fait ca ne va pas aller, et je suis totalement bloqué et je ne sais pas par ou prendre le truc

    edit :

    un petit bout de code que j'ai entammé mais je seche sur le fait que ca doit renvoyer un flot :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    raise1 fonction = (apply1 fonction [])
    le [] est à défaut d'autre chose

    Merci d'avance

    Fred

  10. #10
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Tu as un petit problème avec les notions d'ordre supérieur visiblement... On t'a parlé de fonctions curryfiées ou non ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    carreList = apply1 carre
    En Haskell on ne parle pas de flot, on parle de liste, finie ou infinie.

    --
    Jedaï

  11. #11
    Membre Expert
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Par défaut
    Il faudrai aussi que tu aprennes à utiliser le filtrage de motifs... Par exemple, cette fonction s'écrit plus naturellement ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    apply1 f []    = []
    apply1 f x:xs  = (f x) : apply1 f xs
    Plus clair, tu ne trouves pas ?

    Comme le dit très justement Jedai, tu n'as aucunement besoin de te soucier du fait que les listes sont infinies ou non, en Haskell : il n'y a que la notion de liste qui existe en Haskell, finie ou non, là n'est pas le problème. Ce n'est pas comme en Objective Caml (langage strict, à la différence de Haskell)...

  12. #12
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Citation Envoyé par InOCamlWeTrust
    Il faudrai aussi que tu aprennes à utiliser le filtrage de motifs... Par exemple, cette fonction s'écrit plus naturellement ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    apply1 f []    = []
    apply1 f x:xs  = (f x) : apply1 f xs
    Plus clair, tu ne trouves pas ?
    Non seulement plus clair, mais aussi plus correct (la définition que j'avais donné plante sur la liste vide, alors qu'il est logique de renvoyer une liste vide dans ce cas) !

    --
    Jedaï

  13. #13
    Membre éprouvé
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Par défaut
    coucou,

    J'ai changé mon compilateur, comme tu me l'as suggéré, j'utilise GHC.
    Cependant, les messages d'erreur sont vraiment moins clairs. Exemple sur la fonction que InOcamlWeTrust a donnée :

    Prelude> :load tp.hs
    [1 of 1] Compiling Main ( tp.hs, interpreted )

    tp.hs:8:0: Parse error in pattern
    Failed, modules loaded: none.
    Prelude>
    Il ne dit pas d'où peut venir l'erreur.
    Hugs98 me disait un "unexpected ":" line 8"

    Je comprends le principe, un peu comme en caml un match avec le pattern "::", mais pourquoi ca ne fonctionne pas ...

    Fred

  14. #14
    Membre Expert
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Par défaut
    Citation Envoyé par mavina
    Il ne dit pas d'où peut venir l'erreur.
    Hugs98 me disait un "unexpected ":" line 8"
    Au contraire, il est encore plus précis : il te dit que le problème vient de la ligne 8 colonne 0 ; on dirait que c'est un motif qui pose problème.

    Citation Envoyé par GHC
    tp.hs:8:0: Parse error in pattern
    Essaye avec des parenthèses pour voir. J'avoue ne pas avoir essayé avant de poster. J'ai pas internet chez moi, et donc quand je poste un code, c'est souvent à l'aveuglette !

  15. #15
    Membre éprouvé
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Par défaut
    en effet, il faut mettre des parenthèses à
    Ce qui donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    apply1 f [] = []
    apply1 f (x:xs)  = (f x) : (apply1 f xs)
    Je laisse ce topic en fil rouge, la suite me parrait sympatique je risque de m'ammuser avec vous

    merci pour l'aide

    Fred

Discussions similaires

  1. Haskell et invocation "dynamic" de fonction
    Par oca dans le forum Haskell
    Réponses: 10
    Dernier message: 20/01/2010, 22h21
  2. fonction haskell appelée depuis module C
    Par barbouille dans le forum Haskell
    Réponses: 9
    Dernier message: 24/04/2008, 18h29
  3. [Haskell] Faire une fonction average
    Par GnuVince dans le forum Haskell
    Réponses: 2
    Dernier message: 18/12/2007, 15h00
  4. fonction printf
    Par ydeleage dans le forum C
    Réponses: 7
    Dernier message: 30/05/2002, 11h24
  5. FOnction api specifiant la position de la souris
    Par florent dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/05/2002, 20h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo