Re[6]: [ANN] Scala 2.4.0: очередные изменения языка
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 17.03.07 18:19
Оценка:
Здравствуйте, VladD2, Вы писали:

E>>С ковариантностью самое приятное то, что она с ходу понятна (ну в крайнем случае легко восстановить в памяти ее суть). А вот с контравариантностью лично у меня гораздо сложнее.


VD>А в чем разница? Хотя опять же не пользуйся делов то...


Формально говоря, если есть объявление ковариантности по параметру:
class Stack[+T] { ... }

и T является подтипом S, то Stack[T] является подтипом Stack[S]. Если же есть объявление контравариантности:
class Stack[-T] { ... }

и T являются подтипом S, то Stack[S] является подтипом Stack[T]. Вот такое вот объяснение.
Если же переходить на нормальный человеческий язык, то в случае контравариантности, можно делать так:
object T1 extends Application
{
  import scala.collection.immutable.Stack

  class Payment {}
  class DangerousPayment extends Payment {}

  def addPaymentTo( p: Payment, storage: Stack[Payment] ) {}

  var dangerousPaymentStorage = new Stack[ DangerousPayment ]
  val nextPayment = new DangerousPayment
  addPaymentTo( nextPayment, dangerousPaymentStorage )
}

Здесь вызов addPaymentTo является легальным, т.к. DangerousPayment является подтипом Payment и Stack[DangerousPayment] является подтипом Stack[Payment]. Собственно, с этим все понятно и у меня никогда проблем с ковариантностью не было. А вот контравариантность -- она вроде как есть, даже в стандартной библиотеке Scala используется:
abstract trait Function1 [-T1, +R] extends java.lang.Object with scala.ScalaObject

но, блин, сходу вспомнить, что она означает и придумать какой-то пример ее использования -- не получается.

А применять или хотя бы помнить, где применять, нужно. Т.к. вариантность и ограничения на типы параметров обобщенных классов/методов -- обязательный минимум знаний для написания обобщенного кода в Scala.

Кстати, в C++ и D этих заморочек нет и в помине. Не говоря уже про динамически типизированные языки.

E>>А после релиза встал еще более важный вопрос -- Phobos или Tango. Я лично ставлю на Tango.


VD>Это библиотеки что ли?


Да. Phobos -- это стандартная библиотека, которая идет в поставке компилятора DMD. Но очень ограниченная. В частности, в ней нет таких жизнено важных для меня вещей, как mutex и condition variables. Создана и развивается силами самого Вальтера Брайта.
Tango -- это попытка создать альтернативную стандартную библиотеку для D, которая бы полностью заменила Phobos. Разрабатывается силами коммунити и, поэтому, гораздо более продвинутая, чем Phobos.

К сожалению, на данном историческом этапе они совершенно не совместимы. Т.е. нужно либо писать на Phobos и не использовать Tango, либо наоборот.

E>>Я пользуюсь C++ с 93-го года практически постоянно. А начал изучать я его с конца 91-го.


VD>Везет тебе. А страступ считает, что свременный С++ появился где-то в 1994-ом.

VD>Чем ты пользовался то?

Turbo C++ 1.0 (это где-то 92-й), затем долго Borland C++ 2.0. Где-то же в 92-м, 93-м попадался в руки Zortech C++. С 95-го еще и Watcom C++.

E>> Имхо, потраченные 2 года на освоение языка, который обеспечивает мое нормальное существование уже в течении 13-ти лет себя давным-давно окупили.


VD>Ну, до 1994-то на ПиСи компиляторов того что сейчас называют С++ попросту не было. Что то ты выдумывашь (по крайней мере с датами).


См. свидетельства очевидцев
Автор: BulatZiganshin
Дата: 07.02.07
.

VD>В прочем, какое это отношение имеет к вопросу? Или ты намекаешь, что Скалу и/или Ди ты навереваешся изучать еще 5 лет?


Я говорил про двухлетнее изучение C++. На Scala и D я потратил где-то по году. Так что год у меня в запасе еще есть.

E>>Лудим потихоньку.


VD>Ну и как прогресс? Вот это очень интересно.


С переменным успехом. Иногда удобнее, чем на C++, иногда нет. В общем, не произошло еще такого озарения, чтобы я сам себе сказал -- вот этот язык теперь мой выбор.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.