2017-02-07 2 views
0

Je travaille sur un projet qui s'appuie sur le modèle simple yesod. Je suis nouveau à la programmation fonctionnelle, haskell et Yesod, donc c'est probablement quelque chose d'évident pour quiconque ayant une expérience Yesod. En ce moment j'essaye de faire des appels d'API de github en utilisant ce library. Je rencontre des problèmes de type et je ne sais même pas comment commencer à les résoudre.Yesod: Utilisation de la bibliothèque Github API v3 pour Haskell

Vous pouvez trouver mon handler here.

Handler/Home.hs:43:19: 
    Couldn't match expected type ‘HandlerT 
            App IO (Either a0 GitHub.User)’ 
       with actual type ‘GitHub.Request k0 GitHub.User’ 
    In a stmt of a 'do' block: 
     possibleUser <- GitHub.userInfoForR "mike-burns" 
    In the expression: 
     do { maid <- maybeAuthId; 
      possibleUser <- GitHub.userInfoForR "mike-burns"; 
      result <- either (("Error: " <>) . tshow) formatUser possibleUser; 
      defaultLayout 
      (do { (asWidgetT GHC.Base.. toWidget) 
        ((blaze-markup-0.7.1.1:Text.Blaze.Internal.preEscapedText 
         GHC.Base.. Data.Text.pack) 
         "<p>Your current auth ID: "); 
        (asWidgetT GHC.Base.. toWidget) (toHtml (show maid)); 
        (asWidgetT GHC.Base.. toWidget) 
        ((blaze-markup-0.7.1.1:Text.Blaze.Internal.preEscapedText 
         GHC.Base.. Data.Text.pack) 
         "</p>\n"); 
        .... }) } 


    Handler/Home.hs:44:38: 
    Couldn't match type ‘Text’ with ‘HandlerT App IO a1’ 
    Expected type: a0 -> HandlerT App IO a1 
     Actual type: a0 -> Text 
    In the second argument of ‘(.)’, namely ‘tshow’ 
    In the first argument of ‘either’, namely 
     ‘(("Error: " <>) . tshow)’ 


    Handler/Home.hs:44:45: 
    Couldn't match type ‘Text’ with ‘HandlerT App IO a1’ 
    Expected type: GitHub.User -> HandlerT App IO a1 
     Actual type: GitHub.User -> Text 
    In the second argument of ‘either’, namely ‘formatUser’ 
    In a stmt of a 'do' block: 
     result <- either (("Error: " <>) . tshow) formatUser possibleUser 
+0

au lieu de 'possibleUser <- GitHub.userInfoForR "mike-brûlures"' 'écrire laisser possibleUser = GitHub.userInfoForR "mike-brûlures"' – arrowd

+0

Salut arrowd. Cela supprime en effet les erreurs relatives à la ligne "possibleUser", mais l'utilisation de cette variable dans la ligne de résultat "suivante provoque l'erreur suivante (peut-être faut-il la structurer avec un 'in'?):' Handler/Home.hs : 49: 59: ' ' Impossible de correspondre au type attendu 'Soit a0 GitHub.User'' 'avec le type réel' GitHub.Request k0 GitHub.User'' ' Dans le troisième argument de 'soit', à savoir ' Dans l'expression: ' ' soit (("Erreur:" <>). tshow) formatUser possibleUser' – StarStuffSteve

Répondre

0

La bibliothèque GitHub semble être à propos de la création de requêtes et de leur exécution. Le userInfoForR fait une telle chose:

userInfoForR :: Name User -> Request k User 

Une fois que vous avez une demande, vous pouvez l'exécuter avec l'une des fonctions suivantes, selon si vous devez vous authentifier ou non:

executeRequest :: Auth -> Request k a -> IO (Either Error a) 
executeRequest' :: Request RO a -> IO (Either Error a) 

Je ne Je ne connais pas ce cas particulier, mais disons que vous n'avez pas besoin d'authentification. Ainsi, l'expression suivante ferait l'affaire:

executeRequest' (userInfoForR "mike-burns") :: IO (Either Error User) 

Maintenant, afin de l'utiliser dans un Handler, vous aurez besoin d'apprendre davantage sur le fait que Handler est une instance de MonadIO, et vous pouvez ainsi faire :

euser <- liftIO (executeRequest' (userInfoForR "mike-burns")) 
case euser of 
    Left rr -> ... 
    Right user -> ... 
+0

Merci pour le conseil mais je ne suis pas encore tout à fait là. J'ai poussé un peu de code avec vos suggestions [link] (https://github.com/StarStuffSteve/CS7009/blob/master/yesod_simple/project/Handler/Home.hs). J'obtiens l'erreur suivante 'Handler /Home.hs:26:18: Parse err ou dans le modèle: GitHub.userInfoForR' Qu'est-ce que nous essayons de faire correspondre ici? Encore une fois, mes excuses pour mon ignorance générale dans ce domaine. – StarStuffSteve

+0

Ce qui se trouve à gauche du signe égal correspond au motif. Vous ne pouvez pas appeler une fonction ici. – bartavelle

+0

La seconde déclaration de type executeRequest que vous écrivez est-elle censée être le corps de la fonction ou un corps de la fonction n'est-il pas requis? – StarStuffSteve