Pavel
22.09.2017
11:09:40
а если прилага многослойная и тебе нужно прокинуть реально с нижнего слоя ошибку до самого юзера
это же геммор полный
Aleksei
22.09.2017
11:10:18
а зачем тебе юзеру кидать ошибку о том что база недоступна, например?
Oleg
22.09.2017
11:11:40
Google
Oleg
22.09.2017
11:12:22
Идея в том, чтобы важные вещи переместить из второго сорта в первый
Daniel
22.09.2017
11:12:27
а есть такой же но с паттернами гоф?
Pavel
22.09.2017
11:14:04
окей в целом я понял
допустим есть DBIO - вставляет в базу - если срабатывает констрейт - это скажем так первый сорт, должен быть в Either, нету доступа к базе - это такой редкий случай - можно оставить в recovery
Mikhail
22.09.2017
11:15:31
Oleg
22.09.2017
11:15:36
Pavel
22.09.2017
11:17:07
Mikhail
22.09.2017
11:17:16
sealed class Layer1Error
SaneError1Layer1
SaneError2Layer1
...
SomeRandomUnexpectedShitLayer1
Pavel
22.09.2017
11:18:03
@odomontois так, давай еще раз абстрагируясь от своей монады и говоря языком DBIO/Future. Допустим из DBIO нужно прокинуть ошибку до самого юзера. Ошибка находится в Either - тут два вариант:
или мы все же кинем throw с крутой ошибкой и она быстро дойдет до самого верха
тогда смысла в either нету)
Daniel
22.09.2017
11:18:56
вообще есть смысл
потому что стектрейса далеко не всегда хватает и нужно доп инфой напихать
Google
Oleg
22.09.2017
11:19:15
Pavel
22.09.2017
11:19:27
не про скорость, а про количество кода
чтобы до верха доставить
Oleg
22.09.2017
11:19:39
В одном случае throw, в другом raise
Pavel
22.09.2017
11:21:02
окей, сча
получается в конце концов у нас должен быть обработчик для Future[Either[Error, A]] который хендлит рековери по фьюче и хендлит все подтипы Error, так?
Mikhail
22.09.2017
11:23:46
Pavel
22.09.2017
11:23:48
тогда смысл только получается только в том чтобы отделить важные и не важные ошибки, а скорее ошибки бизнес логики от внешних ошибок
так так ведь делаешься в Future
у тебя есть чейн flatmap’ов
кто-то запаролся и у тебя оно пошло на верх до юзера
Nikolay
22.09.2017
11:37:23
Alexander
22.09.2017
12:23:52
Aleksei
22.09.2017
12:26:23
ты еще макро кэш попроси посмотреть =)
Nick
22.09.2017
12:47:36
нифига себе, вы уже об этом второй день трете?)
Oleg
22.09.2017
12:49:52
кто-то запаролся и у тебя оно пошло на верх до юзера
в общем, ты вопрошаешь о различиях, за что ты платишь своей сложностью
1. код
parseAppealForm[ F[_] : FunctorRaise[?, AppealFormError] :AppealStore](data: String) : F[AppealForm]
убеждается в том, что ты вынужден как-то обработаь исключение в своём процессе а
parseAppealForm(data: String, database: AppealDatabase) : Future[AppealForm]
-
нет
2. Первый код абстрагируется от асинхронности и конкретной реализации, а потому засовываем в обычные синхронные property-тесты и в другие проекты с твиттер фьючами, тасками всевозможными стримами, второй требует обёрток и адаптеров и асинхронных тестсьютов
3. Имея Future[A] в любом месте кода, ты не можешь определить обработал ли ты уже интересующий эксепшн, или нужно ещё раз написать рекавер, в случае ошибок в аннотации, ты всегда знаешь какой уровень фэйла ты можешь тащить в данном уровне
4. При масштабной архитектурке, тебе будет сложно найти все куски кода catch em all, чтобы быть уверенным, что твоя ошибка не словится в каком-то промежуточном слое и до конца дойдёт твой эксепшн.
5. Манатки ништяковые, эксепшоны - отстойные. Однако, это не значит, что нужно броситься переписывать всё. Можно для начала обеспечить возможность использования ерроров в типах и это самое сложное. Потом добавить еррор там, еррор сям и ты сам войдёшь во вкус
KrivdaTheTriewe
22.09.2017
12:59:15
в общем, ты вопрошаешь о различиях, за что ты платишь своей сложностью
1. код
parseAppealForm[ F[_] : FunctorRaise[?, AppealFormError] :AppealStore](data: String) : F[AppealForm]
убеждается в том, что ты вынужден как-то обработаь исключение в своём процессе а
parseAppealForm(data: String, database: AppealDatabase) : Future[AppealForm]
-
нет
2. Первый код абстрагируется от асинхронности и конкретной реализации, а потому засовываем в обычные синхронные property-тесты и в другие проекты с твиттер фьючами, тасками всевозможными стримами, второй требует обёрток и адаптеров и асинхронных тестсьютов
3. Имея Future[A] в любом месте кода, ты не можешь определить обработал ли ты уже интересующий эксепшн, или нужно ещё раз написать рекавер, в случае ошибок в аннотации, ты всегда знаешь какой уровень фэйла ты можешь тащить в данном уровне
4. При масштабной архитектурке, тебе будет сложно найти все куски кода catch em all, чтобы быть уверенным, что твоя ошибка не словится в каком-то промежуточном слое и до конца дойдёт твой эксепшн.
5. Манатки ништяковые, эксепшоны - отстойные. Однако, это не значит, что нужно броситься переписывать всё. Можно для начала обеспечить возможность использования ерроров в типах и это самое сложное. Потом добавить еррор там, еррор сям и ты сам войдёшь во вкус
плюсую за пятый пункт
Pavel
22.09.2017
13:15:21
я гляну чуть позже
Google
Pavel
22.09.2017
13:15:28
спасибо
KrivdaTheTriewe
22.09.2017
13:17:32
https://docs.scala-lang.org/sips/opaque-types.html
Alexander
22.09.2017
13:20:43
Oleg
22.09.2017
13:43:16
Фантом - это отдельная вселенная, а здесь нормальные ньютайпы наконец
Alexander
22.09.2017
13:47:38
Oleg
22.09.2017
13:47:58
отдельный юниверс - это отдельный юниверс, типы оттуда ничему не соответствуют, существуют в сознании компилятора
Alexander
22.09.2017
13:48:25
newtype Id = Long
Oleg
22.09.2017
13:48:44
а ньютайп один к одному сопоставлен с реальным типом, в рантайме представлен так же, как он
Поэтому он сам по себе реален
Alexander
22.09.2017
13:50:20
Oleg
22.09.2017
13:52:55
фантомный тип - это идеальная кандидатура на роль тега, даже в ньютайпе в реализации Майлза или Михаила
Но сам по себе он не может иметь рантайм репрезентации
инстанс MyPhantom.Int - это нонсенс
Alexander
22.09.2017
13:56:03
Oleg
22.09.2017
13:56:58
Alexander
22.09.2017
13:58:10
Просто для меня Phantom types выглядят как более общий концепт, что ли.
Oleg
22.09.2017
13:58:13
Если говорить о тегах и ньютайпах в шейплез и супертаггед, то общая характеристика для них, если я правильно помню и Михаил сделал так же - A @@ Tag <:< A а для ньютайпа уже нет
Google
Oleg
22.09.2017
13:58:21
Для реализации ньютайпа ты можешь тегать и реальными классами, как вот сейчас в скале.
Т.е. никакой особо новой семантики фантомы не добавляют. Просто компилятор их раньше стирает и обращается попроще
Alexander
22.09.2017
14:02:58
KrivdaTheTriewe
22.09.2017
14:05:42
интересно, эта штука поможет той библиотеке , которая пытается добавить теорию размерности в скалу добавить?
Oleg
22.09.2017
14:25:23
Все типы, которые существуют просто для того, чтобы концы сошлись, хорошо засовываются в фантомы
Однако та реализация фантомов, что предложил Мартин, не предполагает расширение.
Т.е. один раз разработчик библиотеки засовывает свой набор фантомов в свой обжект и с этим и живёшь.
Вот это может и помешать
Vladimir
22.09.2017
15:33:28
а может у кого-то есть под рукой поделие на шейплезе, которое из ADT а-ля фримонада вытаскивает множество значений?
sealed trait Op[T]
object Op {
final case class Sum(i: Int, j: Int) extends Op[Long]
final case class Div(i: Double, j: Double) extends Op[BigDecimal]
}
хочу
Long :+: BigDecimal :+: Cnil
блин, кажется, нашел :( https://github.com/milessabin/shapeless/pull/561/files
Mikhail
22.09.2017
15:39:03
теги можно использовать для числодробилок, ньютайпы категорически нет)
это про текущие теги и нютайпы. те ``opaque`, что предлагают - похоже, что будут ньютайпами но с доп поддержкой со стороны компилятора, чтобы для примитивов избежать боксинга)
Alexander
22.09.2017
16:03:35
Oleg
22.09.2017
17:16:48
Вот хаскеллисты, как выключить GC в жаве, так они обсуждать. А раз в полгода вопрос возник, так хрен кто
KrivdaTheTriewe
22.09.2017
17:17:37
Alexandr
22.09.2017
18:06:57
Господа, я чего-то туплю.
Есть Akka-http и мне очень хочется извлечь заголовки по шаблону. Такого напрямую нет, надо писать кастомную директиву. Ок, extractRequest.map(_.headers). К сожалению, на выходе Directive1[Tuple1[Seq[HttpHeaders]]]]
В доке сказано: Directive1[Tuple1]] преобразуется в Directive1 имплиситами и они всегда со мной. Но не происходит. Может кто-нибудь рассказать мне, какой я не очень и как правильно?
Спасибо.
Наверное, туплю в квадрате. В пятницу. Вечером. Спрашивать про работу.
Alexander
22.09.2017
18:19:47
я тоже боролся с подобными штуками, как в итоге выходило - не помню
Nikolay
22.09.2017
18:27:25
tmap попробуй
Google
Nikolay
22.09.2017
18:28:02
Не точно, но лучше попробуй
Alexandr
23.09.2017
06:17:39
провабол, не помогает. :)
Sergey
23.09.2017
08:06:05
не совсем понял чего ты хочешь добиться
Alexey
23.09.2017
08:07:30
Sergey
23.09.2017
08:07:51
да ладно
Kirill
23.09.2017
08:09:36
как этот шорткат называется чтобы показать тип выражения?
Sergey
23.09.2017
08:10:32
Shift-Ctrl-P у меня на маке (вроде не переопределял с дефолтного кейбинда)
Kirill
23.09.2017
08:11:45
Это разве не показать имплисит параметры?
Sergey
23.09.2017
08:11:54
Alexey
23.09.2017
08:12:06
Sergey
23.09.2017
08:13:11
Alexandr
23.09.2017
08:13:20
Kirill
23.09.2017
08:13:37
А, на маке ctrl отдельно от cmd что ли
Alexandr
23.09.2017
08:13:43
Что-то напортачил. Странно.
Sergey
23.09.2017
08:14:29
попробуй указать тип явно, без Tuple1
Dmitry
23.09.2017
08:14:33