монады"
funcA :: ReaderT env m [a]
funcA = map funcB [1..]
funcB :: ReaderT env m a
funcB = undefined
Как в funcA превратить` [ReaderT env m a] ` в ReaderT env m [a] ? Нужно использовать runReader?
PS. m у меня IO.
не понял все таки, а какие данные уже есть, и что нужно получить?
из монады можно достать только выполнив её/cняв конекст
например runReaderT "выполнит" Reader и снимет его
Я бегаю по монге. Для каждой базы данных, я получаю список коллекций, а для каждой коллекции — результат. У меня получается методы: checkDatabase :: Pipe -> Database -> ReaderT CommandLineArgs IO [CheckResult] checkDatabase pipe db = do collections <- -- get collections mapM (checkCollection pipe db) collections checkCollection :: Pipe -> Database -> Collection -> ReaderT CommandLineArgs IO CheckResult checkCollection = undefined
вот mapM как раз и делает то, что надо
Меня правда смущает, что я явно передаю pipe и database ниже по уровню. Но не думаю, что мой мозг выдержит запихивать это в третью монаду поверх двух имеющихся :)
не надо третью, засуньте всё в один ReaderT
можешь посмотреть на имплисит парамс
/me Смотрит гна свой код со стэком из 10 монад в качестве APP
имплиситы с ридерами смешивать не надо
Но у меня в ридере аргументы командной строки (хост + мелочи). После того как готов этот ридер, я создаю пайп.
хм, я так не считаю
Имеете в виду data CommandLineArgs = CommandLineArgs { host :: String, ...etc } data ApplicationArgs = ApplicationArgs { commandLineArgs :: CommandLineArgs, pipe :: Pipe } И приложение будет 1. Парсим аргументы (ReaderT CommandLineArgs) 2. Подключаемся 3. Создаём новый ридер (ReaderT ApplicationArgs) .... ?
Хотя я использую Options.Applicative для работы с аргументами. Он генерирует красивую хелпу. Может сразу запихать пайпу в CommandLine и научить Options.Applicative одновременно парсить и подключаться к бд?
можно просто не создавать первый ридер
пусть парсер только парсит
«Как достать соседа из монады»
Обсуждают сегодня