Полиморфные числа на .Net и в C # - PullRequest
3 голосов
/ 09 марта 2010

Очень жаль, что в .Net нет полиморфизма чисел, то есть нет интерфейса INumeric, объединяющего различные типы числовых типов, такие как bool, byte, uint, int и т. Д. В крайнем случае, хотелось бы завершитьпакет типов абстрактной алгебры.

У Джо Даффи есть статья о проблеме:

http://www.bluebytesoftware.com/blog/CommentView,guid,14b37ade-3110-4596-9d6e-bacdcd75baa8.aspx

Как бы вы выразили это в C #, чтобы модернизировать его,не имея влияния на .Net или C #?

У меня есть одна идея, которая включает в себя сначала определение одного или нескольких абстрактных типов (таких как интерфейсы, как INumeric - или более абстрактный), а затем определение структур, которые реализуют эти типы и типы переносовнапример, int при предоставлении операций, возвращающих новый тип (например, Integer32: INumeric; где сложение будет определено как

public Integer32 Add(Integer32 other)
{
    return Return(Value + other.Value);
}

. Я немного боюсь скорости выполнения этого кода, но, по крайней мере, он абстрактный.

Нет операторов, перегружающих добро ...

Есть еще идеи?

.Net не похож на aviable долгосрочная платформа, если она не может иметь такую ​​абстракцию, я думаю - и будьте эффективны в этом.

Абстракция - это повторное использование.

update:

Это примерсигнатура типа реализации:

public struct Integer32 : INumeric<Integer32, Int32>, IOrder<Integer32, Int32>

Компенсация отсутствия ковариантных типов возвращаемых данных.

Ответы [ 3 ]

5 голосов
/ 09 марта 2010

Кто-то уже приложил усилия, чтобы написать что-то, что может решить вашу проблему. Он называется Универсальные операторы и доступен в Разнообразной библиотеке утилит .

1 голос
/ 17 июля 2017

Языковая команда csharp уже изучает это. Если вы хотите посмотреть на будущее классов типов в C #, начните читать с

https://github.com/dotnet/csharplang/issues/164

enter image description here

Кажется, его поддерживает Мэдс Торгессон, так что это не просто случайный пост блуждающего фаната Хаскелла.

Пример, приведенный для класса типов или формы в C # land:

public shape SGroup<T>
{
    static T operator +(T t1, T t2);
    static T Zero { get; }
}

обратите внимание, это не похоже на интерфейс. Он объявляет статический метод, принадлежащий SGroup. Продолжайте читать для подробностей и обсуждения .

0 голосов
/ 09 марта 2010

Если вы планируете использовать C # 4.0, вы можете легко смоделировать общие математические операции, используя dynamic. Вот пример простой функции добавления (для получения дополнительной информации см. Этот блог ):

public static T Add<T>(T a, T b) {
  dynamic ad = a;
  dynamic bd = b;
  return ad + bd;
}

Я не играл с этим, поэтому я не могу сказать много о спектакле. Конечно, будет определенная цена за использование динамического режима, но я думаю, что DLR должен иметь возможность выполнять очень эффективные оптимизации, если вы будете вызывать функцию несколько раз. На самом деле, я не удивлюсь, если бы у него был такой же профиль производительности, как у Общих операторов , упомянутых выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...