@scala_ru

Страница 949 из 1499
Alexander
21.09.2017
18:36:50
Ну или я не привык ещё.

Oleg
21.09.2017
18:40:09
и в ключевых точках ты можешь явно их преобразовывать

и в некоторых отдельных точках ты можешь что-то вывести из этого типа

Google
Oleg
21.09.2017
18:42:05
Например, статускоды и типы для сваггера, отличающиеся от 200

Pavel
21.09.2017
18:43:46
окей, но так же можно сделать по типу эксепшены в условном error handler. Но еще вопрос же в другом, если тебе в одном методе в for нужно заюзать два метода с разными ошибками - их нужно будет приводить или к верхнему тему или вставлять обработчик (если не хочешь приводить к верхнему типу)

если приводим к верхнему типу то мы тогда теряем конкретные типы ошибки - что получается - смысл тогда от either

если постоянно обрабатывать - тут получается вопрос удобства возникает

один раз окей, а если несколько

Oleg
21.09.2017
18:46:28
ты почему-то заранее представил ровно один способ работать с ошибками в типах - и это иерархия типов и EitherT

На самом деле, я говорю о другом коде, там нет приведения к верхнему типу и нет EitherT

Pavel
21.09.2017
18:48:29
мне тогда нужен пример - ровно один способ это тот о котором все пишут в статьях когда я гуглю future either

поэтому у меня и возник вопрос - все пишут, а кто его юзает

Oleg
21.09.2017
18:49:39
Тогда подними этот ток завтра, а то я сливаюсь сейча

Pavel
21.09.2017
18:50:08
окей

Igor
21.09.2017
18:56:18
есть какие-нибудь варианты вставить элемент в лист в нужное место красивее этого? def insertForkToList(tree: CodeTree, list: List[CodeTree]): List[CodeTree] = { def f(ct: CodeTree) = {some filter} (list.filter(f) :+ tree) ::: list.filterNot(f) }

Bulat
21.09.2017
19:00:52
list.partition(f) match { case (left, right) => left :: tree :: right }

Google
Bulat
21.09.2017
19:01:06
не знаю насколько это "красивее")

можно так val (left, right) = list.partition(f) left :: tree :: right

Cyrillos
21.09.2017
19:05:46
Парни, а где java 9 то? Сегодня же релиз, не?

Интернеты молчат

Ilya
21.09.2017
19:09:34
http://www.java9countdown.xyz/

здесь салют

Nikolay
21.09.2017
19:16:42
что, теперь правда можно val list = new ArrayList<String>(); ?

Cyrillos
21.09.2017
19:16:56
здесь салют
а на оракле 9 нету(

Pavel
21.09.2017
19:17:06
джава днище

Cyrillos
21.09.2017
19:18:15
Kirill
21.09.2017
19:36:58
а что, с девяткой скала норм, модули не мешают?

Alexander
21.09.2017
19:49:51
а что, с девяткой скала норм, модули не мешают?
Можно без модулей. Правда, их вообще выпилить хотели. Я с тех пор не следил.

Nikolay
21.09.2017
19:52:34
а на оракле 9 нету(
http://www.oracle.com/technetwork/java/javase/downloads/index.html

Вроде есть

Cyrillos
21.09.2017
19:52:58
ага, вот только в этом часе появилась

я уже поставил, пробую)

Nikolay
21.09.2017
20:34:01
а у yourkit раньше была personal license. теперь нет? https://www.yourkit.com/purchase/

Cirno
21.09.2017
20:35:15
Только 64 бит, хех.

Google
Cirno
21.09.2017
20:36:01


Nick
21.09.2017
20:47:06
А докер имедж на Алпаине будет?)

Вообще конечно зря 32 битную не оставили

Nikolay
21.09.2017
21:02:22
по akka streams есть вопрос. может быть кто сталкивался - поделитель опытом. есть flow, который состоит из множества этапов. каждый этап может вернуть либо ошибку(но не кинуть исключение), либо результат. если один из этапов вернул ошибку - остальные этапы не нужно выполнять. все элементы должны дойти до конца flow. текущее решение - каждый этап Flow возвращает Either[MyError, Result]. на каждом этапе проверяем, если это Left - просто пробрасываем в следующий этап, никак не обрабатывая. В конечном счете становится несколько муторно, но в принципе терпимо. есть вариант описать через GraphDSL, где ошибки будут сразу кидаться в конец графа, минуя все этапы.

какие еще есть варианты, что реализовали может?

