Closed olegromashin closed 3 years ago
Пытаюсь испраить Но возникает проблема. Наверное, я что-то не понимаю. По моим понятиям логика бота (которая отражена в модуле Bot не должна зависеть от реализации (Telegram и VK). Или нет? Но, мой бот использует эти две функции , которые мы решили вынести из хандла. Ладно еще initSession. Она вызывается из testException (с которым мы еще не решили, как быть) . testException можно из Bot убрать и продублировать в обеих реализациях. Но, как с newDict,?
Исправил в части initSession но теперь к ней нельзя обратиться из модуля Bot. По этой причине не стал пока трогать newDict
По моим понятиям логика бота (которая отражена в модуле Bot не должна зависеть от реализации (Telegram и VK). Или нет? Но, мой бот использует эти две функции , которые мы решили вынести из хандла.
newDict и так не зависит от реализации. Она же одинаково заполняется и для Телеграма и для ВК. Это тоже самое, что в хэндл функцию map положить initSession, т. е. запуск бота - это не совсем логика бота, это логика приложения. Чтобы бот работал - его надо запустить с какой-то конфигурацией. Поэтому я и предложил вынести эту функцию из хэндла. Для функций логики бота тебе нужна независимость от реализации, поскольку у тебя один модуль для всей логики бота. initSession в этом процессе участие не принимает, у нас нет общей функции для запуска бота. Нам эта функция и не нужна, т. к. общих частей в процессе запуска нет.
testException (с которым мы еще не решили, как быть)
Я надеюсь мы сейчас отрефакторим всё и в другом ишью касательно этой функции придумаем как красиво взаимодействие с ней переделать)
Пиши, если я где-то плохо объяснил или если ты где-то со мной не согласен)
Нет. Ты неплохо объяснил. И я не не согласен. Просто я не плохо понял.
initSession для ВК - это важная функция, совершающая конкретные действия, без которых цикл бота не запустить и не перезапустить
предлагаю просто добавить параметр функции loopBot и передавать туда то что надо сделать в случае рестарта для ВК, а для Телеги передавать pure ()
newDict все время все время не дает мне покоя
А, вижу, да, так просто в отдельную функцию newDict не вынести. Одинаковые имена функций ввели меня в заблуждение. Можно было бы тайпкласс создать, кстати.
Сделано. Давно об этом думал, но до конца не прорисовывалось. Вижу, насколько лучше стало. Еще подумаю, может пополню класс другими функциями
А с этим что решил?
предлагаю просто добавить параметр функции loopBot и передавать туда то что надо сделать в случае рестарта для ВК, а для Телеги передавать pure ()
Не получится. InitSession возвращает IO () именно потому, что она вызывает LoopBoot. А так она готовит параметры, необходимые для запуска LoopBoot.
или я чего не понял в твоем предложении?
Не получится. InitSession возвращает IO () именно потому, что она вызывает LoopBoot. А так она готовит параметры, необходимые для запуска LoopBoot.
Не понял тебя) loopBot (initSession botHandle hLogger conf) botHandle hLogger (DataLoop x [] M.empty $ ts x)
вот так для ВК не получится?
Раз ты говоришь, значит должно получиться. Я просто вообще не понимаю, что тут происходит. Какой тип должен быть у loopBot? loopBot :: Upd a => IO () -> Bot.Handle a -> SL.Handle -> DataLoop a -> IO () ? Это как? Что такое x ? x :: Session Нам бы по этому вопросу как-то по интенсивней пообщаться. А то из-за моей непонятливости это может надолго затянуться. Хотя, конечно, понимаю, твою занятость....
loopBot :: Upd a => IO () -> Bot.Handle a -> SL.Handle -> DataLoop a -> IO () ? Это как?
А вот здесь тебе какая часть непонятна? Аргумент IO ()
?
Непонятно, как его использовать. В какой момент произойдёт вычисление initSession botHandle hLogger conf, и что будет в результате. Вообще, мы говорим о функции InitSection в ее настоящем виде или о какой-то новой? Тип IO() она имеет благодаря действию loopBot botHandle hLogger (DataLoop x [] M.empty $ ts x). И что, получается вроде того:
loopBo (loopBot botHandle hLogger (DataLoop x [] M.empty $ ts x)) botHandle hLogger (DataLoop x [] M.empty $ ts x)?
Понимаю, что ничего не понимаю. Передать функцию в качестве параметра функцию, мне понятно. Но это же что-то другое
Вообще, мы говорим о функции InitSection в ее настоящем виде или о какой-то новой? Тип IO() она имеет благодаря действию loopBot botHandle hLogger (DataLoop x [] M.empty $ ts x).
Откуда такой вывод? Попробуй убрать вызов этой функции в качестве эксперимента и посмотреть будет ли ругаться компилятор (желательно перед запуском компиляции самостоятельно попробовать понять ещё раз).
Непонятно, как его использовать. В какой момент произойдёт вычисление initSession botHandle hLogger conf, и что будет в результате.
Вычисление произойдёт в тот момент, когда ты его используешь.
loopBot (initSession botHandle hLogger conf) botHandle hLogger (DataLoop x [] M.empty $ ts x)
loopBot :: Upd a => IO () -> Bot.Handle a -> SL.Handle -> DataLoop a -> IO ()
loopBot botInit botHandle hLogger dl = do
putStrLn "1"
putStrLn "1"
botInit -- вычисление произойдёт здесь
putStrLn "1"
botInit -- вычисление произойдёт здесь
Конечно, погорячился IO () не от этого И когда произойдет вычисление, тоже догадывался. Но что такое (DataLoop x [] M.empty $ ts x) - не дошло. И как выйти достойно ,получив (DataLoop x [] M.empty $ ts x), совсем не понятно. Стараюсь это осознать
Но что такое (DataLoop x [] M.empty $ ts x) - не дошло. И как выйти достойно ,получив (DataLoop x [] M.empty $ ts x), совсем не понятно. Стараюсь это осознать
Это я просто скопировал запуск бота из initSession.
Дошло, наконец. Но, как стыдно, столько потратить чужого времени... Таких не берут в космонавты ):
Ничего страшного, самое главное, что не зря сидели :)
Я предлагаю утвердить мою редакцию InitSession. Я много думал о testException и пришел к выводу, что она должна обходиться без InitSession. А InitSession необходима для другого случая - когда мы получаем респонс с ошибкой. но эта уже другая ситуация. и она почти решена. Предлагаю влить ветку Issue13, заодно 17 (там просто не о чем). Я открою новую ветку. И ее рамках закончу вопросы с InitSession и testException OK?
Ответил в ПРе :)
Сейчас у тебя в одном хэндле как равноправные функции находятся функции, которые отвечают за цикл бота (получить сообщения, отправить и т. д.) и функция запуска самого цикла бота (initSession). initSession внутри себя выполняет всё остальное, поэтому располагать их на одном уровне неправильно. Я предлагаю вынести initSession из хэндла в обычные функции для Телеграма и ВК. Кроме этого не вижу смысла иметь newDict в хэндле, можно тоже вынести как отдельную функцию.