5

モナドインスタンスに関連する奇妙な動作が見られます。スナップアプリケーションを作成していますが、ハンドラーの1つで、関数を作成しない限りコンパイルされません。

withManagerこのようにハンドラーで直接呼び出す:

authenticateLanding :: Handler App App ()
authenticateLanding = do
    req <- getRequest
    oir <- liftIO $ withManager $ OpenId.authenticateClaimed (convertParams req)
    writeBS (fromString $ show oir)

このコンパイル時エラーが発生します

openIDTrial.hs:120:25:
    No instance for (Control.Monad.Trans.Control.MonadBaseControl
                       IO m1)
      arising from a use of `withManager'
    Possible fix:
      add an instance declaration for
      (Control.Monad.Trans.Control.MonadBaseControl IO m1)
    In the expression: withManager
    In the second argument of `($)', namely
      `withManager $ OpenId.authenticateClaimed (convertParams req)'
    In a stmt of a 'do' block:
      oir <- liftIO
             $ withManager $ OpenId.authenticateClaimed (convertParams req)

ただし、関数に入れると、そのエラーは発生しません

claim params = liftIO $ withManager $ OpenId.authenticateClaimed (params)

authenticateLanding :: Handler App App ()
authenticateLanding = do
    req <- getRequest
    oir <- claim (convertParams req)
    writeBS (fromString $ show oir)

クレーム関数はコンパイラーに追加情報を追加していないように見えるため、これについては意味がありません。

4

0 に答える 0