最近 Erik Meijer和其他人展示IObservable/IObserver
了. 它们是双重的这一事实意味着一个接口上的任何操作在另一个接口上都是有效的,从而为 .Net 的反应式扩展提供了理论基础IEnumerable/IEnumerator
是否存在其他双接口?我对任何示例都感兴趣,而不仅仅是基于.Net。
最近 Erik Meijer和其他人展示IObservable/IObserver
了. 它们是双重的这一事实意味着一个接口上的任何操作在另一个接口上都是有效的,从而为 .Net 的反应式扩展提供了理论基础IEnumerable/IEnumerator
是否存在其他双接口?我对任何示例都感兴趣,而不仅仅是基于.Net。
另一个例子是TextReader
and TextWriter
,尽管比 observables 和 enumerables 的噪音更大。原则上,类型签名将是:
interface ITextReader {
// Read: void -> int
int Read();
}
interface ITextWriter {
// Write: int -> void
void Write(int val);
}
另一个例子是产品类型 AB 和两种类型 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
在这里查看详细信息
协变和逆变是另一个例子。我认为。我可能是错的。
Bart De Smet 说:“许多二元性存在于各个学科中,为不同领域之间的知识转移提供了很好的条件。例如,在形式逻辑中,德摩根定律允许将由连词构建的表达式转换为由析取构建的表达式,反之亦然。在电子学,电容器和电感的行为之间存在相似之处:知道一个以及如何在域之间来回移动,并且您知道另一个。傅里叶演算提供了时域和频域之间的对偶。有趣的。
他们还将 System.Reactive 称为 System.Interactive 的对偶。因此,其中一个程序集中的大多数功能在另一个程序集中具有双重功能。澄清一下,不只是 IO 是 IE 的对偶,对它们进行操作的功能也是对偶的。
因此,要回答您的问题,存在许多二元接口。您可以对任何接口进行双重化。您只需交换输入和输出以及函数的方向。有些不会有用,或者会成为他们自己的双重角色。然而,有时也有真正强大的隐藏在等待被发现。