参考haskell facebook 示例效果很好,但现在我不知道如何将它拆分到一个单独的模块中,以便我可以用它做一些有用的事情。另外我不知道我需要为 fbEmail fbUrl 放置什么类型,以及是否需要在每个模块中放置 OverloadedStrings?也许我的思考过程是错误的,并且不可能将导入 Network.HTTP.Conduit (withManager) 与 main 分开?
登录.hs
{-# LANGUAGE OverloadedStrings, NoMonomorphismRestriction #-}
module Login (
fbUrl,
fbEmail
) where
import qualified Facebook as FB
import Network.HTTP.Conduit (withManager)
import Data.Text
import Data.ByteString.Internal (ByteString)
app :: FB.Credentials
app = FB.Credentials "localhost" "249348058430770" "..."
url :: FB.RedirectUrl
url = "http://localhost/fb"
perms :: [FB.Permission]
perms = ["user_about_me", "email"]
fbUrl = FB.getUserAccessTokenStep1 url perms
fbEmail c = withManager $ \manager -> FB.runFacebookT app manager $ do
t <- FB.getUserAccessTokenStep2 url [c]
u <- FB.getUser "me" [] (Just t)
return $ FB.userEmail u
主文件
module Main (
main
) where
import Login
import System.IO
main :: IO ()
main = do
u <- fbUrl
print u
a <- readLn
e <- fbEmail a
print e
我收到以下错误
src/Main.hs:11:10:
Couldn't match expected type `IO t0'
with actual type `fb-0.9.6:Facebook.Monad.FacebookT
fb-0.9.6:Facebook.Monad.Auth m0 Data.Text.Internal.Text'
In a stmt of a 'do' block: u <- fbUrl
In the expression:
do { u <- fbUrl;
print u;
a <- readLn;
e <- fbEmail a;
.... }
In an equation for `main':
main
= do { u <- fbUrl;
print u;
a <- readLn;
.... }
代码更新 6:见答案