
Юрий
15.05.2018
16:09:23
Там же разработчики языка обсуждают дизайн. Как они решат - так и будет. И пока все сошлось на том, что точно будет, но детали в процессе

Oleg
15.05.2018
16:09:40
Текущие опаки вообще не ломают систему типов
Они внутри ломают гораздо меньше, чем вэлью классы

Юрий
15.05.2018
16:10:33
Там в обсуждениях были альтернативы с новым Top типом

Google

Oleg
15.05.2018
16:11:03
Видел, да

Юрий
15.05.2018
16:11:12
Ну и обсуждение уже ушло дальше сипа
Проблема бойлерплейта стоит остро

Oleg
15.05.2018
16:12:50
Мне сложно понять, почему

Юрий
15.05.2018
16:15:47
Потому что 5 строк вместо одной - большой шаг назад. При этом в большинстве случаев нужно будет писать абсолютно одно и то же

Oleg
15.05.2018
16:16:59
Лучше несколько, но мощных

Юрий
15.05.2018
16:20:15
Энивалы часто используют как обертки над примитивами для сущностей из предметной области
У меня таких десятки, и я не хочу писать бойлерплейт

Oleg
15.05.2018
16:21:04
ну точнее один опак

Юрий
15.05.2018
16:22:15
Как ты себе это представляешь? Я как раз таки хочу типами отличать разные вещи, у которых может быть под капотом одно и то же

Nick
15.05.2018
16:22:28
Умел бы AnyVal копродукты

Google

Oleg
15.05.2018
16:22:35
ну вот в шейплесе
есть конструктор ньютайпов
т.е. тебе нужен а-ля
opaque type NewType[A, Ops] = A
object NewType{
implicit def convertToOps[A, Ops](nt: NewType[A, Ops])(implicit conv: A => Ops): Ops = conv(nt)
}
и потом
type Weight = NewType[Double, WeightOps]
implicit class WeightOps(val x: Double) extends AnyVal{
}

Oli
15.05.2018
16:25:39

Юрий
15.05.2018
16:26:02
Вот есть у меня
case class UserId(value: String) extends AnyVal
case class Password(value: String) extends AnyVal
Как такое сделать по твоему? И чтобы было так же лаконично

Oleg
15.05.2018
16:26:17
В твоём случае, похоже даже Ops не нужно

Александр
15.05.2018
16:27:44

Oleg
15.05.2018
16:28:22

Юрий
15.05.2018
16:28:39
ну вот я кинул
А зачем каждому переизобретать в своей кодобазе тип Newtype, когда он нужен в подавляющем большинстве случаев?

Oleg
15.05.2018
16:28:52

OlegYch
15.05.2018
16:28:54
100% только хуже по перфу

Oleg
15.05.2018
16:29:11
будет одна либа какая-то, возможно supertagged 0.2

Александр
15.05.2018
16:29:56

Alexander
15.05.2018
16:30:07
не проверит

Oleg
15.05.2018
16:30:11
в этом же и соль opaque
что они синонимы только в компаньоне

Google

Alexander
15.05.2018
16:30:39
всё же shapeless/supertagged/etc это не то же что на уровне языка сделать, без лишних нагромождений

Oleg
15.05.2018
16:30:57

Nick
15.05.2018
16:31:05

Юрий
15.05.2018
16:31:26

OlegYch
15.05.2018
16:31:27
https://failex.blogspot.com.by/2017/04/the-high-cost-of-anyval-subclasses.html

Alexander
15.05.2018
16:31:42
плотно сидим на extends TaggedType[RawType] (буквально все типы так делаем) - с радостью бы слезли на что-то встроенное

Oleg
15.05.2018
16:31:51

Alexander
15.05.2018
16:32:34
в хаскеле newtype же в языке, так почему нет?

Юрий
15.05.2018
16:32:40

OlegYch
15.05.2018
16:32:54
анивал каким боком то?
госпади

Юрий
15.05.2018
16:34:00
Ты уверен, что вклад боксинга в твоём случае даёт хоть сколько нибудь большой процент просадки производительности?

OlegYch
15.05.2018
16:34:15
зачем тебе анивал там?

Юрий
15.05.2018
16:34:44
Чтобы не боксилось когда есть возможность, очевидно же

OlegYch
15.05.2018
16:34:47
он чисто для "числодробилок"
ай

Oleg
15.05.2018
16:35:04
просто в хашкеле в 95% случаев он совсем не для "обёрток для предментной области" юзается

OlegYch
15.05.2018
16:35:53
а для чего?

Google

Alexander
15.05.2018
16:36:07
тоже интересно

Alex
15.05.2018
16:47:44
помоему чтобы заворачивать неуникальные инстансы

OlegYch
15.05.2018
16:53:09
ну допустим, только как это отличается от "обёрток для предментной области"

Mikhail
15.05.2018
17:00:34
У нас не числодроьилка. Это больше для тайпсейфа
Я конечно согласен, с тем что было бы клево иметь такие вещи встроенные в язык (при учете, что сделано будет красяво, а не то, что сейчас предлагается - там слегка ugly и кособоко выглядит)(хотя на самом деле мне больше нравится возможность симуляции средствами языка - так проще дойти до годных реализаций). Но у меня косвенный вопрос. В наших реалиях, когда есть таггет и ньютайпы в том виде в котором они сейчас - зачем все еще использовать AnyVal для которого мало того, что постоянно надо .value явно указать, чтобы значение получить так еще и при любом удобном случае в риал обертку сваливается(собственно в этом я вижу единственный плюс у энивала - возможность рантайм чека - правда не знаю, чтобы кто-нибудь этим пользовался) ?

OlegYch
15.05.2018
17:01:37
анивал не нужен
(ц)

Oleg
15.05.2018
17:13:39
Это, конечно, не относится к обёрткам для инстансов

Admin
ERROR: S client not available

Oleg
15.05.2018
17:33:18


Mikhail
15.05.2018
18:05:50
симуляциями средствами языка будет боксинг примитивов
В текущих реалиях - да. Я же говорю про то, что мне больше импонирует. Сейчас есть проблема в том, что когда мы определяем
type Newtype[Repr, Ops] = { type T = Tag[Repr, Ops] }
- мы теряем информацию о типе в основании и при стирании эфемерных, компилятору не остается ничего другого кроме как использовать Object. Поэтому было бы достаточно каким-то образом добавить информацию об основании, которую бы компилятор смог использовать после стирания всего остального (какой-то флажочек мемори модел для эфемерных, который не попадает в скоуп, но оставляющий для компилятора свет в конце тоннеля). И в реализации это было бы проще, ведь все продолжило бы работать как и сейчас с тем отличием, что ушел бы боксинг. Но на 100% я не готов заявить, что это отличный выход - перед этим пришлось бы разобрать несколько возможных последствий сего флажка, но как-нибудь в другой раз)


Oleg
15.05.2018
18:09:19
В текущих реалиях - да. Я же говорю про то, что мне больше импонирует. Сейчас есть проблема в том, что когда мы определяем
type Newtype[Repr, Ops] = { type T = Tag[Repr, Ops] }
- мы теряем информацию о типе в основании и при стирании эфемерных, компилятору не остается ничего другого кроме как использовать Object. Поэтому было бы достаточно каким-то образом добавить информацию об основании, которую бы компилятор смог использовать после стирания всего остального (какой-то флажочек мемори модел для эфемерных, который не попадает в скоуп, но оставляющий для компилятора свет в конце тоннеля). И в реализации это было бы проще, ведь все продолжило бы работать как и сейчас с тем отличием, что ушел бы боксинг. Но на 100% я не готов заявить, что это отличный выход - перед этим пришлось бы разобрать несколько возможных последствий сего флажка, но как-нибудь в другой раз)
ну вот то, что ты описал и есть opaque
Т.е. вместо очень странного механизма двойной генерации чепухи, которая была в вэлью классах
Они просто решили чутка наколдовать правильный тайпчек


OlegYch
15.05.2018
18:16:07
В текущих реалиях - да. Я же говорю про то, что мне больше импонирует. Сейчас есть проблема в том, что когда мы определяем
type Newtype[Repr, Ops] = { type T = Tag[Repr, Ops] }
- мы теряем информацию о типе в основании и при стирании эфемерных, компилятору не остается ничего другого кроме как использовать Object. Поэтому было бы достаточно каким-то образом добавить информацию об основании, которую бы компилятор смог использовать после стирания всего остального (какой-то флажочек мемори модел для эфемерных, который не попадает в скоуп, но оставляющий для компилятора свет в конце тоннеля). И в реализации это было бы проще, ведь все продолжило бы работать как и сейчас с тем отличием, что ушел бы боксинг. Но на 100% я не готов заявить, что это отличный выход - перед этим пришлось бы разобрать несколько возможных последствий сего флажка, но как-нибудь в другой раз)
забудь про "стирания"
половина проблем в энивал от того что они пытаются "добавить информацию об основании"


Oleg
15.05.2018
18:19:37
Нет, 100% из-за того, что "они" пытаются сохранить семантику класса

OlegYch
15.05.2018
18:20:42
тоже самое

Oleg
15.05.2018
18:25:05
тоже самое
Михаил под основанием имел в виду тип , который справа от равенства в
opaque type Foo = Int

Google

OlegYch
15.05.2018
18:25:54
"добавить информацию об основании" = " сохранить семантику класса"

Oleg
15.05.2018
18:26:15
добавить информацию об основании - запомнить, что этот AnyRef ссылался на другой тиип

OlegYch
15.05.2018
18:27:20
isInstanceOf

Oleg
15.05.2018
18:27:32
сохранить семантику класса - значит позволить матчить его, сравнивать по ссылке, вызывать this и т.п.

OlegYch
15.05.2018
18:28:09
" позволить матчить его, сравнивать по ссылке" и "запомнить, что этот AnyRef ссылался на другой тиип"

Oleg
15.05.2018
18:28:43
Потому говно и получилось

OlegYch
15.05.2018
18:29:09
нет это одна и таже задача

Oleg
15.05.2018
18:29:15

OlegYch
15.05.2018
18:29:21
но говно именно из-за этого и получилось, да
нет isInstanceOf - нет говна

Oleg
15.05.2018
18:29:38
А одном случае ты хочешь сохранить информацию, что это был Int
А в другом хочешь делать
case x : Foo =>
чтобы работало
У Object много методов

OlegYch
15.05.2018
18:30:42
ну да
все это убрать и будет newtype

Oleg
15.05.2018
18:31:05
Потому и идея там пустить opaque type по альтернативной иерархии
Поэтому value class и провалился