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 :

Question gestion d'erreur Haskell


Sujet :

Haskell

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    octobre 2017
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : octobre 2017
    Messages : 1
    Points : 3
    Points
    3
    Par défaut Question gestion d'erreur Haskell
    Salut à tous,
    pour mes cours je dois implémenter en Haskell un module représentant des expressions arithmétiques, pour le moment tout se passe plutot bien. Le problème est que j'ai créé un data Store de type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    type Store = [(String, Float)]
    ce type me permet d'associer un nom de variable à une valeur en float.
    J'ai également une fonction qui va me renvoyer la valeur d'un nom de variable passé en paramètre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    valeurVariable :: String -> Store -> Float
    valeurVariable s [] = error "Variable introuvable"
    valeurVariable s ((a, b):xs)
    	| s == a = b
    	| s /= a = valeurVariable s xs
    Je voulais savoir si à partir de ce code il était possible de coder une fonction de type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    testErreur :: Store -> Maybe Int
    qui appellerait valeurVariable avec un store et une variable a rechercher et qui me renverrait Nothing si l'exception a été levée.

    Si cela n'est pas possible, y'a t'il un moyen de convertir un Maybe Float en Float, je dois absolument manipuler uniquement des Float pour la suite de mon programme.

    Merci d'avance.

  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
    Il n'est pas possible (proprement) d'écrire une fonction qui capture une exception (error soulève une exception) dans une fonction pure (référentiellement transparente), il est nécessaire d'être dans IO pour capturer une exception.
    C'est pourquoi généralement il est préférable de commencer par écrire une fonction totale qui représente explicitement les erreurs en renvoyant Maybe ou Left, puis éventuellement d'enrober ceci dans une fonction partielle (qui soulève une exception).

    Tu devrais donc réécrire "valeurVariable" pour qu'il renvoie Maybe Float.

    Si cela n'est pas possible, y'a t'il un moyen de convertir un Maybe Float en Float, je dois absolument manipuler uniquement des Float pour la suite de mon programme.
    Il n'est bien sûr pas possible de convertir un Maybe Float vers un Float de façon totale sans attribuer une valeur à Nothing. La première façon de se débarrasser d'un Maybe est par pattern matching :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    case maybeFloatValue of
      Nothing -> que faire si la valeur était Nothing (error peut-être ?)
      Just floatValue -> code utilisant la variable floatValue, de type Float
    Cela suffit dans la plupart des cas mais ce n'est pas toujours très compact et peut vite devenir répétitif si tu as beaucoup de valeur Maybe. Il y a donc des fonctions intéressante dans le module Data.Maybe, dont fromJust (fonction partielle qui soulève une exception si l'argument était Nothing), fromMaybe (qui permet de donner une valeur "par défaut" en cas de Nothing) ou même maybe (qui permet de donner une fonction qui traite le contenu de Just et une valeur par défaut pour Nothing).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    let floatValue = fromMaybe 0.0 maybeFloatValue in ....
    Dernièrement si ton code est truffé de calculs qui peuvent échouer et que tu veux "transmettre" cet échec éventuel au résultat final sans avoir à écrire un code très lourd qui vérifie chaque valeur, tu peux utiliser la monade Maybe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    maybeSum :: String -> String -> Store -> Maybe Float
    maybeSum var1 var2 store = do
      val1 <- lookup var1 store
      val2 <- lookup var2 store
      return (val1 + val2)
    --
    Jedaï

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

Discussions similaires

  1. question d'un débutant sur la gestion des erreurs en VBA
    Par David1259 dans le forum VBA Access
    Réponses: 1
    Dernier message: 03/01/2009, 12h43
  2. question sur gestion des erreurs
    Par deuxmains dans le forum Général VBA
    Réponses: 4
    Dernier message: 03/10/2008, 14h50
  3. Réponses: 4
    Dernier message: 13/09/2006, 16h53
  4. gestion d'erreur et de transactions....
    Par Dge dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 08/02/2006, 22h20
  5. [struts] gestion d'erreurs, petite question
    Par Invité dans le forum Struts 1
    Réponses: 2
    Dernier message: 02/01/2006, 13h54

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