У меня хорошие новости: оригинальный пример работает в новом компиляторе для Scala: Dotty.
Заголовок спойлера
$ dotr
Starting dotty REPL...
Welcome to Scala.next (pre-alpha, git-hash: 54d7089) (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_45).
Type in expressions to have them evaluated.
Type :help for more information.
scala> object TestFail extends App {
val genInt = new GenInt(42)
val i = GenTest.test(genInt)
}
defined module TestFail
scala>
Связанная. В Scala есть definition side variance, у вместо неё use site variance.
Связанная. В Scala есть definition side variance, у Java вместо неё use site variance.
Если смешивать две в системе типов сильно рисковано, а в системе вывода типов (inferece) — тем более.
Кстати, заглавие статьи содержит ошибку. Пример не ломает систему типов, а систему вывода(inference) типов. Последняя — по определению является попыткой компилятора угадать какой тип там должен был быть и компилятор не может всегда угадывать.
Спасибо за статью,
было бы интересно узнать сравнение с Facebook Infer, и в целом отношение к separation logic, на которой в последнее время строят статические анализаторы.
Знаю что мое мнение не будет популярным, но все же.
Я написал пару статей для хабра, в то время когда еще не был экспертом в какой-либо области.
Сейчас, уже являясь экспертом, у меня нет времени долго писать\редактировать статью. У нас в организации есть люди пищущие статьи, но для англ-среды. Да и мои научные публикации тоже теперь на английском.
Но, по старой памяти, я хотел поделится радостью о том что компилятор Scala над которым я работаю
скомпилировал себя. А статья не прошла цензуру, потому что "хабр-не место для ссылок". В тот момент я заметил что статей-ссылок, больше не стало.
С одной стороны я это понимаю, с другой стороны у меня нет возможности потратить время на написание статей, дублирующих мои доклады на конференциях. Я все еще помню какими ценными были раньше обсуждения в комментариях, и я хотел получить обратную связь и узнать мнение русского сообщества.
Потому я теперь живу на reddit и HackerNews. Где могу просто запостить ссылку на основное объявление\доклад\слайды\видеозапись и участвовать в обсуждении.
Я не хочу растраивать, но то что представлено в этой статье — не настоящие типы обьединения, а Хак. Вот пример использования типов-обьединений, которые нужны для корректности теории, и не поддерживается тут.
class A(x: Int)
class B(x: Int)
class C(x: Array[Int])
object Test{
def foo(x: A | B): Int = x.x
def bar(x: A | C): Int | Array[Int] = x.x
}
Стандартная библиотека связана гарантиями обратной совместимости, и поэтому добавлять туда что-то новое очень трудно. Классы типов в языке возникли сами по себе, на основе имплиситов, и именно поэтому они не используются широко в стандартной библиотеке — когда она создавалась, про них и не думали.
Я не хочу вас расстраивать, но у вас явно ложное впечатление о Scala и ее истории.
Вопервых, в scala 2.8 была сломана вся обратная совместимость. И половина стандартной библиотеки использует implicits, с тех пор. Про это все думали, и до этого были views которые решали подобную задачу.
Я слабо разбираюсь в компиляторостроении, но далеко не факт, что абстракция классов типов нужна при разработке компилятора, и это может быть объяснением того, что в dotty они не используются.
Вы спорите с разработчиком dotty. Мы их используем, наоборот, мы НЕ используем cake pattern как старый компилятор, те — у нас почти все — классы.
Также хочу привести в пример scala-pickling, который является официальным проектом Scala, который целиком основан на классах типов и который, насколько я в курсе, хотят применить или уже применяют в компиляторе.
Вы не в курсе. Его не применяют и планов нет. Есть планы юзать в Spark. Самая новая сериализация в Dotty — TASTY не имеет ничего общего с pickling.
Прошу вас, перед тем как убеждать людей, проверяйте ваши аргументы. Вы ваши предположения преподносите как истину.
Поэтому единственным аргументом, который вы можете привести в поддержку того, что классы типов это «не то, что вообще рекомендовано к использованию на Scala» — это явные и недвусмысленные заявления членов сообщества, особенно тех, кто обладает достаточным «весом». Без этого такие заявления — всего лишь ваши собственные рассуждения.
Вот это я и говорю, что shapeless это то, что разработчики компилятора и стандартной библиотеки, советуют НЕ использовать для чего-либо более чем простых примеров, если вам важна производительность, легкость понимания что код делает, бинарная совместимость.
Весьма странное заявление, особенно про классы типов.
Я вам скажу вот что, если бы они были хороши, вы бы нашли их в стандатной библиотеке и они бы были использованы в компиляторе. Либо в старом — scalac, либо в новом — dotty.
Это заявление очень далеко от реальности. Максимум, на что тянет scala-records — это реализация части функциональности, связанной с record'ами, которые в shapeless представляются в виде HList'а от специального вида пар.
но говорить, что оно полностью заменяет и лучше чем shapeless в целом — это просто троллинг.
Я этого и не говорил.
Я НЕ говорил что scala-records реализует все в shapeless. Я сказал, что для конкретной задачи в scala-сообществе есть лучше решения чем shapeless. В частности,
Например HLists и HMaps намного лучше(и по API и по производительности) реализованы в scala records
Сразу скажу знаний Scala и опыта у меня близко к нулю, что я компенсирую знаниями и опытом по-жизни. Сразу было понятно что мне нужны Type Classes, ну и я давай глядеть в Интернет. Сразу натыкаюсь на некую, да простят меня фанаты Scala, либу shapeless, от Miles Sabin.
Я один из разработчиков компилятора и языка Scala, вы посмотрели не в ту сторону — shapeless и type classes это не то, что вообще рекомендовано к использованию на Scala.
Я конечно глубоко не вникал, может этот shapeless на который надо убить тучу времени (и который видимо далеко не самая навороченная библиотека Scala мира) делает что то там еще полезное, но у меня нет слов — люди делают про это какие-то толки на конфах, воркшопы, презы на 56 страниц типа Demystifying Shapeless. И все это зачем? Чтобы выковырять тип значения во время компиляции, братан.
Вы сделали ровно теже выводы что и мы. Просто не используйте shapeless. Он является скажем так «радикальной» частью сообщества, с которой многие не согласны.
Все что он делает можно реализовать лучше, и сделано уже в сообществе. Например HLists и HMaps намного лучше(и по API и по производительности) реализованы в scala records.
google-authenticator (для андроида живёт в отдельном репозитории) — это open source, что позволяет посмотреть на его потроха и убедиться, что всё нормально.
У вас нет гарантии что он собран из того исходника без патчей.
Yibikey neo мне более интересен тем, что на нём есть openpgp-апплет
С любыми другими приложениями, у вас также нет никакой гарантии.
Если нужна безопасность повыше — можно использовать YubiKey NEO, он тоже умеет TOTP. И из него ключи не вытянуть никак.
То что вы нарисовали — Иерархия коллекций Scala. Правда упрощенная.
Советую обратить внимание туда, ИМХО на данный момент это самые близкие к полнофункциональным коллекции.
$ dotr
Starting dotty REPL...
Welcome to Scala.next (pre-alpha, git-hash: 54d7089) (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_45).
Type in expressions to have them evaluated.
Type :help for more information.
scala> object TestFail extends App {
val genInt = new GenInt(42)
val i = GenTest.test(genInt)
}
defined module TestFail
scala>
Наоборот, я рад когда люди задают вопросы которые позволяют показать отличия в дизайне между языками.
Связанная. В Scala есть definition side variance, у Java вместо неё use site variance.
Если смешивать две в системе типов сильно рисковано, а в системе вывода типов (inferece) — тем более.
Кстати, заглавие статьи содержит ошибку. Пример не ломает систему типов, а систему вывода(inference) типов. Последняя — по определению является попыткой компилятора угадать какой тип там должен был быть и компилятор не может всегда угадывать.
Самое близкое — https://infoscience.epfl.ch/record/222780?ln=en
было бы интересно узнать сравнение с Facebook Infer, и в целом отношение к separation logic, на которой в последнее время строят статические анализаторы.
Я написал пару статей для хабра, в то время когда еще не был экспертом в какой-либо области.
Сейчас, уже являясь экспертом, у меня нет времени долго писать\редактировать статью. У нас в организации есть люди пищущие статьи, но для англ-среды. Да и мои научные публикации тоже теперь на английском.
Но, по старой памяти, я хотел поделится радостью о том что компилятор Scala над которым я работаю
скомпилировал себя. А статья не прошла цензуру, потому что "хабр-не место для ссылок". В тот момент я заметил что статей-ссылок, больше не стало.
С одной стороны я это понимаю, с другой стороны у меня нет возможности потратить время на написание статей, дублирующих мои доклады на конференциях. Я все еще помню какими ценными были раньше обсуждения в комментариях, и я хотел получить обратную связь и узнать мнение русского сообщества.
Потому я теперь живу на reddit и HackerNews. Где могу просто запостить ссылку на основное объявление\доклад\слайды\видеозапись и участвовать в обсуждении.
Я не хочу вас расстраивать, но у вас явно ложное впечатление о Scala и ее истории.
Вопервых, в scala 2.8 была сломана вся обратная совместимость. И половина стандартной библиотеки использует implicits, с тех пор. Про это все думали, и до этого были views которые решали подобную задачу.
Вы спорите с разработчиком dotty. Мы их используем, наоборот, мы НЕ используем cake pattern как старый компилятор, те — у нас почти все — классы.
Вы не в курсе. Его не применяют и планов нет. Есть планы юзать в Spark. Самая новая сериализация в Dotty — TASTY не имеет ничего общего с pickling.
Прошу вас, перед тем как убеждать людей, проверяйте ваши аргументы. Вы ваши предположения преподносите как истину.
Вот это я и говорю, что shapeless это то, что разработчики компилятора и стандартной библиотеки, советуют НЕ использовать для чего-либо более чем простых примеров, если вам важна производительность, легкость понимания что код делает, бинарная совместимость.
Я вам скажу вот что, если бы они были хороши, вы бы нашли их в стандатной библиотеке и они бы были использованы в компиляторе. Либо в старом — scalac, либо в новом — dotty.
Я этого и не говорил.
Я НЕ говорил что scala-records реализует все в shapeless. Я сказал, что для конкретной задачи в scala-сообществе есть лучше решения чем shapeless. В частности, .
Я один из разработчиков компилятора и языка Scala, вы посмотрели не в ту сторону — shapeless и type classes это не то, что вообще рекомендовано к использованию на Scala.
Вы сделали ровно теже выводы что и мы. Просто не используйте shapeless. Он является скажем так «радикальной» частью сообщества, с которой многие не согласны.
Все что он делает можно реализовать лучше, и сделано уже в сообществе. Например HLists и HMaps намного лучше(и по API и по производительности) реализованы в scala records.
У вас нет гарантии что он собран из того исходника без патчей.
Надеюсь вы в курсе developers.yubico.com/ykneo-openpgp/SecurityAdvisory%202015-04-14.html По сути ключи там не защищены PIN-ом.
Новые Neo тоже не знают про время и требуют приложение на хосте: github.com/Yubico/yubioath-desktop
Если нужна безопасность повыше — можно использовать YubiKey NEO, он тоже умеет TOTP. И из него ключи не вытянуть никак.
Советую обратить внимание туда, ИМХО на данный момент это самые близкие к полнофункциональным коллекции.