tag:blogger.com,1999:blog-654279083390275842.post5597835928278549216..comments2024-03-19T12:22:43.654+03:00Comments on Размышлизмы eao197: [comp.prog] Несколько слов о контравариантности в Scalaeao197http://www.blogger.com/profile/17283739752119445290noreply@blogger.comBlogger10125tag:blogger.com,1999:blog-654279083390275842.post-1832484489818106552009-10-12T09:58:02.326+03:002009-10-12T09:58:02.326+03:00в С++ все это делается обычными шаблонами со стати...в С++ все это делается обычными шаблонами со статик-ассертами.<br />Причем в статик-ассерт можно сделать проверку какой угодно сложности, не только ко/контравариантности.<br />Поэтому в плюсах оно и не нужно.jazzerhttps://www.blogger.com/profile/06868666121339270193noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-42721377534054566612009-10-08T21:12:42.749+03:002009-10-08T21:12:42.749+03:00В C# контравариантность делегатов есть со 2-ой вер...<i>В C# контравариантность делегатов есть со 2-ой версии.</i><br /><br />Да, блин, пора завязывать говорить о том, в чем не разбираешься...eao197https://www.blogger.com/profile/17283739752119445290noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-33454314235263515952009-10-08T20:27:56.930+03:002009-10-08T20:27:56.930+03:00В мейнстримовых языках (Java, C#, C++) ее нет.
В ...<i>В мейнстримовых языках (Java, C#, C++) ее нет.</i><br /><br />В C# контравариантность делегатов есть со 2-ой версии.<br />http://msdn.microsoft.com/en-us/library/ms173174(VS.80).aspx<br />В C# 4 они обещают ковариантность контейнеров.<br />В Скале все это сразу было, поскольку ее писали образованные люди :)<br /><br />В C# кругах про это очень много пишут, вот Липперт, например:<br />http://blogs.msdn.com/ericlippert/archive/tags/Covariance+and+Contravariance/default.aspxzOOnhttps://www.blogger.com/profile/08412003854991735301noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-19437259417204128122009-10-08T12:22:29.052+03:002009-10-08T12:22:29.052+03:00Я еще хочу повторить, она не в скале возникает, а ...<i>Я еще хочу повторить, она не в скале возникает, а в _любом_ языке, где есть джинерики и наследование: С++,C#, Java etc.</i><br /><br />Не, ну вот в C++ возможности указывать контравариантность нет -- и ничего, особых жалоб не слышно. А в Scala эта возможность есть. И тут же возникают вопросы: "А что это за зверь?", "А нахрена?", "А как его правильно использовать?".<br /><br />Я, в общем, чего хочу сказать. Вот есть в Scala такая штука, как контравариантность. В мейнстримовых языках (Java, C#, C++) ее нет. Значит, переходящие на Scala разработчики будут с ней сталкиваться впервые. Если эта фича достаточно полезная, то она должна быть на пальцах с простыми примерами разъяснена во всех материалах по Scala. Но я такого не видел. И, по-моему, это плохо. Поэтому и будут возникать такие вопросы, как недавний на RSDN. И будет много таких объяснений, как дал nikov (формально правильных, но малопонятных). Что не есть хорошо.eao197https://www.blogger.com/profile/17283739752119445290noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-25209156994900628342009-10-08T12:03:44.120+03:002009-10-08T12:03:44.120+03:00А теперь для них возникнет контравариантность пара...<i>А теперь для них возникнет контравариантность параметров</i><br /><br />Я еще хочу повторить, она не в скале возникает, а в _любом_ языке, где есть джинерики и наследование: С++,C#, Java etc.zOOnhttps://www.blogger.com/profile/08412003854991735301noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-40804280096473506262009-10-08T12:00:11.509+03:002009-10-08T12:00:11.509+03:00Вы можете вообще ничего не расставлять - и получит...Вы можете вообще ничего не расставлять - и получите в точности то, что в яве.<br /><br />Если захотите расставить - достаточно пары правил: аргументы функции <b>могут быть</b> контрвариантными; неизменяемые контейнеры, и результаты функций <b>могут быть</b> ковариантными.zOOnhttps://www.blogger.com/profile/08412003854991735301noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-2944286196268287082009-10-08T11:32:09.978+03:002009-10-08T11:32:09.978+03:00Ну то, что в стандартной библиотеке уже расставлен...Ну то, что в стандартной библиотеке уже расставлено -- это не суть важно. Важно, насколько сложно будет программисту использовать возможности языка для достижения своих целей. Допустим, программист захотел написать свой обобщенный код -- исходя из каких соображений ему расставлять ко-/контравариантность для аргументов? Наверное, методом проб и ошибок.<br /><br />Язык массового потребления (коим предстоит стать Scala, если он пытается занять место Java) должен иметь разумный баланс между сложностью и возможностями. В Scala этот баланс нарушен, имхо, в сторону сложности. Контравариантность -- это только пример, с которым я сам столкнулся.<br /><br />Хотя до C++ Scala еще пахать и пахать. Но есть люди, которые с удовольствием переходили с C++ на Java, в том числе и из-за сложности C++ных шаблонов. А теперь для них возникнет контравариантность параметров...eao197https://www.blogger.com/profile/17283739752119445290noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-69128248038334558962009-10-08T11:15:31.563+03:002009-10-08T11:15:31.563+03:00Это не в Scala, как в таковой - это жизнь так устр...Это не в Scala, как в таковой - это жизнь так устроена. Например, в С++результаты методов могут быть ковариантны (это не сразу там появилось, это добавили - удобно), но нет никакой возможности объявить аргументы методов контрвариантными. В Scala у вас есть возможность декларировать ковариантность/контрвариантность явно. Жизнь(не Scala), диктует правила, например, вы можете сделать контенеры ковариантными (т.е. разрешить использовать List[Button] вместо List[Widget]), но это типобезопасно, только если они неизменяемые. <br /><br />В методах вы можете обявить аргументы контрвариантными, поскольку это имеет смысл, но можете и не объявлять. Т.е. как пользователь скалы вы можете ничего об этом и не знать - но в стандартной библиотеке все декларации ковариантности/контрвариантности уже расставлены, корректным, типобезопасным образом.<br /><br />То, что в руководствах скалы успользуют слово "позиция" - мне тоже не нравится.<br /><br />В википедии есть неплохая статья с большим количеством примеров на разных языках.<br />http://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science)zOOnhttps://www.blogger.com/profile/08412003854991735301noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-60679588571666454672009-10-08T08:30:05.438+03:002009-10-08T08:30:05.438+03:00Понимать не обязательно -- это сильно :)
Ваше объ...Понимать не обязательно -- это сильно :)<br /><br />Ваше объяснение хорошее. Только сюда бы еще добавить тот факт, что в Scala были (не знаю, есть ли сейчас) ко/контра-вариантные позиции аргументов. Из-за которых какие-то аргументы могут быть контравариантными, а какие-то нет.eao197https://www.blogger.com/profile/17283739752119445290noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-42169557527518388182009-10-08T04:52:48.889+03:002009-10-08T04:52:48.889+03:00У вас дома есть апельсиновыжималка, другими словам...У вас дома есть апельсиновыжималка, другими словами, функция типа апельсин -> сок.<br />Она сломалась и вы хотите ее заменить (т.е. новая соковыжималка будет подтипом старой).<br />Вы не можете заменить ее яблоковыжималкой (яблоко -> сок), но можете заменить<br />универсальной (фрукт -> сок) - это и есть контрвариантность аргумента. <br />Т.е. чтобы одна функция заменяла другую, она должна принимать аргументы либо<br />того же типа, либо более общего типа. <br /><br />В общем это и понимать не обязательно, достаточно запомнить, что аргументы <br />контрвариантны, а результат ковариантен.zOOnhttps://www.blogger.com/profile/08412003854991735301noreply@blogger.com