Информация об изменениях

Сообщение Re[8]: Roles in C# 9. Нужно? от 09.06.2020 16:09

Изменено 09.06.2020 16:23 Serginio1

Re[8]: Roles in C# 9. Нужно?
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, Serginio1, Вы писали:


S>>Здравствуйте, Sinclair, Вы писали:


S>>Берем QuikSort и ничего там переопределять вообще не нужно.

S>Да, только в C# не работает.
Ну так роли для этого и сделаны.
S>>И куча алгоритмов для арифметических типов переопределять не надо. Написал для инта проверил, и все остальное для всех алгеброических типов идет.
S>Коллега, вы сецчас пишете о чём-то своём.
S>>Суть то ролей в том, что бы ты использовал текущую перегрузку опрераторов. Не хочешь действуй как и раньше только вместо
S>Ничего подобного в ролях нету.
S>> В твоем примере можно использовать текущие перегрузки операторов.
S>Нельзя.
S>Мэдс же показал код — чтобы обобщённый код подхватил операторы типа +, нужно, чтобы либо генерик-параметр реализовал IMonoid<T> (ну, или там IRing<T>), либо руками выписывать роль, в которой IMonoid<int>.operator+ мапится на int.operator+.
S>Чтобы этот же код заработал не с int, а с Complex, надо опять руками выписывать роль ComplexAddMonoid и руками же скармливать её в генерик-параметр метода.
Там

Смотрим старый вброс на шейпах

https://www.c-sharpcorner.com/article/candidate-features-for-c-sharp-9/

Original Source


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


Я так понял, что вместо
 public shape SGroup<T>


можно использовать интерфейс
а вместо
public extension IntGroup of int: SGroup<int>


можно использовать

role IntGroup  extednds int


И в примере Мэдс все тоже самое. Ты переопределяешь только
public static int Zero => 0;



И разница в том, что int[] нужно привести к IntGroup[]
Re[8]: Roles in C# 9. Нужно?
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, Serginio1, Вы писали:


S>>Здравствуйте, Sinclair, Вы писали:


S>>Берем QuikSort и ничего там переопределять вообще не нужно.

S>Да, только в C# не работает.
Ну так роли для этого и сделаны.
S>>И куча алгоритмов для арифметических типов переопределять не надо. Написал для инта проверил, и все остальное для всех алгеброических типов идет.
S>Коллега, вы сецчас пишете о чём-то своём.
S>>Суть то ролей в том, что бы ты использовал текущую перегрузку опрераторов. Не хочешь действуй как и раньше только вместо
S>Ничего подобного в ролях нету.
S>> В твоем примере можно использовать текущие перегрузки операторов.
S>Нельзя.
S>Мэдс же показал код — чтобы обобщённый код подхватил операторы типа +, нужно, чтобы либо генерик-параметр реализовал IMonoid<T> (ну, или там IRing<T>), либо руками выписывать роль, в которой IMonoid<int>.operator+ мапится на int.operator+.
S>Чтобы этот же код заработал не с int, а с Complex, надо опять руками выписывать роль ComplexAddMonoid и руками же скармливать её в генерик-параметр метода.
Там

Смотрим старый вброс на шейпах

https://www.c-sharpcorner.com/article/candidate-features-for-c-sharp-9/

Original Source


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


Я так понял, что вместо
 public shape SGroup<T>


можно использовать интерфейс
а вместо
public extension IntGroup of int: SGroup<int>


можно использовать

role IntGroup  extednds int


И в примере Мэдс все тоже самое. Ты переопределяешь только
public static int Zero => 0;



И разница в том, что int[] нужно привести к IntGroup[]

В любом случае определить можно сделать один интерфейс для всех перегрузок операторов алгеброических типов и прописать для них роли
и использовать эти роли хоть откуда как Func<> Action итд.