2012-11-27 25 views
4

http://diditwith.net上我看到,在F#中,不是必須將參數傳遞給另外需要它們的函數。該語言會自動將結果和輸出參數填充到元組中。 (!)F#和元組輸出

這是語言的一般機制的某種副作用(赦免雙關語),還是F#規範中明確提到的並故意編入語言的功能?

這是一個很棒的功能,如果它被明確地加入到F#中,那麼我想知道這樣的其他金塊在這個語言中潛伏着什麼,因爲我已經鑽了數十個網頁並閱讀了三個(由D. Syme,T. Petricek和C. Smith撰寫),我還沒有看到這個特殊的技巧。

編輯:作爲Petricek先生回答,下面,他確實提到要素將在他的書至少兩個地方,現實世界的函數編程。我的錯。

+2

[這種行爲在這裏描述的規範(http://research.microsoft.com /en-us/um/cambridge/projects/fsharp/manual/spec.html#_Toc335818955)。在那裏有更多的好東西,他們做了一堆事情來使.NET與.NET平滑... –

+1

我沒有在規範中看到它,但它[在MSDN上提到](http://msdn.microsoft.com/zh-cn/library/default.aspx)。 COM/EN-US /庫/ dd233213.aspx)。 – Daniel

回答

5

這不是F#語言中其他更一般機制的副作用。

它已被專門添加爲此目的。 .NET庫通常會在方法簽名末尾添加out(或ref)參數以返回多個值。在F#中,返回多個值是通過返回元組完成的,因此將.NET樣式轉換爲典型的F#模式是有意義的。

我不認爲F#做了很多類似的技巧,特別是當它涉及到互操作性,但你可以通過一些便利的片段herehere的瀏覽。

我趕緊檢查和現實世界的函數式編程簡略的提到的伎倆在88和111頁。)

+0

謝謝托馬斯,對不起,我忽略了/忘記了你的高超的書中提到的訣竅! – MiloDC

+0

@MiloDC謝謝你的好話!我很驚訝它沒有提到更突出,雖然:-)這是一個很酷的功能! –

3

這是一個特殊的功能,可以使.NET方法更愉快 - 所有拖出的參數可以被視爲返回值的一部分(但請注意,這隻影響拖尾輸出參數,因此使用C#不能像這樣調用void f(out int i, int j)這樣的簽名)。

無論如何,out參數只是一種解決.NET 1.0中元組缺失的方法。如果使用這些框架的更高版本(使用Nullable<_>類型或元組作爲返回類型),使用它們的許多方法似乎可能會以不同的方式寫入。