Exemplos de interfaces duplas úteis ou não triviais
Pergunta
Recentemente, Erik Meijer e outros mostraram como IObservable/IObserver
é o dual de IEnumerable/IEnumerator
.O fato de serem duais significa que qualquer operação em uma interface é válida na outra, fornecendo assim uma base teórica para o Extensões reativas para .Net
Existem outras interfaces duplas?Estou interessado em qualquer exemplo, não apenas baseado em .Net.
Solução
Outro exemplo seria TextReader
e TextWriter
, embora haja ainda mais ruído do que no caso de observáveis e enumeráveis.Em princípio, as assinaturas de tipo seriam:
interface ITextReader {
// Read: void -> int
int Read();
}
interface ITextWriter {
// Write: int -> void
void Write(int val);
}
Outras dicas
Outro exemplo é o tipo de produto AB e o tipo A+B de dois tipos A e B. em Haskell, você pode escrevê -los como:
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
Verifica aqui para detalhes
Covariância e contravariância são outro exemplo. Eu penso. Eu poderia estar errado.
Bart de Smet diz: "Muitas dualidades existem em várias disciplinas, proporcionando grandes transferências de conhecimento entre diferentes domínios. Por exemplo, na lógica formal, a lei de De Morgan permite a conversão de expressões construídas a partir de conjunções em aquelas construídas a partir de disjunções e vice -versa. Em eletrônicos, existem semelhanças Entre o comportamento dos capacitores e indutâncias: conheça um e como ir e voltar entre os domínios, e você conhece o outro. O cálculo de Fourier fornece duplos entre os domínios de tempo e frequência ". Interessante.
Eles também chamam de System.Reative o dual de System.interactive. Portanto, a maioria das funções em uma das assembléias tem seu duplo na outra. Para esclarecer, não é apenas que IO seja o dual do IE, mas as funções que operam nelas também são duvitalizadas.
Então, para responder à sua pergunta, existem muitas interfaces duplazadas. Você pode duplicar qualquer interface. Você apenas troca as entradas e saídas e a direção da função. Alguns não serão úteis ou serão o duplo de si mesmos. No entanto, às vezes existem realmente poderosos escondidos esperando para serem descobertos.