Сообщение Re[8]: Roles in C# 9. Нужно? от 09.06.2020 16:09
Изменено 09.06.2020 16:15 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
Let us call the AddAll method with some ints,
Я так понял, что вместо
можно использовать интерфейс
а вместо
можно использовать
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
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
Let us call the AddAll method with some ints,
Я так понял, что вместо
можно использовать интерфейс
а вместо
можно использовать
И в примере Мэдс все тоже самое. Ты переопределяешь только
И разница в том, что int[] нужно привести к IntGroup[]
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[]