λoλcat
03.06.2018
15:47:40
cats.implicits.catsParallelForEitherTNestedValidated[cats.effect.IO, Unit](
effect.this.IO.ioEffect,
cats.implicits.catsKernelStdAlgebraForUnit
)
Aleksei
03.06.2018
15:47:46
а айзеТ спецом нужен?
λoλcat
03.06.2018
15:47:56
cats.implicits.catsParallelForEitherTNestedParallelValidated[cats.effect.IO.Par, cats.effect.IO, Unit](
cats.implicits.catsKernelStdAlgebraForUnit,
effect.this.IO.ioParallel(effect.this.IO.timer(scala.concurrent.ExecutionContext.Implicits.global)))
);
Aleksei
03.06.2018
15:48:01
там же под идее аттемп можно сделать
Google
λoλcat
03.06.2018
15:49:47
а айзеТ спецом нужен?
как раз благодаря ему и срабатывает этот эффект молчаливого вывода не того параллела
без трансформера program1 ругнулся бы на отсутствие в скоупе глобал экзекьюшенконтекста
Aleksei
03.06.2018
15:51:14
а если внутри шифтить ио?
Oleg
03.06.2018
15:58:01
λoλcat
03.06.2018
16:10:18
Пока не понял, это баг cats-core, cats-effect или scalac
Моникс кстати ведет себя корректно
Oleg
03.06.2018
19:04:24
кек, стрёмно, что он тебе для EitherT вывел не тот параллел?
добавь к аргументам дегуза за BIO
λoλcat
03.06.2018
19:27:43
я разобрался как он выводил
могу написать, если интересно кому-то
кроме меня
Vladimir
03.06.2018
19:28:25
Google
Grigory
03.06.2018
19:28:32
пиши
λoλcat
03.06.2018
19:47:41
Под синтаксическим сахаром .parMapN для тюпла скрывается функция в Parallel:
def parMap2[M[_], F[_], A0, A1, Z](m0:M[A0], m1:M[A1])(f: (A0, A1) => Z)(implicit p: NonEmptyParallel[M, F]): M[Z]
Эта функция параметризована M и F, и если их явно указать, то конечно все будет работать как надо или не компилироваться вообще.
type M[A] = EitherT[IO, Unit, A]
type G[A] = Validated[Unit, A]
type F[A] = Nested[IO.Par, G, A]
val program = Parallel.parMap[M, F, Unit, Unit, Unit](ioA, ioB) { (_, _) => () }Тут я явно указал IO.Par, что весьма дико.
Никто естественно указывать тайп-параметры не хочет и положится на автовывод.
Компилятору надо найти имплисит p: NonEmptyParallel[M, F], не зная F.
Напомню, что мы ищем имплисит для параллелизации EitherT.
Лезем в cats.instances.ParallelInstances (который extends ParallelInstances1), там есть вот такой имплисит:
implicit def catsParallelForEitherTNestedParallelValidated[F[_], M[_], E: Semigroup]
(implicit P: Parallel[M, F]): Parallel[EitherT[M, E, ?], Nested[F, Validated[E, ?], ?]]
Он выведется, есть найдется Parallel[M, F] для IO.
Что нужно для вывода Parallel для IO:
implicit def ioParallel(implicit timer: Timer[IO]): Parallel[IO, IO.Par]И далее:
implicit def timer(implicit ec: ExecutionContext): Timer[IO]
Так что, если не будет в скоупе ExecutionContext, вся эта цепочка не сработает и будет фолбэк на инстансы для EitherT внутри менее приоритетного ParallelInstances1.
Там лежит имплисит послабее, который от внутренней монады не требует инстанса Parallel:
implicit def catsParallelForEitherTNestedValidated[M[_]: Monad, E: Semigroup]: Parallel[EitherT[M, E, ?], Nested[M, Validated[E, ?], ?]]
Grigory
03.06.2018
19:49:02
Шерлок прям
λoλcat
03.06.2018
19:53:19
Надо было и правда брать бифунктор.
от Луки
M
03.06.2018
20:26:24
Daniel
03.06.2018
20:26:40
Юрий
03.06.2018
23:57:42
А есть у кого книжка Learning Concurrent Programming in Scala? Исключительно для ознакомления
λoλcat
04.06.2018
05:02:25
Aleksey
04.06.2018
05:59:18
Ищем докладчиков на ближайший московский Scala-митап. Писать мне в личку или на aleksey.fomkin@gmail.com. Даты и место проведения уточняются. Не ленитесь, готовьте доклад! Не стесняйтесь агитировать друзей и коллег!
Alexey
04.06.2018
07:17:45
А в ништяках очепятка сама не поправилась ?
Grigory
04.06.2018
07:24:49
что попало в ништяки то там и осталось
Nick
04.06.2018
07:28:48
блокчеин
Сергей
04.06.2018
11:57:15
Есть два метода
def fn[T](x: T): String = ???
def fn[T](x: T*): String = ???
Есть ли способ как-то указать компилятору, что fn(1) относится только к первому методу, а не ловить ошибку?
Timothy
04.06.2018
11:59:18
Сергей
04.06.2018
11:59:54
благодарю, должно помочь
Eugene
04.06.2018
12:07:45
Скажите пжлста monix.Task.apply запускает вычисление в отдельном потоке, окей
а если делать через Effect[Task].delay/pure/point то никак не получается - выполнение запущенных эффектов происходит последовательно
какой метод в Effect эквивалентен executeAsync?
λoλcat
04.06.2018
12:17:38
Мне кажется Task.apply ничего не запускает
Google
λoλcat
04.06.2018
12:17:59
В мониксе свой scheduler fairness механизм
В котах надо явно ставить асинк баундари
Eugene
04.06.2018
12:19:08
ну вот сейчас я запустил 2 таска через Task{} и сделал Task.gatheUnrodered и они запустились параллельно
а если абстрагироваться из запускать через Effect[Task] то таски выполняются последовательно
Oleg
04.06.2018
12:20:03
Полагаю, чтобы удовлетворить лолкота, нужно заменить "запускает" на "планирует" или "конструирует"
Eugene
04.06.2018
12:20:21
получается сделать только если явно указать Effect[Task].executeAsync но видимо я что-то делаю не так
λoλcat
04.06.2018
12:20:55
Oleg
04.06.2018
12:21:18
Eugene
04.06.2018
12:21:26
хм
Oleg
04.06.2018
12:21:28
Для этого есть Concurrent
Eugene
04.06.2018
12:21:40
COncurrentEffect?
Oleg
04.06.2018
12:22:01
Eugene
04.06.2018
12:22:10
да смотрю его
Oleg
04.06.2018
12:22:43
Если совсем выхода нет, Можно и через эффект, но грязно через конвертацию в IO и обратно
Но лучше взять ad hoc тайпкласс
Eugene
04.06.2018
12:23:19
а явно написать Effect[Task].point("ololo").executeAsync это коряво?
Oleg
04.06.2018
12:24:20
Не знаю ни одной задачи, для которой нужно в мониксе саммонить что-то
Кроме какого-то метода в Timer
Google
Eugene
04.06.2018
12:25:38
чтобы везде не указывать явно Task, а работать через тайпклассы
да спасибо я понял про Concurrent, открыл для себя новый тайпкласс )
Aleksei
04.06.2018
12:26:12
Oleg
04.06.2018
12:26:14
Асинхронный != конкурентный
Aleksei
04.06.2018
12:26:52
всё понял
Eugene
04.06.2018
12:27:18
Oleg
04.06.2018
12:27:47
Спроси у Ника
Eugene
04.06.2018
12:29:55
Oleg
04.06.2018
12:33:41
Alexey
04.06.2018
14:08:35
Коль уж пошла такая пьянка, мы также ищем докладчиков на ближайший митап в Санкт-Петербурге, присылайте свои темы в личку мне, @nikitamelnikov или @rockjam
@pomadchin @gurinderu в ништяки плез ^
Grigory
04.06.2018
14:10:08
готово
Alexey
04.06.2018
14:10:40
?
KrivdaAllStars
04.06.2018
14:13:40
Alexey
04.06.2018
14:14:08
Точных дат еще нет
Denis
04.06.2018
15:11:29
https://twitter.com/scala_lang/status/1003639318836105217
Google
Mikhail
04.06.2018
15:20:29
Добрый вечер, можно попросить вас о подсказке в Gatling?
Есть сценарий следующего вида
val someScenario: ScenarioBuilder = scenario("someSimulation")
.exec(action0.silent)
.exec(action1.silent)
.exec(action2.silent)
.exec(action3.silent)
.exec(action4)
.asLongAs(session => session("status").as[String] != "Completed") {
exec(action4)
pause(5.seconds)
}
}
action4 получает status и сохраняет его значение в сессию
При помощи чего можно пробросить это значение внутрь блока asLongAs?
Anton
04.06.2018
15:42:32
А это значение потом опять используется в action4 внутри блока? Давненько я не видел Гатлинга, но по идее, если это в рамках одного юзера происходит (т.е. считай в рамках одной сессии), то и внутри блока можно все из сессии вытащить, если exec{session=>...} вызвать
Евгений
04.06.2018
16:44:55
подскажите, как правильно делать конверсию scala->java коллекций?
scala.collection.JavaConverters._ дает type mismatch
Grigory
04.06.2018
16:45:47
В данном случае тебе надо примитивы кастить в джава тип
Евгений
04.06.2018
16:46:03
ага.
Grigory
04.06.2018
16:46:32
ты я так понимаю хочешь из джавы колл сделать?
явно укажи в скала коде что хочешь лонг жавовый
Евгений
04.06.2018
16:46:55
не, просто пишу обертку к java-апи
Grigory
04.06.2018
16:49:06
Эс инстанс тут нужен, компайл тайм ошибка, в рантайме лонги одинаковые
Мапнись ._. Не уверен что есть лучше способ
Aleksei
04.06.2018
16:55:42
ну можно ж имплиситами =)
Mikhail
04.06.2018
16:55:45