参照haskell facebook exampleは完璧に機能しますが、別のモジュールに分割する方法がわからないので、何か便利なことを行うことができます。また、fbEmail fbUrl にどのタイプを配置する必要があるか、またすべてのモジュールに OverloadedStrings を配置する必要があるかどうかもわかりません。たぶん私の思考プロセスが間違っていて、インポート Network.HTTP.Conduit (withManager) をメインから分離するのは簡単ではありませんか?
login.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
main.hs
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: 回答を参照