Yesod ExitFailure 1 при установке подкладок

Я пытаюсь установить свое первое приложение 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 Не удалось найти информацию об этой проблеме. Любые подсказки относительно того, что не хватает?

Ответ 1

В сообщении об ошибке указано, что экземпляр MonadLogger IO отсутствует. Проблема в том, что установленная версия monad-logger слишком новая. monad-logger-0.2.4 содержит экземпляр, который вам нужен, monad-logger-0.3.0 и выше по-видимому, "т.

Решение: Добавьте && < 0.3.0 в строку monad-logger в файле cabal и снова cabal install --only-dependencies.

(Если нет строки monad-logger, добавьте ее как , monad-logger < 0.3.0.

Ответ 2

Используйте одну из функций runFooLoggingT из Control.Monad.Logger. В частности, там runNoLoggingT.

Это, вероятно, гораздо лучшая идея, чем установка на старую версию библиотеки!

Ответ 3

Мне все еще нравится трансформаторы, поэтому после ответа Колина, это очень быстрый способ полностью отключить ведение журнала:

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

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

В основном он повторяет экземпляр NoLoggingT для MonadIO.

Однако, как только вы получите это быстрое исправление на своей кодовой базе, вы должны перейти на страницу Monad Transformers в Haskell Wiki, поскольку я прямо сейчас; )

Ответ 4

FYI, я преодолел это, обернув значение, предоставленное withSqliteConn в качестве аргумента конструктору NoLoggingT, что позволило withSqliteConn найти MonadLogger где-то в стеке, и я развернул возвращенный результат с помощью runNoLoggingT

mainWithExplicitConnection2:: IO ()
mainWithExplicitConnection2 =
    runNoLoggingT $ withSqliteConn ":memory:" $ \conn ->
        NoLoggingT $ flip runSqlPersistM conn $ runMigration migrateAll