私が取り組んでいる Haskell プロジェクトで「citation-resolve」パッケージを使用しようとしていますが、実際のコードで EachT を使用するのに苦労しています。それらがモナド変換子であることはわかりました。それが何を意味するのか理解できたと思いますが、実際にそれらを使用する方法を理解できないようです。私がやろうとしていることを表すおもちゃの例は次のとおりです。
module Main where
import Text.EditDistance
import Text.CSL.Input.Identifier
import Text.CSL.Reference
import Control.Monad.Trans.Class
import Control.Monad.Trans.Either
main = do
putStrLn "Resolving definition"
let resRef = runEitherT $ resolveEither "doi:10.1145/2500365.2500595"
case resRef of
Left e -> do
putStrLn ("Got error: "++ e)
Right ref -> do
putStrLn ("Added reference to database: "++ (show ref))
ここでresolveEither
は、次のタイプがあります。
resolveEither :: (HasDatabase s,
Control.Monad.IO.Class.MonadIO m,
mtl-2.1.3.1:Control.Monad.State.Class.MonadState s m)
=> String -> EitherT String m Reference
runEitherT $ resolveEither "ref"
タイプは次のとおりです。
runEitherT $ resolveEither "ref"
:: (HasDatabase s,
Control.Monad.IO.Class.MonadIO m,
mtl-2.1.3.1:Control.Monad.State.Class.MonadState s m)
=> m (Either String Reference)
ただし、これにより次のエラーが発生します。
Main.hs:10:34:
No instance for (Control.Monad.IO.Class.MonadIO (Either [Char]))
arising from a use of ‘resolveEither’
In the first argument of ‘runEitherT’, namely
‘(resolveEither "doi:10.1145/2500365.2500595")’
In the expression:
runEitherT (resolveEither "doi:10.1145/2500365.2500595")
In an equation for ‘resRef’:
resRef = runEitherT (resolveEither "doi:10.1145/2500365.2500595")
解決方法や回避方法がわかりません。
特に、実装ではなく使用の観点からモナドトランスフォーマーを扱うチュートリアルへのポインターを歓迎します。
編集:
dfeuer と Christian の回答に対するコメントを反映するために、main を次のように変更してもエラーが発生します。
main = do
putStrLn "Resolving definition"
resRef <- runEitherT (resolveEither "doi:10.1145/2500365.2500595")
case resRef of
Left e -> do
putStrLn ("Got error: "++ e)
Right ref -> do
putStrLn ("Added reference to database: "++ (show ref))
私が今得るエラーは次のとおりです。
No instance for (MonadState s0 IO)
arising from a use of ‘resolveEither’
In the first argument of ‘runEitherT’, namely
‘(resolveEither "doi:10.1145/2500365.2500595")’
In a stmt of a 'do' block:
resRef <- runEitherT (resolveEither "doi:10.1145/2500365.2500595")
In the expression:
do { putStrLn "Resolving definition";
resRef <- runEitherT (resolveEither "doi:10.1145/2500365.2500595");
case resRef of {
Left e -> do { ... }
Right ref -> do { ... } } }
ここでは、コメントよりも優れたコードの書式設定がはるかに簡単であるため、コメントと同様に質問を編集しています。