2012-07-21 69 views
3

我被困在haskell類型中。haskell facebook示例

{-# LANGUAGE OverloadedStrings #-} 

module Main (
    main 
) where 

import qualified Facebook as FB 
import Network.HTTP.Conduit (withManager) 
import Control.Monad.IO.Class (liftIO) 
import System.IO 

app :: FB.Credentials 
app = FB.Credentials "localhost" "249348058430770" "..." 

url :: FB.RedirectUrl 
url = "http://localhost/fb" 

perms :: [FB.Permission] 
perms = ["user_about_me", "email"] 

main :: IO() 
main = do 
    fbAuthUrl <- FB.getUserAccessTokenStep1 url perms 
    liftIO $ print fbAuthUrl 
    argument <- readLn 
    token <- FB.getUserAccessTokenStep2 url [argument] 
    withManager $ \manager -> do 
     FB.runFacebookT app manager $ do 
      u <- FB.getUser "me" [] token 
      liftIO $ print (FB.userEmail u) 

錯誤

src/Main.hs:23:18: 
    Couldn't match expected type `IO t0' 
       with actual type `FB.FacebookT 
            FB.Auth m0 text-0.11.2.0:Data.Text.Internal.Text' 
    In the return type of a call of `FB.getUserAccessTokenStep1' 
    In a stmt of a 'do' block: 
     fbAuthUrl <- FB.getUserAccessTokenStep1 url perms 
    In the expression: 
     do { fbAuthUrl <- FB.getUserAccessTokenStep1 url perms; 
      liftIO $ print fbAuthUrl; 
      argument <- readLn; 
      token <- FB.getUserAccessTokenStep2 url [argument]; 
      .... } 

http://hackage.haskell.org/package/fb

+4

'main :: liftIO'類型沒有任何意義。你的意思是'main :: IO()'? – 2012-07-21 22:25:04

+0

我不知道?我不像putStrLn返回任何IO()? – 2012-07-21 23:25:18

+0

幫助我們爲您提供幫助:1.在尋求有關錯誤的幫助時,請始終在您的問題中提供完整的錯誤消息。 2.當詢問一個沒有捆綁到你的編譯器的包時,總是告訴我們包名。 – dave4420 2012-07-22 01:16:10

回答

2

首先,讓我前言本答案由我從來沒有實際使用Facebook的API或Conduits庫中的免責聲明,所以我不知道這段代碼實際上是否做了任何明智的事情,但通過只輸入類型信息,我認爲這是你正在嘗試做的事

main :: IO() 
main = withManager $ \manager -> FB.runFacebookT app manager $ do 
    fbAuthUrl <- FB.getUserAccessTokenStep1 url perms 
    liftIO $ print fbAuthUrl 
    argument <- liftIO $ readLn 
    token <- FB.getUserAccessTokenStep2 url [argument] 
    u <- FB.getUser "me" [] (Just token) 
    liftIO $ print (FB.userEmail u) 

主要缺陷是,在Haskell main必須總是有型IO a,但你要使用FacebookT Auth m()類型的值作爲你main。你的實現是正確的,但runFacebookTwithManager需要是該函數中的第一件事。

從類型上看,實際的do-block的類型爲FacebookT Auth (ResourceT IO)()runFacebookT功能用於解開FacebookT變壓器,產生一個ResourceT IO()值,該值依次由withManager進行處理以產生一個普通的舊的IO()

另外一個問題是,你最初在你的do-block中有一個readLn沒有liftIO,這是令人困惑的類型推理。我還將缺少的Just添加到FB.getUser調用中。

+2

Haskell中的'main'實際上可以是'IO a'。 – 2012-07-22 10:52:31

+0

啊,我不知道。固定。 – shang 2012-07-22 10:57:53

+0

打印完美但我得到'用戶錯誤(Prelude.readIO:沒有解析)'當readLn? – 2012-07-22 15:50:20