[英]F# functions vs C# “Func”tions
所以我遇到了这个F#之旅: https : //docs.microsoft.com/en-us/dotnet/articles/fsharp/tour
...和男孩你好F#有趣! 游览的一开始就定义了一个示例函数,它看起来非常简单:
/// You use 'let' to define a function. This one accepts an integer argument and returns an integer.
/// Parentheses are optional for function arguments, except for when you use an explicit type annotation.
let sampleFunction1 x = x*x + 3
所以这对我来说很有意义。 它定义了函数是什么,所以如果我将一些数字传递给这个东西,它会将它平方并为该结果增加3,如巡视中的下一行所示:
/// Apply the function, naming the function return result using 'let'.
/// The variable type is inferred from the function return type.
let result1 = sampleFunction1 4573
经过几分钟的思考后,我得出结论,C#也可以做到这一点! 我确实非常喜欢C#。 就我所知,这就是上面在C#中的样子:
Func<int, int> sampleFunction1 = x => x*x + 3;
var result = sampleFunction1(4573);
所以我的主要问题是,我在C#中写的内容与F#tour给我的内容有什么区别? 子问题是:IL代码是否有任何不同,即使它是相同的CLR? 我会使用F#而不是C#的几个原因是什么?
从技术上讲,这些是等价的。 IL可能有点不同,只是因为这些是不同的编译器,但并不多。 实质上,这些是以相同的方式编译的。
但是C#不能做到这一点。 您是否注意到如何在前面编写Func<int,int>
? 但这只是一个非常小的玩具功能。 在更实际的情况下会发生什么? 注意:
// F#
let f x m = Map.find (x, x+1) m |> Seq.map ((+) 1)
// C#
Func<int, IDictionary<Tuple<int, int>, IEnumerable<int>>, IEnumerable<int>> f = (x, m) => m[Tuple.Create(x, x+1)].Select( i => i+1 );
好玩,不是吗?
这称为“类型推断”。 如同,F#能够根据使用的东西推断出类型的东西。 你几乎可以写一个完整的程序,从来没有使用过类型注释。 C#在某种程度上也有这个。 这就是我能够调用的方式.Select( i => i+1 )
,C#知道i
是int
,因为之前发生的事情.Select
是IEnumerable<int>
。 但它非常有限,而不是那么强大。
类型推断仅仅是F#的众多优势之一 。 我选择了它,因为你看着它并没有看到它。 但还有更多。 编译顺序,缺少空值,默认不变,代数数据类型,自动currying和部分应用......实际上,还要比SO答案更合适。
那些希望发现功能性编程的奇妙和令人兴奋的世界的人,特别是F#,我通常会直接发送到https://fsharpforfunandprofit.com/ ,进入Wlaschin先生亲切而有能力的人手中。 一个美妙的资源,阅读所有。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.