Примеры полезных или нетривальных двойных интерфейсов

Недавно Эрик Мейер и другие продемонстрировали, насколько IObservable/IObserver является dual of IEnumerable/IEnumerator. Тот факт, что они являются двойственными, означает, что любая операция на одном интерфейсе действительна с другой, обеспечивая тем самым теоретическую основу для Reactive Extentions for. Net

Существуют ли другие двойные интерфейсы? Меня интересует любой пример, а не только .Net.

Ответ 1

Другим примером может быть TextReader и TextWriter, хотя есть еще больше шума, чем в случае наблюдаемых и перечислимых. В принципе сигнатура типа будет:

interface ITextReader {
  // Read: void -> int
  int Read();
}

interface ITextWriter {
  // Write: int -> void
  void Write(int val);
}

Ответ 2

Другим примером является тип продукта A.B и сумма типа A + B двух типов A и B. В Haskell вы можете написать их как:

data Prod a b = P a b -- this is the same as the pair type (a,b)

data Sum a b = Left a | Right b -- the same as the Either a b type

проверьте здесь для деталей

Ответ 3

Ковариация и контравариантность - еще один пример. Я думаю. Я мог ошибаться.

Барт Де Смит говорит: "В разных дисциплинах существует множество дуальностей, обеспечивающих большие передачи знаний между разными доменами. Например, в формальная логика, закон Моргана позволяет преобразовывать выражения, построенные из конъюнкций, в структуры, построенные из дизъюнкций, и наоборот. В электронике существуют сходства между поведением конденсаторов и индуктивностью: знайте одно и как идти туда и обратно между доменами, и вы знаете другое. Фурье-исчисление обеспечивает двойственность между временной и частотной областями". Интересно.

Они также называют System.Reactive двойным System.Interactive. Таким образом, большинство функций в одной из сборок имеют двойную структуру в другой. Чтобы уточнить, это не только то, что IO является двойственным IE, но функции, которые работают на них, также дублируются.

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