2017-02-07 9 views
0

私は単純なyesodテンプレートをベースにしたプロジェクトに取り組んでいます。私は関数型プログラミング、haskell、およびYesodを初めて使用しているので、おそらくYesodの経験を持つ人にとっては明らかです。現時点で私はこのlibraryを使ってgithub APIコールを作成しようとしています。私はいくつかのタイプの問題を抱えているし、私はそれらを解決するアプローチを開始する方法もわからない。Yesod:Haskell用Github API v3ライブラリの使用

私のハンドラ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

- GitHub.userInfoForR "マイク・火傷"' '書き込みpossibleUser = GitHub.userInfoForR "マイク・火傷"' – arrowd

+0

こんにちはarrowdをしましょう。これは実際に "possibleUser"行に関連するエラーを取り除きますが、その変数を次の "result line"で使用すると、次のエラーが発生します(おそらく、 'in'で構造化する必要があります): 'Handler/Home.hs :49:59: ' '予想された型に一致できませんでした 'どちらかa0 GitHub.User'''実際の型' GitHub.Request k0 GitHub.User'' ' 'どちらか'の3番目の引数、 possibleUser'' '式内:' '(("エラー: "<>)。tshow)formatUser possibleUser' – StarStuffSteve

答えて

0

GitHubライブラリはリクエストを作成して実行しているようです。 「

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

を私はドン:

userInfoForR :: Name User -> Request k User 

あなたが要求したら、あなたはあなたが認証したりしないように必要がある場合によっては、以下のいずれかの関数でそれを実行することができます:userInfoForRは、そのようなことを行いますこの特定のケースについては知っていませんが、認証は必要ないとしましょう。

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

さて、Handlerでそれを使用するためには、あなたはHandlerMonadIOのインスタンスであるという事実を知る必要があります、そしてあなたは、このように行うことができますので、次の式では、トリックを行うだろう:

代わりに `possibleUser <の
euser <- liftIO (executeRequest' (userInfoForR "mike-burns")) 
case euser of 
    Left rr -> ... 
    Right user -> ... 
+0

アドバイスありがとうございますが、私はまだかなりありません。私はあなたの提案(リンク:https://github.com/StarStuffSteve/CS7009/blob/master/yesod_simple/project/Handler/Home.hs)でいくつかの新しいコードをプッシュしました。 /Home.hs:26:18:Parse errまたはパターンで:GitHub.userInfoForR'私たちはここでパターンマッチングしようとしていますか?再び、この分野における私の一般的な無知に対する私の謝罪。 – StarStuffSteve

+0

等号の左側にあるのはパターンマッチです。そこでは関数を呼び出すことはできません。 – bartavelle

+0

2番目のexecuteRequest型の宣言は、関数の本体となるか、関数本体が必須ではないと書いていますか? – StarStuffSteve

関連する問題