Следуя и адаптируя эту запись в блоге, я пытался создайте решение, которое должно позволять тестировать функцию, которая читает env vars (используя System.Environment.lookupEnv).
Таким образом, я должен иметь возможность внедрить искусственную среду для тестов, которые можно будет прочитать вместо выполнения фактического действия ввода-вывода.
Однако проверка типа завершается ошибкой при попытке чтения файла env.
{-# LANGUAGE GeneralisedNewtypeDeriving #-}
...
import RIO.Map (Map)
import qualified RIO.Map as Map
...
import qualified System.Environment as E (lookupEnv)
...
newtype MockEnv m a = MockEnv
{ mockEnv :: ReaderT (Map String String) m a
} deriving (Applicative, Functor, Monad, MonadTrans)
runMockEnv :: MockEnv m a -> Map String String -> m a
runMockEnv (MockEnv e) = runReaderT e
class Monad m => MonadEnv m where
lookupEnv :: String -> m (Maybe String)
instance MonadEnv IO where
lookupEnv = E.lookupEnv
instance Monad m => MonadEnv (MockEnv m) where
lookupEnv k = Map.lookup k <$> ask
-- ^^^ error occurs here
На сайте аск выше выдает следующую ошибку:
/home/[REDACTED].hs:45:34: error:
• Could not deduce (MonadReader (Map String String) (MockEnv m))
arising from a use of ‘ask’
from the context: Monad m
bound by the instance declaration
at [REDACTED].hs:44:10-40
• In the second argument of ‘(<$>)’, namely ‘ask’
In the expression: Map.lookup k <$> ask
In an equation for ‘lookupEnv’: lookupEnv k = Map.lookup k <$> ask
|
45 | lookupEnv k = Map.lookup k <$> ask
| ^^^
-- While building package [REDACTED]
Пожалуйста, не могли бы вы помочь мне понять, почему это не может проверить тип, и что мне нужно сделать, чтобы это исправить? Заранее спасибо.