-1

参照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: 回答を参照

4

1 に答える 1

2

コメントで何が起こっていたかを要約すると、問題は本質的に 3 重でした。Maybe Textaではなく aを返そうとしましたが、FacebookT ... (Maybe Text)a が欠落していreturnたため、型シグネチャの欠如により単型性制限が適用され、最後にrunFacebookTinを忘れましたmain

編集: 4 番目の問題はfbEmail、あまりにも多態的な型を与えていることです。型チェッカーは、型変数aが実際には正確 (ByteString, ByteString)でなければならないことを訴えます。編集: ここで型変数を使用することは、 (任意のリストではなく)のペアのリストが必要なため、関数をにでも適用できることを示していますが、そうではありません。getUserAccessTokenStep2ByteStrings

編集: 5 番目の問題は、モナドを引き継ぐという要件がFacebookTすぎるためです (withManager では、 などのより具体的なものの束である必要があります)。エラーでわかるように、それはかなり長いリストであり、型シグネチャを削除して拡張機能を有効にする方が良いかもしれません ( .MonadIOfbEmailNoMonomorphismRestrictionOverloadedStrings

一般的には明示的な型宣言が必要ですが、私はコンジット パッケージにあまり慣れていないことに注意してください (私はどちらかというとパイプの人間です:P)。また、作成する制約同義語のトリックがあるかどうかもわかりません。冗長ではありません。

これらがばかげたタイプミスでない限り、あちこちにある多くのチュートリアルの 1 つでモナドとモナド変換子について読みたいと思うかもしれません (またはhaskell wikiをチェックしてください)。

また、これらのような質問は、stackoverflow (FAQ を参照) には少し具体的すぎると見なされ、haskell IRC チャネルに適していると見なされる可能性があります (希望どおりに実行できたらフラグを立てますが、将来的にはFreeNode で IRC チャンネルを試すことをお勧めします :))。

于 2012-07-22T23:53:44.880 に答える