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 :

Signature d'une fonction Haskell


Sujet :

Haskell

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Ingénieur après-vente
    Inscrit en
    novembre 2014
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur après-vente

    Informations forums :
    Inscription : novembre 2014
    Messages : 366
    Points : 9
    Points
    9
    Par défaut Signature d'une fonction Haskell
    Bonjour,

    Quelle est la différence entre les deux signatures de cette même fonction "factorial" :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    factorial :: Int -> Int
    factorial 0 = 1
    factorial n = n * factorial (n - 1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    factorial :: (Integral a) => a -> a
    factorial 0 = 1
    factorial n = n * factorial (n - 1)
    Merci pour votre aide.

  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 560
    Points
    8 560
    Par défaut
    "Int -> Int" indique que la fonction prend en argument une valeur de type Int (un entier machine, signé, de 32 ou 64 bits selon ton architecture et la version de GHC, plus probablement du 64 bits maintenant, tu peux tester en tapant maxBound :: Int sous GHCi) et renvoie une valeur de type Int.

    "(Integral a) => a -> a" contient une variable de type "a" contrainte par "(Integral a)" de sorte que "a" ne peut représenter que des types qui sont des instances de la Typeclass Integral (laquelle est normalement utilisée pour des types qui peuvent représenter des quantités entières comme Int, Integer (entier illimité), Word, Word8, Word16... ). Donc cette fonction prend un type instance de Integral et renvoie ce même type, on peut donc utiliser cette version de la fonction avec n'importe quel type qui représenterait des entiers au lieu de seulement avec des entiers machines (Int). C'est particulièrement intéressant avec Integer ici car la fonction factorielle croît extrêmement vite et les résultats dépasse rapidement les capacités des entiers machines (surtout si tu es en 32 bits mais même en 64 bits, 21! est déjà trop grand).

    Note que ce n'est pas le type le plus général de factorial, si tu tapes seulement son code sans lui donner de signature, le type inféré (que tu peux obtenir avec ":t factorial" avec GHCi) est "(Num a) => a -> a" parce que factorial n'utilise aucune opérations spécifiques aux entiers, seulement des opérations de la classe Num : (*), (-) et implicitement fromInteger pour convertir les constantes 0 et 1. Bien sûr ce type est une mauvaise idée vu l'implémentation de factorial parce qu'avec un type numérique quelconque, tu n'es plus garanti d'atteindre le cas de base 0 en soustrayant 1 (ce qui est le cas avec des entiers, positifs du moins).

    --
    Jedaï

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Ingénieur après-vente
    Inscrit en
    novembre 2014
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur après-vente

    Informations forums :
    Inscription : novembre 2014
    Messages : 366
    Points : 9
    Points
    9
    Par défaut
    Ok, parfait. Merci beaucoup !

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

Discussions similaires

  1. Problème de signature d'une fonction
    Par Jimmy91 dans le forum C++
    Réponses: 9
    Dernier message: 16/09/2014, 17h32
  2. Stocker la signature d'une fonction dans un template!
    Par nixmind dans le forum C++/CLI
    Réponses: 4
    Dernier message: 20/06/2011, 20h23
  3. Signature d'une fonction sans argument
    Par cj227854 dans le forum C++
    Réponses: 5
    Dernier message: 20/10/2005, 17h01

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