
Dim
24.05.2018
11:52:33

Oleg
24.05.2018
11:55:35
стоп, это же не понв

Александр
24.05.2018
12:19:58

M
24.05.2018
12:20:26
спасибо как нибудь без тинькова

Google

Mikhail
24.05.2018
12:26:53

Yaroslav
24.05.2018
13:13:55
Есть data = EitherT[Future, A, B]
если А есть логика f(A) которая возвращает EitherT[Future, С, D]
ecли B есть логика g(B) которая возвращает EitherT[Future, С, D]
Как красиво сделать трансформацию EitherT[Future, A, B] -> EitherT[Future, С, D] ?

Aliaksandr
24.05.2018
13:22:34
bimap

Dmitry
24.05.2018
13:22:37
Bimap?

Oleg
24.05.2018
13:35:14
BitMap?

Yaroslav
24.05.2018
13:38:08
если просто bimap тогда получается EitherT[Future, EitherT[Future, С, D], EitherT[Future, С, D]]

Oleg
24.05.2018
13:38:31
Есть data = EitherT[Future, A, B]
если А есть логика f(A) которая возвращает EitherT[Future, С, D]
ecли B есть логика g(B) которая возвращает EitherT[Future, С, D]
Как красиво сделать трансформацию EitherT[Future, A, B] -> EitherT[Future, С, D] ?
flatMap(g).leftFlatMap(f)
аааа не не подходит

Yaroslav
24.05.2018
13:41:23

Oleg
24.05.2018
13:44:22
Есть data = EitherT[Future, A, B]
если А есть логика f(A) которая возвращает EitherT[Future, С, D]
ecли B есть логика g(B) которая возвращает EitherT[Future, С, D]
Как красиво сделать трансформацию EitherT[Future, A, B] -> EitherT[Future, С, D] ?
EitherT(x.value.flatMap(_.fold(f, g).value))
но нифига не красиво, надо контрибьютить, или в манатки воткнуть
типа flatFold

Yaroslav
24.05.2018
13:46:10

Oleg
24.05.2018
13:56:33
или скорее даже flatTransform

Google

Alexander
24.05.2018
13:59:56
если убрать EitherT, то data.flatMap(_.fold(f, g))
object foo {
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
type A = Int
type B = Double
type C = String
type D = Boolean
val data: Future[A Either B] = ???
def f(a: A): Future[C Either D] = ???
def g(b: B): Future[C Either D] = ???
val result: Future[C Either D] = data.flatMap(_.fold(f, g))
}

Oleg
24.05.2018
14:00:28
только конвертациями обвешал
чтобы решить эту задачу, а не "если взять другую задачу"

Alexander
24.05.2018
14:01:23
такой уже ты классный!
решил задачу

Oleg
24.05.2018
14:01:34

Alexander
24.05.2018
14:01:37
ЭТУ!

Oleg
24.05.2018
14:02:05
Недельку обещал переписать EitherT
уж он то любитель дописывать методы

Alexander
24.05.2018
14:02:20
без аллокаций? :)

Oleg
24.05.2018
14:02:26

Alexander
24.05.2018
14:03:02
вообще странно, что f и g возвращают EitherT, зачем его выставлять, по мне так чисто локальная штука, а возвращаться уже нормальный M[X Either B] должен

Oleg
24.05.2018
14:03:32
по поводу локальности

Alexander
24.05.2018
14:04:08
ну иногда нужно в приватном методе вернуть, чтобы по десять раз не врапать-анврапать, но в публичных сомнительно, имхо

Oleg
24.05.2018
14:04:28

Alexander
24.05.2018
14:04:48
поясни какой семантики?

Oleg
24.05.2018
14:06:24
Ну типа F[Either[E, X]] - это какая-то чепуха в твоём эффекте, а EitherT[F, E, X] - нечто с объявленным "особенным" типом ошибки

Google

Oleg
24.05.2018
14:07:08
Например вот у меня сваггер генерится особый на EitherT, который возвращается методом

Alexander
24.05.2018
14:07:15
для меня они эквивалентны, но во втором потроха котов протекают, но это субъективно, поэтому - пофиг

