3

私はハスケル型にこだわっています。

{-# 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

1 に答える 1

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)

主な落とし穴はmain、Haskellでは常にtype が必要ですが、 type の値をとしてIO a使用しようとしていることです。あなたの実装は正しい軌道に乗っていますが、関数の最初のものはand である必要があります。FacebookT Auth m ()mainrunFacebookTwithManager

型に関しては、実際の do ブロックの型はFacebookT Auth (ResourceT IO) ()です。このrunFacebookT関数は、FacebookTトランスフォーマーをアンラップするために使用され、結果としてResourceT IO ()値が生成されます。この値は、 によって処理さwithManagerれて、単純な古い が生成されIO ()ます。

追加の問題の 1 つは、もともとreadLndo ブロックに なしliftIOで があり、型推論を混乱させていたことです。また、欠落JustしているものをFB.getUser呼び出しに追加しました。

于 2012-07-22T09:29:47.043 に答える