Re[3]: C# 9. Candidate Features
От: Ночной Смотрящий Россия  
Дата: 05.06.19 13:58
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Но в ситуации, которая описана в вашем примере, все несколько хуже.

S>Сейчас компилятор трансформирует код

Это неважно во что он его трансформирует, потому что тип вывести можно и до трансформации.

S>
S>var d1 = new Dictionary<string, int> {{"key"}:1}
S>var d2 = new Dictionary<string, float> {{"key"}:1}
S>

S>Нужно правило, по которому мы выберем строчку 1, увидев
S>
S>var d1 = new Dictionary<,> {{"key"}:1}
S>


Это правило уже есть, когда ты пишешь var i = 1;
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[3]: C# 9. Candidate Features
От: Jack128  
Дата: 05.06.19 15:49
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

J>> Где вообще логика, для в разы более часто используемого List<> нету литералов


НС>Есть для массивов потому что.

??
есть такое: var x = new[] {1,2,3}; ну это в общем тот же list-initializer только для захардкоренного типа.

есть такое: int[] y = {1,2,3};
но этот костыль вообще непонятно зачем существует (легаси времен первого шарпа?), его только вот в такой форме использовать можно.

Даже метод так нельзя вызвать
void Test(int[] arg) {}
Test({1,2,3});// ошибка компиляции.
Re[4]: C# 9. Candidate Features
От: Ночной Смотрящий Россия  
Дата: 05.06.19 18:21
Оценка:
Здравствуйте, Jack128, Вы писали:

J>есть такое: var x = new[] {1,2,3}; ну это в общем тот же list-initializer только для захардкоренного типа.


Да какая разница что там вобщем, если есть вполне компактная запись.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re: C# 9. Candidate Features
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 05.06.19 20:09
Оценка:
Здравствуйте, BlackEric, Вы писали:
BE>Востребованность остального мне пока не ясна.

Шейпы я так понимаю, это сделать аналог С++ шаблонов c перегрузкой операторов, по аналогии с расширениями.
и солнце б утром не вставало, когда бы не было меня
Re[2]: C# 9. Candidate Features
От: HrorH  
Дата: 06.06.19 13:45
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> Шейпы я так понимаю, это сделать аналог С++ шаблонов c перегрузкой операторов, по аналогии с расширениями.


Я так понимаю что шейпы это аналог классов типов из Haskell.
Но без поддержки Higher Kinded Polymorphism оно будет далеко не таким мощным как в Haskell.
Re[3]: C# 9. Candidate Features
От: Ночной Смотрящий Россия  
Дата: 06.06.19 14:44
Оценка:
Здравствуйте, HrorH, Вы писали:

HH>Я так понимаю что шейпы это аналог классов типов из Haskell.


Ну в ссылке из стартового сообщения да. Но история совсем иная. Еще с 4, еним, шарпа была идея сделать extension everything. Но она потерпела крах, слишком много конфликтов с существующим функционалом. Соотв. шейпы это попытка избежать их отказом от static class и введением отдельной специальной сущности. Никакой особой цели кроме как семантически связать набор статических методов с определенным типом оно не преследует.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[4]: Concept C#: Type Classes for the Masses
От: Qbit86 Кипр
Дата: 06.06.19 14:53
Оценка: 23 (2)
Здравствуйте, Ночной Смотрящий, Вы писали:

HH>>Я так понимаю что шейпы это аналог классов типов из Haskell.

НС>Соотв. шейпы это попытка избежать их отказом от static class и введением отдельной специальной сущности. Никакой особой цели кроме как семантически связать набор статических методов с определенным типом оно не преследует.

https://github.com/MattWindsor91/roslyn/blob/master/concepts/docs/csconcepts.md
Глаза у меня добрые, но рубашка — смирительная!
Re[3]: C# 9. Candidate Features
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 06.06.19 15:12
Оценка:
Здравствуйте, 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;    
}


Let us call the AddAll method with some ints,



int[] numbers = { 5, 1, 9, 2, 3, 10, 8, 4, 7, 6 };        
WriteLine(AddAll(numbers)); // infers T = int
и солнце б утром не вставало, когда бы не было меня
Re[4]: C# 9. Candidate Features
От: HrorH  
Дата: 06.06.19 18:58
Оценка: +1
Здравствуйте, Serginio1, Вы писали:

S>C шейпами нам нужно добавить недостающие операторы или их переопределить (используя различные пространства имен как это сделано для расширений). Очень нужная конструкция.


Конструкция нужная, но операторы там не самое главное.
Один человек в одной сборке определяет класс, потом другой человек в другой сборке определяет shape. И уже после этого(!) третий человек может в третьей сборке определить, как данный класс является экземпляром этого шейпа.
То есть эта такая форма ad hoc полиморфизма, альтернативная наследованию.

В Haskell можно сразу после определения типа сказать экземпляры каких классов типов будут созданы автоматически для этого типа (это конечно возможно только для некоторых классов типов).

В примерах приводятся операторы, т.к. товарищи из Haskell (и примкнувшие к ним) очень любят алгебру: моноиды, полугруппы, монады и т.п.

Часто используются классы типов Functor, Applicative и Monad, но все они требуют нормальной системы типов, которой в C# нет.
Но даже если они сделают shape в таком виде, это будет слишком хорошо, чтобы быть правдой.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.