У меня есть класс типов, который выполняет некоторый ввод-вывод. Я немного обобщил это, используя MonadIO
:
class MonadIO m => MonadDB m where
getSomething :: String -> m Something
getSomething s = -- do some IO stuff with liftIO
В тесте я хочу заменить реализацию, чтобы протестировать функцию, использующую getSomething
, поэтому я делаю это:
newtype WorkingDBM a = WorkingDBM (Identity a)
deriving (Functor, Applicative, Monad)
instance MonadDB WorkingDBM where
getSomething s = return $ Something "blah"
Без объявления экземпляра код предупреждает:
• No explicit implementation for ‘liftIO’
• In the instance declaration for ‘MonadIO WorkingDBM’
Итак, я добавляю:
instance MonadIO WorkingDBM
который, конечно, компилируется.
Запуск тестов в Hspec вызывает эту ошибку времени выполнения:
uncaught exception: NoMethodError (test/BlahSpec.hs:45:10-33: No instance nor default method for class operation liftIO
Я пытался использовать liftIO
из Control.Monad.IO.Class
:
-- C is the qualified import for Control.Monad.IO.Class
liftIO = C.liftIO
но это приводит к исключению времени выполнения NonTermination
:
uncaught exception: NonTermination (<<loop>>)
Любые идеи, как я могу решить это, пожалуйста?
IO
в своем тесте и не поддерживайте настоящиеIO
вWorkingDBM
. - person Daniel Wagner   schedule 17.01.2017liftIO
, поэтому я не могу не выполнить ввод-вывод. Что значит поддержка реальная? Я думал, чтоMonadIO
будет достаточно для этого. - person Alex   schedule 17.01.2017IO
внутри экземпляраMonadDB
в своем тесте. - person Daniel Wagner   schedule 17.01.2017MonadDB
; Мне нужно использоватьliftIO
внутри функции, которую я тестирую (которая использует экземплярMonadDB
). - person Alex   schedule 17.01.2017liftIO
. - person Alex   schedule 17.01.2017