2017-02-07 13 views
0

나는 간단한 yesod 템플릿을 기반으로하는 프로젝트 작업을하고 있습니다. 나는 기능 프로그래밍, haskell 및 Yesodd를 처음 사용하므로 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"줄과 관련된 오류를 제거하지만 다음 "결과 줄에서 그 변수를 사용하면 다음 오류가 발생합니다 (아마도 'in'을 사용하여 구조화해야합니까?) : Handler/Home.hs : 49 : 59 :' '예상 유형과 일치 할 수 없음 'A01 GitHub.User''실제 유형'GitHub.Request k0 GitHub.User'' ' 'either'의 세 번째 인수 인 ' possibleUser'' '표현식 :' '(("오류 :"<>). tshow) formatUser possibleUser' – StarStuffSteve

답변

0

GitHub 라이브러리는 요청을 빌드하고 실행하는 것 같습니다. userInfoForR 않는 그런 일 :

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

내가 돈 ': 당신이 요청을 일단 당신이 인증 여부를해야하는 경우

userInfoForR :: Name User -> Request k User 

, 당신은 따라 다음 기능 중 하나를 실행할 수 있습니다 이 특정 사례에 대해 알고 있지만 인증이 필요 없다고합시다. 그래서, 다음과 같은 표현은 트릭 할 것 :

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 : 구문 분석 오류 또는 패턴 : GitHub.userInfoForR' 우리가 여기서 일치하는 패턴은 무엇입니까? 다시,이 지역에 대한 나의 일반적인 무언가에 대한 사과. – StarStuffSteve

+0

등호 왼쪽에있는 것은 패턴 일치입니다. 함수를 호출 할 수 없습니다. – bartavelle

+0

두 번째 executeRequest 유형 선언은 함수의 본문으로 쓰거나 필수가 아닌 함수의 본문입니까? – StarStuffSteve