haskell: читалка-монада для внедрения зависимостей - PullRequest
0 голосов
/ 13 ноября 2018

Я получил базовую функциональность читательской монады из книги learnyouahaskell, и я видел здесь несколько советов, как использовать ее для внедрения зависимостей. даже здесь есть несколько примеров на стеке потока, я не знаю, как использовать его для тестирования интеграции.

мой код:

list :: Ctx -> [String] -> IO String
list ctx args = do
    d <- eitherDecode <$> Uplink.get (token ctx) (endpointActivities ctx) :: IO (Either String Activities)
    case d of 
        Left err -> return err 
        Right result -> return $ unlines . filterByPrefix (parsePrefix args) . extractNames $ activities result

uplink.hs

get :: String -> String -> IO B.ByteString
get token endpoint = do
    req <- parseRequest endpoint
    resp <- httpLBS $ withAuth token req
    return $ getResponseBody resp

как я могу издеваться над httpLBS - вызовом для тестирования интеграции с читалкой-монадой?


РЕДАКТИРОВАТЬ: !!!!

У меня почти есть это сейчас с читалкой-монадой. осталась только одна проблема - я не знаю, как определить эту функцию httpsLBS в моем типе данных Ctx.

httpLBS -функции-подпись:

httpLBS :: MonadIO m => Request -> m (Response ByteString) 

мое определение типа данных Ctx:

data Ctx =
    Ctx {
        token :: String,
        endpointActivities :: String,
        endpointTimeTrackingStart :: String,
        httpLBSFunc :: MonadIO m => Request -> m (Response ByteString)
    } deriving (Show)

я всегда получаю сообщение об ошибке: Не входит в область: переменная типа ‘m’ Как я могу определить эту функцию в моем типе данных Ctx с ее ограничениями?

Я обещаю, что выложу свое решение позже, когда эта последняя проблема будет решена

1 Ответ

0 голосов
/ 13 ноября 2018

В Haskell внедрение зависимостей - это просто программирование высшего порядка + каррирование.Вы можете написать свой код следующим образом.

-- where (? -> ?) is the type of httpLBS
get_ :: (? -> ?) -> String -> String -> IO B.ByteString
get_ httpFunc token endpoint = do
    req <- parseRequest endpoint
    resp <- httpFunc $ withAuth token req
    return $ getResponseBody resp

getProduction = get_ httpLBS

getTest = get_ httpMock
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...