169 похожих чатов

Добрый день. Я опять с вопросом "Как достать людей из

монады"
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.

19 ответов

17 просмотров

не понял все таки, а какие данные уже есть, и что нужно получить?

из монады можно достать только выполнив её/cняв конекст

Gradi- Автор вопроса
кана
не понял все таки, а какие данные уже есть, и что ...

Я бегаю по монге. Для каждой базы данных, я получаю список коллекций, а для каждой коллекции — результат. У меня получается методы: 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

Gradi- Автор вопроса
Cheese Syrowiecki
вот mapM как раз и делает то, что надо

Меня правда смущает, что я явно передаю pipe и database ниже по уровню. Но не думаю, что мой мозг выдержит запихивать это в третью монаду поверх двух имеющихся :)

Gradi
Меня правда смущает, что я явно передаю pipe и dat...

не надо третью, засуньте всё в один ReaderT

Gradi
Меня правда смущает, что я явно передаю pipe и dat...

можешь посмотреть на имплисит парамс

Gradi
Меня правда смущает, что я явно передаю pipe и dat...

/me Смотрит гна свой код со стэком из 10 монад в качестве APP

кана
можешь посмотреть на имплисит парамс

имплиситы с ридерами смешивать не надо

Gradi- Автор вопроса
Cheese Syrowiecki
не надо третью, засуньте всё в один ReaderT

Но у меня в ридере аргументы командной строки (хост + мелочи). После того как готов этот ридер, я создаю пайп.

Gradi- Автор вопроса
Cheese Syrowiecki
поменяйте ридер

Имеете в виду data CommandLineArgs = CommandLineArgs { host :: String, ...etc } data ApplicationArgs = ApplicationArgs { commandLineArgs :: CommandLineArgs, pipe :: Pipe } И приложение будет 1. Парсим аргументы (ReaderT CommandLineArgs) 2. Подключаемся 3. Создаём новый ридер (ReaderT ApplicationArgs) .... ?

Gradi- Автор вопроса
Gradi
Имеете в виду data CommandLineArgs = CommandLineAr...

Хотя я использую Options.Applicative для работы с аргументами. Он генерирует красивую хелпу. Может сразу запихать пайпу в CommandLine и научить Options.Applicative одновременно парсить и подключаться к бд?

Gradi
Имеете в виду data CommandLineArgs = CommandLineAr...

можно просто не создавать первый ридер

«Как достать соседа из монады»

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта