2012-11-27 26 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<_>类型或元组作为返回类型),使用它们的许多方法似乎可能会以不同的方式写入。