Oleg
21.09.2017
21:18:20
по akka streams есть вопрос. может быть кто сталкивался - поделитель опытом. есть flow, который состоит из множества этапов. каждый этап может вернуть либо ошибку(но не кинуть исключение), либо результат. если один из этапов вернул ошибку - остальные этапы не нужно выполнять. все элементы должны дойти до конца flow. текущее решение - каждый этап Flow возвращает Either[MyError, Result]. на каждом этапе проверяем, если это Left - просто пробрасываем в следующий этап, никак не обрабатывая. В конечном счете становится несколько муторно, но в принципе терпимо. есть вариант описать через GraphDSL, где ошибки будут сразу кидаться в конец графа, минуя все этапы.
решал двумя способами, первый способ - был такой же комбинировал с помощью операторов, вдохновлённых https://hackage.haskell.org/package/base-4.10.0.0/docs/Control-Arrow.html#t:ArrowChoice на коты, к несчастью, не могу дать ссылку, у них Choice бедноватый Но в общем суть в том, что простыми операторами Flow[A, B] или Flow[A, Either[E, B]] становятся Flow[Either[E, A], Either[E, B]], который уже встроенными способами композится

Второй вариант - написать собственных композеров для FanOutShape2, внутри которых merge

Первый больше понравился

Nikolay
21.09.2017
21:22:54
Второй вариант - написать собственных композеров для FanOutShape2, внутри которых merge
примера не будет случайно? это уже на graphDSL нужно будет переходить, верно? или можно плоским Flow обойтись?

Oleg
21.09.2017
21:24:22
примера не будет случайно? это уже на graphDSL нужно будет переходить, верно? или можно плоским Flow обойтись?
один раз маленький кусок пишешь на graphDSL, потом в implicit class ы засовываешь коды, чтобы своим via дополнить

Alexander
22.09.2017
00:16:08
Господи, ну и мерзость.

Бота нельзя суммонить?

Aleksei
22.09.2017
03:24:17
Бот не просек

Oleg
22.09.2017
05:00:31
пропустил

Daniel
22.09.2017
08:34:54
это гуманная стратегия сработала он игнорит тех кто оказался в чате до его прихода

Oleg
22.09.2017
08:54:39
так что там было то?

Daniel
22.09.2017
08:57:20
спам для бородачей

и фоточка бороды в виде хелицер

