モナドインスタンスに関連する奇妙な動作が見られます。スナップアプリケーションを作成していますが、ハンドラーの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)
クレーム関数はコンパイラーに追加情報を追加していないように見えるため、これについては意味がありません。