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 :

cette fonction existe-t-elle déjà? (a -> b -> c) -> (d -> b) -> a -> d -> c


Sujet :

Haskell

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 2
    Points : 2
    Points
    2
    Par défaut cette fonction existe-t-elle déjà? (a -> b -> c) -> (d -> b) -> a -> d -> c
    Tout est dans le titre, mais je vais développer. J'ai écris une fonction assez pratique (que j'ai appelé assez maladroitement "point2", censé signifier "équivalent de l'operateur (.), mais la seconde fonction n'est appliquée qu'au niveau du deuxieme argument de la premiere fonction"). Voici sa définition:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    point2 :: (a -> b -> c) -> (d -> b) -> (( a -> d -> c ))
    -- les doubles parenthèses sont bien sur inutiles pour le compilateur. elles sont uniquement là pour impliquer que les utilisateurs vont considérer la fonction comme retournant une autre fonction
    -- bien qu'évidemment celle-ci peut être appliquée directement, retournant une valeur de type c, ou peut-être (d -> c) si application partielle.
    -- J'ai nommé les variables dans le pattern avec les mêmes lettres que leurs types respectifs, pour "clarité"
    point2 f g a d = f a (g d)
    -- j'avais originellement écrit cette fonction en "point-free" style (je ne sais pas comment ça se dit en français)
    -- avec l'aide de la fonction flip, qui provient de Data.Function (pour être franc a l'origine j'avais surtout réinventé ma propre roue);
    -- donc, définition alternative en utilisant flip == (\f y x -> f x y)
    point2 f g = flip (flip f . g)
    -- preuve par décomposition: (ou bien peut etre "composition", vu qu'on ne decompose en fait rien du tout?)
    -- f :: a -> b -> c
    -- flip f :: b -> a -> c
    -- flip f . g :: d -> a -> c
    -- flip (flip f . g) == f `point2` g :: a -> d -> c
    en tout cas, c'est plutot utile si l'on veut combiner f et g mais avec g supposé retourner le *deuxieme* argument de f, pas le premier (ce qui serait le cas pour l'operateur (.))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (f a) . g == (f `point2` g) a
    dans l'expression de gauche, "a" doit etre donné pour utiliser cette définition en "point-free" style; dans le second cas, "a" peut être omit, et on peut alors écrire "foo = f `point2` g", ce qui est bien plus proche du style "point-free", et bien plus simple à comprendre à mon avis, une fois que l'on a assimilé ce que fait cette fonction "point2".

    Si vous avez suivi depuis le début, ma question est donc: est-ce que cette fonction existe déjà officiellement quelque part; je n'ai pas envie de réinventer la roue, et je suis curieux du nom que cette fonction pourrait porter, pare que je ne suis pas mortellement satisfait de "point2". j'adorerais un truc du genre (.2) mais ça n'est pas compatible avec haskell.

    Aussi, j'avais oublié, même question pour la fonction suivante, encore une petite soeur de la fonction (.). Ici le but est de pouvoir écrire h a b = f (g a b) en mode "point-free".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    after2 :: (c -> d) -> (a -> b -> c) -> (( a -> b -> d ))
    after2 f g a b = f (g a b)
    -- le nom de cette fonction implique un usage infixe, par exemple for example: h = f `after2` g
    si vous connaissez Data.Function(on), en gros "after2" est un peu son opposée, ou l'une d'entre elles: `on` appliques g aux deux arguments de f indépendamment, avant de donner les deux résultats à f qui elle prends effectivement deux arguments (maximum, devrais-je dire):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    on :: (c -> c -> d) -> (e -> c) -> (( e -> e -> d ))
    -- (f `on` g) a b == f (g a) (g b)
        -- a et b sont de type "e" bien sur
    Accessoirement, je suis pratiquement sur que l'ont peut écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    f `after2` g == curry (f . (uncurry g))
    -- puisque, en utilisant la meme notation que la definition de after2 ci dessus:
    -- uncurry g :: (a,b) -> c
    -- f . uncurry g :: (a,b) -> d
    -- curry (f . uncurry g) :: a -> b -> d
    Au cas où, les définitions des deux fonctions (un)curry:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    curry :: ((a,b) -> c) -> a -> b -> c
        -- curry f a b = f (a,b)
        -- curry f :: a -> b -> c, lorsque f :: (a,b) -> c
    uncurry :: (a -> b -> c) -> (a, b) -> c
        -- uncurry g (a,b) = g a b
        -- uncurry g :: (a,b) -> c, lorsque g :: a -> b -> c

  2. #2
    Expert éminent
    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
    Points : 8 586
    Points
    8 586
    Par défaut
    Ces fonctions ne sont pas "standard", mais bien sûr on peut les trouver dans divers packages, par exemple pointless-fun.

  3. #3
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Merci!
    Ah oups je me suis gouré de langage, désolé!

    Je disais donc, merci! Je ne cherchais rien de particulièrement "standard", donc c'est exactement ça que je cherchais.
    Le nom du package est quelque peu bizarre, à mon avis ces fonctions peuvent très bien se révéler utiles même en codage "réel".

    Merci encore!

  4. #4
    Expert éminent
    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
    Points : 8 586
    Points
    8 586
    Par défaut
    Je pense que le nom est un jeu de mot sur pointfree=pointless et son origine est un post de blog ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Pourquoi cette fonction fonctionne-t'elle ?
    Par Alorslaçaprogramme dans le forum Langage
    Réponses: 10
    Dernier message: 30/03/2015, 13h10
  2. Server root : cette commande existe t-elle ?
    Par Super Byte dans le forum Administration système
    Réponses: 4
    Dernier message: 11/12/2007, 22h56
  3. [XML fonctions] Existent - elles?
    Par Jean_Benoit dans le forum Oracle
    Réponses: 2
    Dernier message: 10/06/2006, 20h35
  4. Réponses: 5
    Dernier message: 24/02/2006, 14h39
  5. Réponses: 5
    Dernier message: 03/12/2004, 10h16

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