@scala_ru

Страница 1470 из 1499
Юрий
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{ }

Юрий
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:28:22
а отчего не так ? type Password = String
можно тогда случайно передать UserID в место, которой хочет пароль

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

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

Александр
15.05.2018
16:29:56
можно тогда случайно передать UserID в место, которой хочет пароль
а код def login( lg:Login, ps:Password) разве не проверит что ты не то пишешь ?

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 это не то же что на уровне языка сделать, без лишних нагромождений

Nick
15.05.2018
16:31:05
Юрий
15.05.2018
16:31:26
будет одна либа какая-то, возможно supertagged 0.2
Я надеюсь, что это будет в языке, а не в сторонней либе. Частые кейсы должны делаться легко и лаконично. Редкие должны быть возможны. С опаками не соблюдается первое правило.

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
всё же shapeless/supertagged/etc это не то же что на уровне языка сделать, без лишних нагромождений
я просто не уверен, что нужен сахар вот конкретно для такого специфического случая простой обёртки с публичным фэктори и разворачивателем

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

Юрий
15.05.2018
16:32:40
100% только хуже по перфу
У нас не числодроьилка. Это больше для тайпсейфа

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

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 и т.п.

isInstanceOf
И что это?

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 по альтернативной иерархии

все это убрать и будет newtype
Ну вот, но тогда это не может быть class

Поэтому value class и провалился

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