Примеры полезных или нетривальных двойных интерфейсов
Недавно Эрик Мейер и другие продемонстрировали, насколько 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, но функции, которые работают на них, также дублируются.
Итак, чтобы ответить на ваш вопрос, существует много дуализированных интерфейсов. Вы можете дуализировать любой интерфейс. Вы просто меняете входы и выходы и направление функции. Некоторые из них не будут полезны или будут двойственны. Однако иногда есть действительно сильные, скрывающиеся в ожидании, чтобы их не раскрыли.