Oleg
24.05.2018
14:07:34
Типа у него есть специальный структурированный тип ошибки для какого-то статуса там 500 или другого
EitherT[ автоматически MonadError и с этим много методов его может в открытый мир отдавать

Wystan
24.05.2018
14:08:31

Dmitriy
24.05.2018
14:16:17
А где за перл пояснят, я уже даже не знаю...

Dmitry
24.05.2018
14:16:45
Касперский

Nick
24.05.2018
17:15:32

Alexander
24.05.2018
17:16:48
Слышал, что в Рамблере ещё жив ?
А рекламной сети их

Vasily
24.05.2018
17:17:37

Grigory
24.05.2018
17:18:15
там даж спарки были когда то (сча хз)

Nikolay
24.05.2018
20:07:20
https://www.youtube.com/watch?v=sFGnFKMSmL0

Alex
24.05.2018
20:08:20
вспомнилась песня из алладина

Nikolay
24.05.2018
20:08:23
он часто говорит про opaque types, хотя подразумевает type aliases. ведь это не совсем opaque types, верно?
а fibers в scalaz 8 в конечном счете так же на fork join-е основаны?

Oleg
25.05.2018
01:23:59

Dim
25.05.2018
04:31:49
Народ есть что-то типа Function.chain(preprocessors).apply(inputText) только не A => A а A => B ?

Oleg
25.05.2018
04:32:37

Dim
25.05.2018
04:33:34
Есть объект Function у него есть метод chain , судя по комментам писал Одерски

Google

Dim
25.05.2018
04:33:57
Given a sequence of functions f,,1,,, ..., f,,n,,, return the
function f,,1,, andThen ... andThen f,,n,,.
Короче на вход получает Seq[A => A]
ну а дальше можно сделать apply к аргументу и получить приложение всех функций в Seq к входным данным.

Oleg
25.05.2018
04:35:49
угу, а ты что хочешь?

Dim
25.05.2018
04:35:56
Но мне хочется чтобы на выходе был не тип A, а другой тип B

Oleg
25.05.2018
04:36:21
ну просто скомпозь его с функцией
в самом конце

Admin
ERROR: S client not available

Oleg
25.05.2018
04:36:36
у тебя ведь не более одной может быть
или ты хочешь Seq[A => B] ?

Dim
25.05.2018
04:37:16
Да
Seq[A => B]

Oleg
25.05.2018
04:37:23
Как тогда это чей нить?
Одну функцию применил, получил B, с остальными что делать?

Dim
25.05.2018
04:39:04
а не туплю, на вход Seq[(тут сложная функция с несколькими параметрами в том числе и A) => A]

Oleg
25.05.2018
04:39:37

Dim
25.05.2018
04:39:40
То есть есть данные и есть обработчики этих данных, у них есть дополнительные данные для обработки.

Oleg
25.05.2018
04:40:26
Делаешь функции
X => State[A, Y]
где X - все параметры, кроме A
И пропускаешь их через фор компрехеншон

Google

Oleg
25.05.2018
04:41:16
тогда каждая функция будет иметь автоматически A на вход и на выход. И выход A из одного будет передаваттся в следующую

Dim
25.05.2018
04:44:09

Юрий
25.05.2018
06:18:05
Народ, а нет ли такой манатки как опшн, только наоборот? Типа, если Some(a) - то закончили c a. Если None - то идём дальше?

λoλcat
25.05.2018
06:24:24
Alternative для опшен

Vladimir
25.05.2018
06:27:56
`Either[Whatever, Unit]`?

Denis
25.05.2018
06:28:34

Юрий
25.05.2018
06:28:57

Denis
25.05.2018
06:29:07
Очень удобно делать foldM с ранним выходом

λoλcat
25.05.2018
06:29:07
Подумой

Юрий
25.05.2018
06:29:23
Я вообще смотрел на всякие Continuations, но готовый есть только в скалази

Vladimir
25.05.2018
06:29:30
я уже затащил)

Юрий
25.05.2018
06:29:44

λoλcat
25.05.2018
06:32:03
List(none, 5.some, 6.some).unite это то что нужно?

Oleg
25.05.2018
06:32:49
это моноид, а не монадка

λoλcat
25.05.2018
06:34:30
Да, я не заметил что нужна именно монадка. Просили манатку, а у нас для этого слова отдельный смысл

Oleg
25.05.2018
06:34:42
ну в смысле нет
я имею в виду, что исходный запрос, несмотря на формулировку - это запрос на моноид, а не манатку