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

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

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

23 ответов

6 просмотров

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

У Хорстманна хорошо про это рассказано. 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 :)

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

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

Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
32
Хотел бы спросить у знающих, правильную ли я выбрал книгу для начала изучения ассемблера Юрова В.И ? Или есть более лучшие книги для начала обучения?
Botsman
25
Книга Юрова В.И пойдёт для обучения?
Botsman
24
$params = [ 'formid' => 'feedbackForm', 'formTpl' => '@CODE: <form class="form-validate" data-id="ajax_form"> <fieldset class="margin-bottom-md"> ...
Pathologic
1
а мы ещё не созрели до того, чтобы создать отдельный чатик про настройку редакторов?
Cheese Syrowiecki
16
И ещё вопрос: можно ли типа как на дос как-то запариться и с помощью прерываний выводить текст, вместо функции printf ?
НѣкъиⰘижєжєиꙁъвьсєсвѣтьноѣсѣтиѥсть•
34
Всем привет! У меня почему-то по-разному отображается TListView в Debug и Release режимах (FireMonkey)! При запуске под Win приложения TListView заливается программо. в Debug ...
Александр COM
8
Ладно, ещё тупого спрошу. Код должен банально вывести значение регистра на консоль, на деле же не выводя ничего, просто оставляя нерабочую консоль (открыта, ничего не написан...
НѣкъиⰘижєжєиꙁъвьсєсвѣтьноѣсѣтиѥсть•
25
Парни, спасайте. RAD Studio 12 творит какую-то дичь. У меня есть метод (event), который вызывает другой метод, т.е. он состоит из 1-й строки вызова. Ставлю бряк на event, запу...
Eugene Krasnikov (ᴊɪɴ x)
3
окей, дело реально в org было. но что за мусор в конце?
Vi Chapmann
15
Карта сайта