@scala_ru

Страница 1481 из 1499
Oleg
22.05.2018
18:25:58
т.к. set возвращает просто S => S у мономорфной призмы

Eugene
22.05.2018
18:28:17
Я с телефона так что криво вставлю код ))

val updatedRequest = request .modify(_.requestStatus).setTo(status) .modify(_.processTime).setTo(env.currentTime)

Google
Eugene
22.05.2018
18:28:35
Как-то так

Oleg
22.05.2018
18:28:42
Если лень писать andThen, Можно юзануть Endo из scalaz или самому эти 4 строки моноида написатт написать и композить через combineAll

Eugene
22.05.2018
18:38:04
Спасибо, но в quicklens ничего и писать не надо ) только там на макросах а не на композициях

Oleg
22.05.2018
18:38:20
.modify(_.field).setTo(x) vs field.set(x) compose телеграммовское окошко подсказывает, что в макросе вверху больше букав

Nick
22.05.2018
18:40:11
Ты в любом случае сеттеры композируешь

Макросы там внутри

Oleg
22.05.2018
18:41:53
Только я могу "поля" придусать сам

Композтить, например, с айтемами хешмапов, с альтернативами силд трейтов

Nick
22.05.2018
18:42:39
Кароч, монокль зе бест

Oleg
22.05.2018
18:43:37
и если, самое главное, однажды тип перестанет быть кейс классом, я смогу быстренько написать эти линзы ручками в компаньоне, сохранив обратную-совмкстимость

Google
Oleg
22.05.2018
18:46:47
но квикленс выигрывает в синтаксисе для просто полей, конечно

Eugene
22.05.2018
18:46:54
и если, самое главное, однажды тип перестанет быть кейс классом, я смогу быстренько написать эти линзы ручками в компаньоне, сохранив обратную-совмкстимость
Да все это верно и круто. Но когда я изучал функциональные линзы то смущало много чего руками надо делать и как то это было нечитаемо что-ли. В scalaz. Хочется на месте тяпляп и изменил поля кейскласса

Eugene
22.05.2018
18:48:04
:)

Oleg
22.05.2018
18:48:35
50% моего применения монокля квикленс никак не осилил бы

Eugene
22.05.2018
18:49:21
Если бы скинул примеры киллерфич из этих 50% то было бы круто

Oleg
22.05.2018
18:53:44
Вторая киллерфича: думаю понятно, что для любой монады можно сделать Iso[F[F[A]], F[A]]

А это в купе со встроенной Setter[F[A], A] для функторов даёт отличный способ продираться через эффекты в полях, сохраняя рассудок

Eugene
22.05.2018
18:58:14
Интересно спасибо. Изучу подробнее :)

Oleg
22.05.2018
18:59:15
Третья: уже обсуждавшиеся с @notxcain способы сфокусировать стейт, еррор или райтер на каком-то куске (ах)

Четвёртая: Я могу сделать Traversal[Foo, Bar] для case class Foo(bar1: Bar, bar2: Bar, bar3: Bar) который реально будет обходить несколько полей за одну операцию

Пятая: есть встроенные json линзы для circe, как минимум пара человек у нас очень активно из их юзают

Eugene
22.05.2018
19:08:13
Насколько сложно рефакторить? Вот создал стопицот линз - их надо руками потом исправить если поля переехали в агрегат например?

Oleg
22.05.2018
19:12:25
Насколько сложно рефакторить? Вот создал стопицот линз - их надо руками потом исправить если поля переехали в агрегат например?
Перепичать макросом сгенерированную линзу несложно. С рефакторингом есть проблемы, в отличие от хаскелёвых моноклевые оптики не связанные подтипизацией, Lens не подтип Traversal и операции композиции для каждой оптики свои. Поэтому, если что-то стало множественным, приходится везде менятт

Я просто в седьмой наверное раз повторяю это и не могу поверить. Что в хашкеле субтайпинг есть, а в шакалке - нет

Mikhail
23.05.2018
04:37:52
Если бы скинул примеры киллерфич из этих 50% то было бы круто
В копилку еще то, что в идее есть небольшая поддержка монокля (не помню какое покрытие), но обычный результат @Lenses - точно в автокомплите доступен)

Google
Oleg
23.05.2018
04:41:28
@ezhulkov А в квикленс идея краснит на .each ?

Eugene
23.05.2018
05:20:34
@ezhulkov А в квикленс идея краснит на .each ?
Раньше точно краснела, проверю позже напишу

Alexander
23.05.2018
07:09:42
там сплошые макросы, краснила на каждом шагу раньше (да и сейчас скорее всего)

Mikhail
23.05.2018
07:37:54
val double: Int ⇒ Int = _ * 2 Apply[Option].ap(Some(double))(None) should be(None) Apply[Option].ap(None)(Some(1)) should be(None) Apply[Option].ap(None)(None) should be(None)

Grigory
23.05.2018
07:38:35
тест на репликанта?

Mikhail
23.05.2018
07:38:43
Почему операции с None из котов всегда в итоге None? Разве это не ноль из теорката?

Ну или там например пустая строка...

val addTwo: Int ⇒ Int = _ + 2 Apply[Option].map(None)(addTwo) should be(None)

Туда же.

Grigory
23.05.2018
07:47:49
@Mikhail_Kobenko какую функцию ты хочешь?

Aleksei
23.05.2018
07:48:08
я так понимаю типа как ноль для моноида ему надо

Aleksei
23.05.2018
07:48:14
чтобы ничего плюс два было два

Mikhail
23.05.2018
07:51:48
Да, Алексей прав. Чтобы пришел None и я с ним мог работать, получить например Some(List(1,2,3))

Grigory
23.05.2018
07:55:09
потому что в котах такое определение апликации

посмотри комбайн моноида

есть инстансы и для листа и для опшона и комбайн nonEmptyList, Nil даст nonEmptyList

Mikhail
23.05.2018
08:03:49
Monoid[List[Int]].combine(None.toList, List(1,2,3)) should be(List(1,2,3))

Вариант черновой)

Спс.

Google
Oleg
23.05.2018
08:30:37
ну получается дальше each я уже с подсказкой не пойду

т.е ctrl space до первого Option

Nick
23.05.2018
08:47:56
а почему нельзя лифтануть find и store в task?

а, собственно в ответе так и делают

Eugene
23.05.2018
08:51:00
а, собственно в ответе так и делают
наоборот - таски лифтят в ConnectionIO потому что в этой монаде есть transact и можно её запустить

Nick
23.05.2018
08:51:53
на мои взгляд эт дичь

Admin
ERROR: S client not available

Nick
23.05.2018
08:52:04
нафига держать транзакцию так долго

Aleksei
23.05.2018
08:52:17
а пример можно того что вы хотите сделать?

Aleksei
23.05.2018
08:53:00
конкретный пример того что господин хочет сделать и зачем ему свои таски лифтить в коннекшнио а не наоборот

типа чтобы прочитать изменить сохранить и все в одной транзакции?

Nick
23.05.2018
08:53:30
я делаю иначе, у меня есть специальный пул, который обрабатывает все общение с базой в Async

в том случае все выродилось бы в композицию из 3 асинков

транзакция по сути нужна лишь в store

Nick
23.05.2018
08:54:51
обьясни мне, зачем тебе одна транзакция?

Eugene
23.05.2018
08:54:55
на мои взгляд эт дичь
это уже вопрос другого уровня ) интересна была сама техническая возможность как сделать

Google
Nick
23.05.2018
08:55:28
прежде чем делать, задай вопрос "а нельзя ли сделать лучше?"

Eugene
23.05.2018
08:55:39
обьясни мне, зачем тебе одна транзакция?
потому что есть операции когда мне нужен ACID, иначе всё бы в редисе складывал и норм

Alexey
23.05.2018
08:56:23
обьясни мне, зачем тебе одна транзакция?
Бывают ситуации, где это надо, типо дохера сильные требования к консистентности

Alexey
23.05.2018
08:56:49
Какого store?

Nick
23.05.2018
08:56:59
открой so

я бы просто добавил версионность и оптимистик апдейт

Eugene
23.05.2018
08:57:42
открой so
там совсем синтетический пример, на него не надо полагаться на SO скорее про то как смиксовать 2 разных дататайпа

Alexey
23.05.2018
08:59:54
я бы просто добавил версионность и оптимистик апдейт
Чтобы так сделать, надо изначально закладывать эту возможность, а если например у людей особо нагрузки нет (типо пишут коробку для предприятий в 100 человек), нахрена им городить эти сложности, почему нельзя взять и запустить одну транзакцию на операцию?

Denis
23.05.2018
09:00:39
По-моему спрашивать «зачем тебе одна транзакция» как-то странно

Eugene
23.05.2018
09:01:03
да половина монолитов так работает - открывает транзакцию на запрос и закрывает её в конце. те же веб приложения на J2EE и сервлетах

Alexey
23.05.2018
09:01:39
Есть разные требования и разные решения ?‍♂️

Nick
23.05.2018
09:02:01
Есть разные требования и разные решения ?‍♂️
спрошу иначе, ты бы стал делать посреди транзакции какое-то асинхронное действие? )

Alexey
23.05.2018
09:03:31
Бле, ну очень сильно зависит от того что это за действие

Сходить в соседний сервис - нет

Eugene
23.05.2018
09:03:48
если зачитать из файла - почему бы и нет?

если мы хотим сделать все в pure виде и оборачивать эффекты в IO/Task

Nick
23.05.2018
09:05:05
я все понял, можно не продолжать)

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