почему необязательно печатать в дартс? - PullRequest
6 голосов
/ 17 ноября 2011

http://www.dartlang.org/docs/spec/dartLangSpec.pdf

Спецификация языка для Dart упоминается ниже

Dart поддерживает опциональную типизацию на основе типов интерфейса. Система типов неверна, из-за ковариации универсальных типов . Это осознанный выбор (и, несомненно, спорный). Опыт показал, что правила типа звука для обобщений бросают вызов интуиции программиста . Это ..

  • Может кто-нибудь уточнить, почему система типов причин не имеет смысла?
  • О чем думали авторы спецификаций Dart lang, когда говорили, что правила звукового типа для дженериков бросают вызов интуиции?

Ответы [ 3 ]

9 голосов
/ 17 ноября 2011

от Гилада Брахи [1]:

Вы можете написать инструмент, который будет кричать об этих кровавых убийствах. вещи, но то, что вы не можете сделать, это помешать людям управлять их программы.

Или, другими словами [2]:

The Проблема в том, что выражение потока типов полностью и явно более труднее для большинства программистов, чем написание кода, который передает значения вокруг и имеет дело с ошибками типа времени выполнения, когда и если они случаются. Слово, выбранное для этой разницы в сложности, состоит в том, что последний более "интуитивно", чем первый - я не думаю, что это особенно плохой выбор слова. Это явление является одной из главных причин динамические языки стали намного более популярными в последние годы, отказ от сложности в определении статических типов.

Это как другой компромисс треугольника: выразительный, звук, простой: выберите любые два для вашей системы типов. Почти все не хотят отказываться выразительность - графы объектов, сплетенные в современном программном обеспечении, могут быть действительно запутанный - в то время как любой язык, который надеется иметь крупномасштабный успех не может начаться с чего-либо, кроме как довольно просто. Таким образом, они отказываются от некоторой меры (статически типизированной) обоснованности, и ожидайте много ошибок типа времени выполнения во время отладки и тестирования.

[1] http://blog.sethladd.com/2011/11/transcription-of-quick-tour-of-dart-by.html

[2] http://lambda -the-ultimate.org / node / 4377 # comment-67589

8 голосов
/ 15 декабря 2011

Что думали авторы спецификаций Dart lang, когда говорили, что правила звукового типа для дженериков бросают вызов интуиции?

Посмотрите на соответствующие вопросы справа от этого.один.Я вижу:

  • Почему List<Number> не является подтипом List<Object>?
  • Почему универсальные интерфейсы не являются со-контравариантными по умолчанию?
  • Почему я не могу присвоить List<Derived> для List<Base>?
  • Почему я не могу кастовать из list<MyClass> в List<object>?
  • Почему Animals[] animals = new Cat[5] компилируется, но List<Animal> animals = new List<Cat>() не так?

Хотя ковариация не является надежной (для многих изменяемых типов), именно такое поведение интуитивно ожидают многие программисты, когда впервые начинают работать с универсальными типами.

2 голосов
/ 18 ноября 2011

Более конкретно, что касается необоснованности, универсальные типы являются ковариантными. Таким образом, список строк может быть передан чему-то, что ожидает список объектов. Это небезопасно, потому что объект, который ожидает список Object, может попытаться добавить в список что-то, что не является String. Но говорить людям, что когда у вас есть B в качестве подкласса A, но Collection не является подтипом Collection , совершенно не интуитивно понятно.

...