10

最初の scaffolded Yesod アプリをインストールしようとしています。実行cabal-dev install && yesod --dev develすると、ExitFailure 1 で失敗します。永続化のために sqlite を使用しています。

Application.hs:49:44:
No instance for (monad-logger-0.3.1:Control.Monad.Logger.MonadLogger
                   IO)
  arising from a use of `runMigration'
Possible fix:
  add an instance declaration for
  (monad-logger-0.3.1:Control.Monad.Logger.MonadLogger IO)
In the second argument of `Database.Persist.Store.runPool', namely
  `(runMigration migrateAll)'
In a stmt of a 'do' block:
  Database.Persist.Store.runPool dbconf (runMigration migrateAll) p
In the expression:
  do { manager <- newManager def;
       s <- staticSite;
       dbconf <- withYamlEnvironment
                   "config/sqlite.yml" (appEnv conf) Database.Persist.Store.loadConfig
                 >>= Database.Persist.Store.applyEnv;
       p <- Database.Persist.Store.createPoolConfig
              (dbconf :: PersistConfig);
       .... }
Failed to install testProject-0.0.0
cabal.exe: Error: some packages failed to install:
testProject-0.0.0 failed during the building phase. The exception was:
ExitFailure 1

ここの指示に従おうとしました: http://www.yesodweb.com/book/scaffolding-and-the-site-template この問題に関する情報を見つけることができませんでした。何が欠けているかについての手がかりはありますか?

4

4 に答える 4

7

Control.Monad.LoggerrunFooLoggingTの関数の 1 つを使用します。特に.runNoLoggingT

これは、ライブラリの古いバージョンに自分自身を修正するよりも、おそらくはるかに優れたアイデアです!

于 2013-06-02T19:20:21.100 に答える
4

私はまだトランスフォーマーに慣れているので、コリンの答えに従って、これはロギングを完全に無効にする非常に簡単な方法です:

import Control.Monad.Logger (MonadLogger, monadLoggerLog)
import Control.Applicative  (pure)

instance MonadLogger IO where
    monadLoggerLog _ _ _ = pure $ pure ()

基本的に のNoLoggingTインスタンスを再実装しますMonadIO

ただし、コードベースでこの簡単な修正を取得したら、私が現在行っているように、Haskell WikiのMonad Transformersページに移動する必要があります。)

于 2014-02-20T15:36:51.953 に答える
4

エラー メッセージには、MonadLogger IOインスタンスが見つからないことが示されています。問題は、インストールされている のバージョンmonad-loggerが新しすぎることです。必要なmonad-logger-0.2.4 インスタンスが含まれておりmonad-logger-0.3.0、上記ではどうやら don't .

解決策: cabal ファイルの行に追加&& < 0.3.0して、やり直してください。monad-loggercabal install --only-dependencies

(行がない場合は、 のmonad-loggerように追加し, monad-logger < 0.3.0ます。

于 2013-03-16T10:56:24.763 に答える
0

withSqliteConn参考までに、引数として提供された値をNoLoggingTコンストラクターでラップすることでこれを克服しました。これにより、スタック内のどこかwithSqliteConnを見つけることができMonadLogger、返された結果を次のようにラップ解除しましたrunNoLoggingT

mainWithExplicitConnection2:: IO ()
mainWithExplicitConnection2 =
    runNoLoggingT $ withSqliteConn ":memory:" $ \conn ->
        NoLoggingT $ flip runSqlPersistM conn $ runMigration migrateAll
于 2015-08-25T14:06:58.363 に答える