Re[7]: Сахар перенесён весь?
От: WolfHound  
Дата: 07.12.10 11:27
Оценка:
Здравствуйте, matumba, Вы писали:

M>Но как конструктор Hashtable() узнает, что он должен был быть хэшем [int, Node]? Мы ведь ничего не указывали:

Как это не указали?
См выделенное.
M>
mutable groupNodes : Hashtable[int, Node] = Hashtable();


Вывод типов еще не такое может:
    public GraphWalk[Key, Value]( start   : list[Key]
                                , walk    : Key * (Key -> Value) -> Value
                                , onCycle : Key -> Value)
                                : Map[Key, Value]
    {
      mutable result = Map();
      def visited = Hashtable();
      def getValue(key)
      {
        if (result.Contains(key))
          result.Get(key);
        else
        {
          def value = if (visited.ContainsKey(key))
            onCycle(key);
          else
          {
            visited.Add(key, 0);
            def value = walk(key, getValue);
            visited.Remove(key);
            value;
          }
          result = result.Replace(key, value);
          value;
        }
      }
      foreach (key in start)
        _ = getValue(key);
      result;
    }

Обрати внимание типы не указаны. Они будут выведены из использования.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[9]: Сахар перенесён весь?
От: WolfHound  
Дата: 07.12.10 11:30
Оценка:
Здравствуйте, matumba, Вы писали:

M>Мать!! Не, ну я догадывался, что Немерля круто выводит, но чтобы настолько.... "звизда фшоке". А не приводит ли такой "умный" вывод к коллизиям или скрытым эффектам?

Все нормально.
В худшем случае приходится указывать тип явно.

M>Я считал, что вывод всегда делается по правой части, давая тип левой. А тут комбинация левой и правой части! Мне уже страшно

На самом деле все еще веселее.
См тут
Автор: WolfHound
Дата: 07.12.10
.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[9]: Сахар перенесён весь?
От: hardcase Пират http://nemerle.org
Дата: 07.12.10 12:04
Оценка:
Здравствуйте, matumba, Вы писали:

M>Мать!! Не, ну я догадывался, что Немерля круто выводит, но чтобы настолько....


Типизатор отталкивается в своих рассуждениях от объявлений членов типов.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[5]: Сахар перенесён весь?
От: VladD2 Российская Империя www.nemerle.org
Дата: 07.12.10 14:26
Оценка:
Здравствуйте, 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>


Ну, вот литералы (первый пример) разрешены. А более сложные выражения — нет.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: Сахар перенесён весь?
От: VladD2 Российская Империя www.nemerle.org
Дата: 07.12.10 14:37
Оценка:
Здравствуйте, 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>Я считал, что вывод всегда делается по правой части, давая тип левой. А тут комбинация левой и правой части! Мне уже страшно


Ну, как видишь все намного интереснее. Только вот страшного тут ничего нет.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Сахар перенесён весь?
От: VladD2 Российская Империя www.nemerle.org
Дата: 07.12.10 14:41
Оценка: :)
Здравствуйте, dotneter, Вы писали:

VD>> В свое время предлагалось разрешить вывод типов для приватных полей и методов, но это замедлило бы работу IDE.


D>А нельзя проблемы иде решать на ее уровне, а не на уровне языка?


Нельзя. Тут как в выводе типов — все взаимосвязано.

D>Может я все пишу в vimе и мне больше интересен язык нежели какое то там иде.


Значит ты являешься пострадавшим от прогресса .
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.