2017-02-07 4 views
0

Ich arbeite an einem Projekt, das auf der einfachen Jaesod-Vorlage aufbaut. Ich bin neu in der funktionalen Programmierung, Haskell und Yesod, also ist es wahrscheinlich etwas für jemanden mit Yesod Erfahrung. Im Moment versuche ich Github API-Aufrufe mit dieser library. Ich erhalte einige Probleme mit den Typen, und ich bin mir nicht einmal sicher, wie ich anfange, sie zu lösen.Yesod: Verwenden von Github API v3 Bibliothek für Haskell

Sie können meinen Handler here finden.

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

Statt 'possibleUser <- GitHub.userInfoForR "mike-brennt"' 'schreiben possibleUser = GitHub.userInfoForR "mike-brennt"' – arrowd

+0

Hallo arrowd lassen. Das beseitigt tatsächlich Fehler, die sich auf die "possibleUser" -Zeile beziehen, aber dann verursacht die Verwendung dieser Variablen in der nächsten "Ergebniszeile den folgenden Fehler (vielleicht muss ich sie mit einem 'in' strukturieren?):' Handler/Home.hs : 49: 59: ' ' Der erwartete Typ konnte nicht gefunden werden. Entweder a0 GitHub.User'' 'mit dem tatsächlichen Typ 'GitHub.Request k0 GitHub.User'' ' Im dritten Argument von' entweder ', nämlich' possibleUser'' 'Im Ausdruck:' 'entweder ((" Error: "<>). tshow) formatUser possibleUser' – StarStuffSteve

Antwort

0

Die GitHub Bibliothek scheint über den Aufbau Anforderungen und laufen ihnen zu sein. Die userInfoForR tut so etwas:

userInfoForR :: Name User -> Request k User 

Sobald Sie eine Anfrage haben, können Sie es mit einer der folgenden Funktionen ausführen, je nachdem, ob Sie zu authentifizieren oder nicht benötigen:

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

I don‘ Ich weiß von diesem speziellen Fall, aber sagen wir, Sie brauchen keine Authentifizierung. Also, tun würde, der folgende Ausdruck den Trick:

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

Nun, um es in einem Handler zu verwenden, müssen Sie über die Tatsache erfahren, dass Handler ist eine Instanz MonadIO, und Sie können so tun :

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

Danke für den Rat, aber ich bin noch nicht ganz da.Obwohl ich glaube, ich verstehe das Problem a etwas mehr Ich schob einen neuen Code mit Ihren Vorschlägen [link] (https://github.com/StarStuffSteve/CS7009/blob/master/yesod_simple/project/Handler/Home.hs). Ich bekomme den folgenden Fehler 'Handler /Home.hs:26:18: Parse irr oder in pattern: GitHub.userInfoForR' Was versuchen wir hier zu erreichen? Nochmals, meine Entschuldigung für meine allgemeine Ignoranz in diesem Bereich. – StarStuffSteve

+0

Was auf der linken Seite des Gleichheitszeichens steht, ist Mustervergleich. Sie können dort keine Funktion aufrufen. – bartavelle

+0

Ist die zweite executeRequest-Typdeklaration, die Sie schreiben, der Körper der Funktion oder ist ein Rumpf der Funktion nicht erforderlich? – StarStuffSteve

Verwandte Themen