Anatolii
я не хочу накапливать
Anatolii
я хочу выбросить первую которая попалась
Anatolii
я в начале вот так записал checkUser :: User -> Either TodoErr () checkUser u = checkPassword u >> checkLogin u
Anatolii
но это как-то не очень:)
Evgeniy
А мне кажется ок причём тут явно видно монады😊но это имхо
Evgeniy
Мне например лично нравится пропускать через цепочку что-то 😊
Evgeniy
А на выходе забирать результат
Evgeniy
Но ты же знаешь что я не супер эксперт😊
Anatolii
ну я такой же эксперт как и ты:?)
Anatolii
* :)
Anatolii
просто если этих проверок будет увеличиваться
Anatolii
то как-то приятнее их в список засунунть
Evgeniy
Ну реально не >> а >>= вот соль то
Evgeniy
Ну я думаю просто дрбавить >>= и твою монады и все
Anatolii
это мне надо тогда чтобы все функции проверок возвращали User
Anatolii
Either MyErr User
Anatolii
а у меня сейчас Either MyErr ()
Anatolii
смысла то возвращать User нету
Anatolii
я не изменяю его состояние
Anton
почему бы не накапливать, а потом выбросить первую?
Anton
Тебе надо чтобы ошибки накапливались то думаю райтер
Anton
я не хочу накапливать
Evgeniy
Да согласен но операция прерывается есть же guard посмотри как работают
Aleksey
[User -> Either MyErr ()] -> User -> Either MyErr ()
check funcs user = lefts $ map funcs ($ user)
Evgeniy
Те вычисления прекращаются если что-то не то
Anton
тогда уж check funcs user = head $ lefts $ map ($ user) funcs
Anatolii
вот это уже страшные oneliners пошли:)
Aleksey
https://hackage.haskell.org/package/applicative-fail-1.1.1/docs/Control-Monad-Fail.html есть ещё пакет для валидации такой
Evgeniy
вот это уже страшные oneliners пошли:)
А так да в листах как-то динамично будет ,писать почти ненадо, при изменениях и добавлениях в правила валидации , добавил в лист правило или удалил и все😊
Aleksey
либо ExceptT + StateT
Anatolii
можно ExceptT + ReaderT
Anatolii
стэйт тут не нужен
Evgeniy
а у меня сейчас Either MyErr ()
Кстати а почему так может лучше Either MyErr User?
Anatolii
мне кажется что такой тип может сбить с толку
Anatolii
в моем случае явно видно что User не меняется
Evgeniy
Почему или эрр или юзер?
Anatolii
ну и что функция вообще ничего не делает
Anatolii
кроме того как проверяет
Anatolii
а когда она возвращает Юзера
Anatolii
уже вопросы могу возникнуть
Anton
зачем тогда Either, если можно Maybe
Anatolii
ну и что оно даст?
Anatolii
ну Left у Either - это как раз ошибка
Evgeniy
Ну мэйби это типа как я понимаю или есть или нет
Evgeniy
А почему нет хз
Anatolii
а Just у Maybe - это наоборт нормально обычно:)
Evgeniy
А эйзер если нет то можно подробности выдать почему😊
Anatolii
их чтнеия книг я понял что для ошибок именное Left у Either используют
Evgeniy
Ну я знаю но туду же в лефт запихать хоть что можео
Evgeniy
Что душе угодно
Evgeniy
Свои ерроры или функции или типы итп
Evgeniy
Я читал про 8 способов обработки ошибки - был в шоке , сейчас думаю ошибокив хаскель нету понятия это тоже результат😊имхо
Anatolii
ну как же нету
Anatolii
вон в EitherT есть функция
Anatolii
throwError
Anatolii
ну и монада Either как по мне явно показывает
Anatolii
что это огибки
Anatolii
которые в Go обрабатывают каждый раз if err != nil
Evgeniy
Моё может ошибочное мнение это чтобы понятно было для клиента либ😊
Evgeniy
Я скажу коротко - отсутствие результата тоже результат
Anatolii
ну в хаскеле ж есть как раз () для отсутствия результата:)
Evgeniy
Ну это если тебе не требуется действия на этот результат
Anatolii
ну да
Evgeniy
Я думаю ты согласиться что действия это результат ответа на входной параметр
Evgeniy
Вот в Эрланге мне нравится - если это не в нашем понятии умираем и возраждаемся как будто этого не было ( фолт толерант)
Evgeniy
Толя добавлю вот например ты думаешь юзер менее метра с кепкой это не наш человек мы его игнорирует(еррор) а выше ок! И вот эйзер в левт кидает юзеров менее метра с кепкой а право более
Evgeniy
Те ошибка это тоже результат только не в нашем уютном мире😊
Evgeniy
Те просто вычисления идут в другом рукаве
Evgeniy
Это чисто имхо
Evgeniy
И юзеров в лефт мы можем в логи писать или просто в /dev/null
Anatolii
я бы сделал кортеж из двух списков
Anatolii
но твои вариант тоже имеет право на жизнь :)
Anatolii
ну у эрланга там своя система целая:)
Evgeniy
Да я согласен с эрлангом что нельзя все предвидеть - то что не в нашем множестве отвергаем и непаримся😊
Evgeniy
А валидация как думаешь сделать?
Anatolii
в хаскеле?
Anatolii
со сбором ошибок?
Anatolii
так там mapM какой-то подойдет наверное
Evgeniy
Ну например эти те ошибка или ошибки до чего - какие действия нужны(например информирует кого-то на юи или ещё что-то)
Anatolii
sequence [checkPassword, checkLogin] u