反應式擴展(或Rx)在功能性編程中非常強大,函數式編程要求每個操作符都返回一個值。
在命令式語言,如C#中,情況並非如此。我們可以定義沒有返回類型的方法,如void Foo() { ... }
。在非功能語言中,這很好,當我們撥打電話Foo()
時,我們期望它能夠做到它所做的一切,並將它控制給我們。
在函數式語言中,我們可以調用void
方法,因爲我們需要一切都具有返回類型。因此,爲了使Rx正常工作,我們需要有一個特殊的返回類型,表示void
,但我們不能使用void
甚至實際類型System.Void
作爲編譯器不允許的返回類型。因此在System.Reactive.Unit
作爲特殊類型來表示返回值爲void
。
而且由於觀測都是基於IObservable<T>
(沒有IObservable
無T
)你必須有一個返回類型時調用Observable.Start(Action)
。因此我們有IObservable<Unit>
。
我不明白你的意思,「爲什麼我需要轉換一個空洞流以列出並從中取出第一個元素來代替並行ForEach?」
爲什麼不void Start(IObservable<T>, Action<T>)
?
那個簽名對我來說沒有意義。如果您有Action<T>
,那麼適用Observable.Start
的超載爲IObservable<T> Observable.Start(Action<T>)
。如果是Action
(這是你的問題的主題),那麼它是IObservable<Unit> Observable.Start(Action)
。
是否存在C#中使用Unit而不是某些其他語言的示例?
這也是一個我覺得難以理解的問題。我不可能知道足夠詳細的每一種其他語言,以告訴您在C#中專門使用Unit
的位置。事實上,Rx有很多其他語言的端口,我認爲不會有這樣的用法,你要求。你能澄清你在問什麼嗎?
有一個問題鏈接,詢問Parallel.ForEach(IObservable<T>, Action<T>)
在哪裏。在答案中,IObservable被詢問爲ToList()
和First()
。如果它的唯一目的是改變某些東西,這對我來說沒有多大意義。
的.ToList()
操作者接通一個IObservable<T>
返回零點或更多的值成IObservable<IList<T>>
返回一個值(一旦源可觀察到的完成)。所以以下.First()
只是將IObservable<IList<T>>
變成IList<T>
。
它已被鏈接的答案用來強制observable的執行並阻止,直到observable完成。請記住,observables具有與枚舉相同的延遲執行模型。
在功能語言中,Unit
是純功能範例和真正的單詞應用程序之間的折中。在C#中它的目的是什麼,它從來沒有純粹的功能?
不要緊功能C#怎麼純粹是或不是,類型Unit
用於允許觀測,它必須是強類型並返回零個或多個值,有這樣一種類型,表示沒有有意義的返回類型
它與EventArgs
具有簽名void Foo(object sender, EventArgs e)
的事件處理程序非常類似 - 當事件觸發時,您知道發生了某些事情,但您從e
中沒有收到任何信息。從可觀察值獲取Unit
的值非常類似於在事件處理程序中獲取EventArgs
。
爲什麼不'void Start(IObservable,Action )'?有沒有例子''單元'在'C#中使用,而不是其他一些語言?有一個問題鏈接詢問'Parallel.ForEach(IObservable ,Action )'。在回答中,'IObservable '用'ToLost()'和'First()'查詢。如果它的唯一目的是改變某些東西,這對我來說沒有多大意義。在功能語言中,「單元」是純功能範例和真正的單詞應用之間的折中。在C#中它的目的是什麼,它從來沒有純粹的功能? –
user2136963
@ user2136963 - 我根據你的問題更新了我的答案。 – Enigmativity
「你能澄清你在問什麼嗎?」我正在爲c#尋求實用的應用程序。現在我明白了,該單元是監視Action是否完成的一種方法。謝謝! – user2136963