169 похожих чатов

Подскажите, пожалуйста, как работают дженерики? Вот в джаве на полиморфизме и

затирке типов, в расте шаблонизация происходит, а как в скале? Я пытался погуглить, но ничего нужного так и не нашел(

23 ответов

15 просмотров

также как в джаве, можно сказать

У Хорстманна хорошо про это рассказано. Scala for impatients

Скала работает на жвм и подчиняется её правилам, так что увы - type erasure. Но в скале есть хитрые способы подсовывания типов, когда ну очень уж надо. Если интересно - можно погуглить по запросу class tag in scala

Yau Ref
Скала работает на жвм и подчиняется её правилам, т...

А почему "увы"? Вроде затирка типов считалась офигенной штукой и дополнительной гарантией что в рантайме мы всякими ужасами не занимаемся. Или я отстал от жизни опять?

Yau Ref
Скала работает на жвм и подчиняется её правилам, т...

JVM же вроде вообще не имеет понятия о дженериках. Что конкретно мешает имплементировать reified generics на jvm? Насколько я знаю, в скале и джаве вообще используется микс, например, Array специализирован для примитивов. Я что-то упускаю?

unex𝕡ected t𝕪pe
JVM же вроде вообще не имеет понятия о дженериках....

reified generics эмулируются с помощью ClassTag или его более мощных аналогов

Evgenii Kuznetcov
reified generics эмулируются с помощью ClassTag ил...

я бы даже не назвал это эмуляцией. Эмуляция подразумевает, что есть нормальный механизм, а мы используем костыль. Но user-space рефайнменты на самом деле мощнее, чем то, что могли бы запилить джаваны.

Evgenii Kuznetcov
reified generics эмулируются с помощью ClassTag ил...

Я правильно понимаю, что это эмуляция в рантайме с рефлексией? То есть мы берем на себя то, что в reified generics сделал бы безопасно компилятор

unex𝕡ected t𝕪pe
Я правильно понимаю, что это эмуляция в рантайме с...

нет, когда вы пишите val list: List[String] = List("a", "b", "c"), у компилятора или макроса достаточно информации, чтобы в той или иной форме запомнить тип элемента (без рантайм рефлексии).

Python
А почему "увы"? Вроде затирка типов считалась офиг...

Потому, что потеря информации о типах это всегда печально и приводит к неприятным ограничениям https://scastie.scala-lang.org/rvyF2itMTGqM5DGo3J93Gg

∫f(x)dx
Скорее наоборот

Счастье в неведении?)

unex𝕡ected t𝕪pe
JVM же вроде вообще не имеет понятия о дженериках....

Мешает то, что оно уже сделано вот так и переделывать долго, дорого и не понятно зачем, учитывая что все привыкли

Yau Ref
Счастье в неведении?)

Сделать теги, с выразительной способностью системы типов scala приблизительно невозможно. Любые практически теги были бы несовместимы с вариантностью. ( спорно ) Почти никакие работающие в промышленных контурах системы типов с "нестираемыми женериками" не способны в HKT. В разработке мудрость зачастую в неведении, гораздо корректнее признать, что какая-то информация у вас отсутствует, чем пытаться откопать её по косвенным признакам. В данном случае, вам пришлось бы ограничивать либо систему типов, либо рантайм. Языки, с ограниченной системой типов и более развязным рантаймом есть. Но оказалось, что там информация о тайп-параметрах используется крайне редко, считается плохим тоном, хрупким решением и т.п., так что в общем случае можно сказать, что в этом вопросе scala правильное решение приняла

Oleg ℕižnik
Сделать теги, с выразительной способностью системы...

Ага, это интересное замечание. Я подозреваю, что с hkt это таки можно сделать совместимым, но вопрос нужно решать на уровне jvm, а не скалы Ну и опять же, стоит ли оно того, учитывая всё выше сказанное - хз

Yau Ref
Ага, это интересное замечание. Я подозреваю, что с...

Ну многие подозревают, но никто не сделал. Самое главное, если вас не убеждают примеры scala и typescript, потому что форсированы рантаймом, не убеждают примеры haskell, ocaml и rust, потому что слишком не знаю что академичечкие, можете посмотреть на новые generic в голанге, там тоже никакой тайпинформации generic не предоставляет. Поэтому иррелевантные тайп-параметры это естественный стандарт в разработке полиморфизма сегодня

Oleg ℕižnik
Сделать теги, с выразительной способностью системы...

А где-нибудь ещё есть ко-/-контра-/инвариантность типов, кроме Скалы?

LLU
А где-нибудь ещё есть ко-/-контра-/инвариантность ...

А разве она не должна быть у всех языков, у которых есть одновременно наследование и женерики?

Oleg ℕižnik
Ну многие подозревают, но никто не сделал. Самое г...

Не то, чтоб они меня не убеждали, просто это меня не беспокоило, я не пытался сделать собственную реализацию hkt :)

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта