Здравствуйте, Ночной Смотрящий, Вы писали:
J>> Где вообще логика, для в разы более часто используемого List<> нету литералов
НС>Есть для массивов потому что.
??
есть такое: var x = new[] {1,2,3}; ну это в общем тот же list-initializer только для захардкоренного типа.
есть такое: int[] y = {1,2,3};
но этот костыль вообще непонятно зачем существует (легаси времен первого шарпа?), его только вот в такой форме использовать можно.
Даже метод так нельзя вызвать
void Test(int[] arg) {}
Test({1,2,3});// ошибка компиляции.
Здравствуйте, Serginio1, Вы писали:
S> Шейпы я так понимаю, это сделать аналог С++ шаблонов c перегрузкой операторов, по аналогии с расширениями.
Я так понимаю что шейпы это аналог классов типов из Haskell.
Но без поддержки Higher Kinded Polymorphism оно будет далеко не таким мощным как в Haskell.
Здравствуйте, HrorH, Вы писали:
HH>Я так понимаю что шейпы это аналог классов типов из Haskell.
Ну в ссылке из стартового сообщения да. Но история совсем иная. Еще с 4, еним, шарпа была идея сделать extension everything. Но она потерпела крах, слишком много конфликтов с существующим функционалом. Соотв. шейпы это попытка избежать их отказом от static class и введением отдельной специальной сущности. Никакой особой цели кроме как семантически связать набор статических методов с определенным типом оно не преследует.
Здравствуйте, Ночной Смотрящий, Вы писали:
HH>>Я так понимаю что шейпы это аналог классов типов из Haskell. НС>Соотв. шейпы это попытка избежать их отказом от static class и введением отдельной специальной сущности. Никакой особой цели кроме как семантически связать набор статических методов с определенным типом оно не преследует.
Здравствуйте, HrorH, Вы писали:
HH>Здравствуйте, Serginio1, Вы писали:
S>> Шейпы я так понимаю, это сделать аналог С++ шаблонов c перегрузкой операторов, по аналогии с расширениями.
HH>Я так понимаю что шейпы это аналог классов типов из Haskell. HH>Но без поддержки Higher Kinded Polymorphism оно будет далеко не таким мощным как в Haskell.
В С++ напрополую используют перегрузку операторов в шаблонах. Для дженериков не было конструкций которые бы использовали уже существующие перегрузки операторов или которые можно было бы добавить. Проблема даже с обычными числовыми данными. Нужно добавлять интерфейс и для каждого типа добавлять Add, Div итд
C шейпами нам нужно добавить недостающие операторы или их переопределить (используя различные пространства имен как это сделано для расширений). Очень нужная конструкция.
public shape SGroup<T>
{
static T operator +(T t1, T t2);
static T Zero {get;}
}
This declaration says that a type can be an SGroup<T> if it implements a+ operator over T, and a Zero static property.
public extension IntGroup of int: SGroup<int>
{
public static int Zero => 0;
}
And the extension.
public static AddAll<T>(T[] ts) where T: SGroup<T> // shape used as constraint
{
var result = T.Zero; // Making use of the shape's Zero property foreach (var t in ts) { result += t; } // Making use of the shape's + operator return result;
}
Здравствуйте, Serginio1, Вы писали:
S>C шейпами нам нужно добавить недостающие операторы или их переопределить (используя различные пространства имен как это сделано для расширений). Очень нужная конструкция.
Конструкция нужная, но операторы там не самое главное.
Один человек в одной сборке определяет класс, потом другой человек в другой сборке определяет shape. И уже после этого(!) третий человек может в третьей сборке определить, как данный класс является экземпляром этого шейпа.
То есть эта такая форма ad hoc полиморфизма, альтернативная наследованию.
В Haskell можно сразу после определения типа сказать экземпляры каких классов типов будут созданы автоматически для этого типа (это конечно возможно только для некоторых классов типов).
В примерах приводятся операторы, т.к. товарищи из Haskell (и примкнувшие к ним) очень любят алгебру: моноиды, полугруппы, монады и т.п.
Часто используются классы типов Functor, Applicative и Monad, но все они требуют нормальной системы типов, которой в C# нет.
Но даже если они сделают shape в таком виде, это будет слишком хорошо, чтобы быть правдой.