(1) Algebra notation indicates IO is dual of any subject =>func pattern, especially IEnumerable<T> (2) Monad has M, bind, return and in Continuation Monad CM<T> = (T ->() ) -> () return :: T -> CM<T> bind :: CM<T> -> (T -> CM<S>) -> CM<S> Daulality Code interface IEnumerable<out T> { IEnumerator<T> GetEnumerator(); } interface IEnumerator<out T>: IDisposable { bool MoveNext(); T Current { get; } } interface IObservable<out T> { IDisposable Subscribe(IObserver<T> observer); } interface IObserver<in T> { void OnCompleted(bool done); void OnError(Exception exception); T OnNext { set; } } Covariant vs. Contravariant A <: B A is subtype of B,for TypeContructor C C<A> <: C<B> (Covariant) C<B> <: C<A> (Contravariant) Reading = Covar = <out T> Writing = Contra = <in T> =pass args into array. interface IRequireContravariant<in T> { int Write(T t); } interface IRequireCovariant<out T>{ T Read(int t); } IE vs. IO (1) Concurrency: IE need to remove Concurrency and block MoveNext until Source ready for Next Value; IO need to add Concurrency to not block source push to target (2) Async Computation Model void Fib( int n, ACtion CB, Action Err, Action Cncl) IObserverFib(int n); (3) IE can sample source interactively while IO cannot push back high speed source. So IScheduler is define to have time specified: IScheduler { DateTimeOffset Now IDisposable Schedule (state, DateTimeOffset dueTime, Func action) IDisposable Schedule (..TimeSpan dueTime,..); IDisposable Schedule (TState state, Func action) // constant push }
Saturday, August 11, 2012
Dualization
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment