Здравствуйте, matumba, Вы писали:
M>Но как конструктор Hashtable() узнает, что он должен был быть хэшем [int, Node]? Мы ведь ничего не указывали:
Как это не указали?
См выделенное. M>
Здравствуйте, matumba, Вы писали:
M>Мать!! Не, ну я догадывался, что Немерля круто выводит, но чтобы настолько.... "звизда фшоке". А не приводит ли такой "умный" вывод к коллизиям или скрытым эффектам?
Все нормально.
В худшем случае приходится указывать тип явно.
M>Я считал, что вывод всегда делается по правой части, давая тип левой. А тут комбинация левой и правой части! Мне уже страшно
На самом деле все еще веселее.
См тут
Здравствуйте, matumba, Вы писали:
M>Ну вот этот Hashtable() — мы ему не указали специализацию ([int, Node]) — с какой стати он будет присваиваться Hashtable[int, Node]? (и вообще создаваться)
Дык вывод типов. Он настолько крут, что если хоть откуда-то можно узнать тип, то он будет вычислен. Это касается и параметров типов. Так что можешь не волноваться тип Hashtable() получит именно тот тип, что тебе нужен.
M>Эх... отучились вы от удобного стиля! Влад, у меня такие "местные инициализации" сплошь и рядом, т.к. классу обычно делают пару наиболее употребимых конструкторов, остальное (в силу лени и бессмысленности всех сочетаний) дают на откуп ручному присвоению. И Дотнет, между прочим, не исключение. Так что макрос with я считаю must have.
Дык потому и отучились, что лень городить огороды на ровном месте. Ну, а для редких случаев нет проблем и через точку свойства проинициализировать.
M>-------------- M>Если чуть пофилософствовать, то я считаю Немерле лучше быть императивным, вбирая лучшее от ФП — это более естественный для многих тип мышления (и по развитию C# это тоже видно). Хаскель Головного Мозга — это всё же редкое явление M>Мы, собсно, и так имеем достаточно: неизменяемые объекты, лямбды, ПМ, так что нажимать ФП-ием на юзера — только распугать зазря. M>--------------
Дык кто тебе не дает. Все что можно в шарпе (за исключением мало нужных мелочей) есть. Просто тебе немного подталкивают к выбору более коротких и убобных путей.
В прочем, можно конечно и повторить эти инциализаторы раз они уж так полюбились общественности. Жаль только что в купе с ленью они будут провоцировать плохой стиль.
VD>>Если же разрешить глобальный вывод типов, то придется перетипизировать весь проект.
M>ОК, понял. Ну а без функций, поддерживая только явные типы? M>
M>public a = 7; // очевиднее некуда
M>private z = List[People]();// ditto
M>
Ну, вот литералы (первый пример) разрешены. А более сложные выражения — нет.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, matumba, Вы писали:
M>Мать!! Не, ну я догадывался, что Немерля круто выводит, но чтобы настолько.... "звизда фшоке".
Это был детский (простой) примерчик. Классикой является вот такой код:
def map = Hashtable();
map.Add("a", 123.5);
из второго выражения компилятор выводит, что тип map Hashtable[string, double]. Если далее попытаться использовать переменную не верным образом:
if (map[1] == 123.5)
...
то компилятор сообщит об ошибке (что индексер требует строку, а получил целое).
M>А не приводит ли такой "умный" вывод к коллизиям или скрытым эффектам?
Нет. Если встречаются неоднозначности, то будет сообщение об ошибке.
Кроме того в любом месте кода (а не только при объявлении переменных) можно указывать тип явно. Более того типы можно задавать частично. Например, можно сделать так:
def map = Hashtable() : Hashtable[_, float];
и компилятор выведет только первый параметр типа.
M>Я считал, что вывод всегда делается по правой части, давая тип левой. А тут комбинация левой и правой части! Мне уже страшно
Ну, как видишь все намного интереснее. Только вот страшного тут ничего нет.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, dotneter, Вы писали:
VD>> В свое время предлагалось разрешить вывод типов для приватных полей и методов, но это замедлило бы работу IDE.
D>А нельзя проблемы иде решать на ее уровне, а не на уровне языка?
Нельзя. Тут как в выводе типов — все взаимосвязано.
D>Может я все пишу в vimе и мне больше интересен язык нежели какое то там иде.
Значит ты являешься пострадавшим от прогресса .
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.