有用或非平凡双接口的示例

时间:2010-01-24 01:36:23

标签: c# functional-programming system.reactive reactive-programming category-theory

最近,Erik Meijer和其他人已经展示了IObservable/IObserver IEnumerable/IEnumerator dual 。它们是双重的这一事实意味着一个接口上的任何操作在另一个接口上都是有效的,从而为Reactive Extentions for .Net提供理论基础

是否存在其他双接口?我对任何一个例子感兴趣,而不仅仅是.Net。

3 个答案:

答案 0 :(得分:3)

另一个例子是TextReaderTextWriter,但噪音比可观察和可枚举的情况更多。原则上,类型签名将是:

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

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

答案 1 :(得分:3)

另一个例子是产品类型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

检查here了解详情

答案 2 :(得分:2)

协方差和逆变是另一个例子。我认为。我错了。

Bart De Smet says:“不同学科中存在很多二元性,提供了不同领域之间的大量知识转移。例如,在形式逻辑中,De Morgan定律允许将从连词构建的表达式转换为由析取构建的表达式,以及反之亦然。在电子学中,电容器和电感的行为之间存在相似之处:知道一个以及如何在域之间来回传递,你知道另一个。傅立叶微积分在时域和频域之间提供双重性。有趣。

他们还将System.Reactive称为System.Interactive的双重身份。因此,其中一个组件中的大多数功能都具有双重功能。为了澄清,不仅IO是IE的双重功能,而且对它们起作用的功能也是二元化的。

因此,为了回答您的问题,存在许多双重化接口。您可以将任何界面二元化。您只需交换输入和输出以及功能的方向。有些不会有用,或者是自身的双重性。然而,有时真的有一些强大的隐藏等待被发现。