folex
22.09.2017
09:22:28
У меня тут странное в sbt. В некоторых подпроектах добавление .settings(Defaults.coreDefaultSettings) выдает ошибку при запуске сбт: [error] References to undefined settings: [error] {.}/*:thisProjectRef from {.}/*:onLoadMessage ((sbt.Defaults) Defaults.scala:178) [error] Did you mean subproject1/*:thisProjectRef ? [error] {.}/*:thisProject from {.}/*:baseDirectory ((sbt.Defaults) Defaults.scala:1062) [error] Did you mean subproject2/*:thisProject ? [error] {.}/*:thisProject from {.}/*:name ((sbt.Defaults) Defaults.scala:176) [error] Did you mean subproject2/*:thisProject ?

подпроекты вроде бы точно такие же как остальные, но падает только в этих двух

Google
folex
22.09.2017
09:25:30
непонятно даже в какую сторону копать. Я так понимаю проблема в том что > thisProject: Provides the Project associated with this scope (undefined at the global and build levels) > thisProjectRef: Provides the ProjectRef for the context (undefined at the global and build levels) но каким образом я мог поменять скоуп на global - непонятно

И еще странное поведение: inThisBuild(test in assembly := {}) не работает. А вот если руками в каждый сабпроект проставить это, то работает. При этом я никак сверху не накатываю нигде настроек ассембли дополнительных. Может быть так что autoplugin перетирает inThisBuild настройки?

Pavel
22.09.2017
10:46:01
@odomontois так это, че там по поводу Future[Either]?

Oleg
22.09.2017
10:46:52
Щащащащаща

Вечерком

Mikhail
22.09.2017
10:49:07
@odomontois так это, че там по поводу Future[Either]?
Ну я ещё так делаю, потому что явно лучше чем неявно т видно какие ошибки есть

EitherT облегчает жизнь, да

Alexey
22.09.2017
10:49:47
по akka streams есть вопрос. может быть кто сталкивался - поделитель опытом. есть flow, который состоит из множества этапов. каждый этап может вернуть либо ошибку(но не кинуть исключение), либо результат. если один из этапов вернул ошибку - остальные этапы не нужно выполнять. все элементы должны дойти до конца flow. текущее решение - каждый этап Flow возвращает Either[MyError, Result]. на каждом этапе проверяем, если это Left - просто пробрасываем в следующий этап, никак не обрабатывая. В конечном счете становится несколько муторно, но в принципе терпимо. есть вариант описать через GraphDSL, где ошибки будут сразу кидаться в конец графа, минуя все этапы.
да, только так. третьего способа мне не известно. первый или второй сильно зависит от домена. можно сделать свой маленький EitherFlow[T], который будет скрывать всю сложность. можно все в рукопашную, что тоже ок

Mikhail
22.09.2017
10:50:53
@odomontois так это, че там по поводу Future[Either]?
Плюс ошибка не всегда исключение, глупо их кидать когда не надо.

Pavel
22.09.2017
10:52:20
тогда вопрос) Есть трейт Error и от от него два вида еррора. Потом у тебя есть метод который делаешь for и там вызывается два других метода - Future[Either[ErrorA, String]] и Future[Either[ErrorB, String]], когда ты делаешь flatMap с EitherT они у тебя подведутся к общему типу Error - ну и как тут видно какая именно ошибка там?

это тоже самое что хэндлить эксепшен общий

Oleg
22.09.2017
10:53:27
@odomontois так это, че там по поводу Future[Either]?
В общем, куски кода позже. Но идея такая. У тебя есть своя кастомная монадка, не какое-то говнонаслоение Eff или трансформеров, а совсем свой тир со сложным типом ошибки. Это не надтип всех ошибок, но из разнообразных ошибок в него есть морфизмы

Ты для каждого локального типа ошибки объявляешь FunctorRaise ( по новому котовьему словарю)

А в сервисах требуешь один какой-то конкретный

Идея в том, что ты можешь добавить какие-то новые ошибки легко, от некоторых тебе может ничего и не надо кроме текста. Некоторые превратятся в свой собственный подтип sealed trait, чтобы потом можно было заматчить на статускод

Но твоя эта суперошибка - это не свалка всего, она описывает все способы обработать ошибку в итоге и информацию, которая для этого тебе понадобится

Pavel
22.09.2017
10:58:32
окей, возможно когда речь идет о своей монаде, и возможно она еще неплохо абстрагирована от внешнего мира - то наверное имеет смысл там делать свои ошибки

но это я так понимаю речь не о Future[Either]

а о M[Either]

Google
Pavel
22.09.2017
11:01:55
тут речь на самом деле о Future, о том классе который и так уже хендлит исключительные ситуации и позволяет обрабатывать их отдельно

Oleg
22.09.2017
11:02:07
Речь идёт о чём-то типа final case class MyApp[+A]( Context => Task[Either[MyError, MySpecialResult[A]]])

Pavel
22.09.2017
11:03:28
окей, и ты предлагаешь в MyError пихать ошибки связанные с каким-то допустим условиями валидации или чет такого что влияет только на MySpecialResult

допустим где все зависит от исходных параметров

давай допустим поговорим о доступе к базе где могут кидаться ошибки мол констрейт нарушен или допустим нету конекшена в базу

Oleg
22.09.2017
11:04:12
тут речь на самом деле о Future, о том классе который и так уже хендлит исключительные ситуации и позволяет обрабатывать их отдельно
Да, но идея в том, чтобы не скидывать какие-то важные ошибки бизнес логики или провальных ответов микросервисов в одну корзину Future.failed

Pavel
22.09.2017
11:04:31
окей, то есть Future.failed все равно нужно обрабатывать

а что тогда мешает добавить свою эксепшен и захендлить его в рековери

Daniel
22.09.2017
11:05:07
окей, то есть Future.failed все равно нужно обрабатывать
ну это всегда придется, потому что ты не можешь же всё обвесить кастомными ошибками

Oleg
22.09.2017
11:05:42
а что тогда мешает добавить свою эксепшен и захендлить его в рековери
Ничего не мешает. Но ничего не говорит о том, сделал ли ты это, учтена ли ошибка в результате, или всё ещё лежит в фейле

Pavel
22.09.2017
11:06:41
окей, то получается при вызове метода который возвращает Future[Either[A, B]] ты должен убедится что он раскроется в Future[B] , то есть ошибка будет обработана

Pavel
22.09.2017
11:07:29
как правило такие штуки решаются через getOrElse - но таких случаев не много. Если юзер ввел неправильные данные - тебе полюбому нужно кинуть ошибку

Oleg
22.09.2017
11:07:30
Поэтому вполне возможно, что для некоторых ошибок ты возьмёшь и напишешь такой FunctorRaise, который будет просто возвращать Task.fail

Для некоторых не менее просто raise(MiscError(failText))

Pavel
22.09.2017
11:09:12
блин, но мне сложно все равно увидеть приемущество от этого механизма если тоже самое делается через throw во фьюче

Страница 949 из 1499