我有一本关于F#的书,但此刻我很不知情,所以我想我会问.从很少有人知道F#,我很难看到它在C#bar上获得了什么可能的语法整洁.在概念上似乎没什么新东西,或者说在piian C中不可行#
当(20年前差不多!)时我做了Forth回来了,并且我已经将传递函数委托作为参数合并到方法中(似乎永远都在做那种事情).
从文体上来说,我并不热衷于匿名方法 - 这会成为一个问题吗?
虽然我认为句法整洁不会被嗤之以鼻:-)
Bri*_*ian 13
(警告:第一点并不能解决你的问题.作为F#团队的一员,我非常偏颇.)现在已经使用F#近一年了,我发现每当我必须编写C#代码时感觉就像走过泥巴.有这么多的cur and和分号,哦,我的天哪退出制作我写的所有类型!感觉很慢.我使用了大量的C#代码,所以我几乎每天都在阅读和调试它,并且它很好(甚至比F#更好用于调试;我们仍然需要改进F#调试器集成一点),但我发现写 C#代码现在感觉像是一件苦差事; F#对代码来说更有趣.
至于你问题的实际答案,很多人都会说'元组',但我会说'嗯'.类型推断,区分联合和模式匹配,功能库,流水线和句法整洁(语法问题!)对我来说是更大的赢家.(如果你今天要编写异步代码,F#就会把其他人打开.)
Rob*_*ert 11
我喜欢F#和C#,但一般我更喜欢F#:
我会说如果你尝试在C#中进行不可变编程,你很快就会遇到一个问题,你不能从方法/函数返回多个东西.F#使用元组巧妙地解决,允许您返回多个值.
C#中代表的另一个问题是它们是名义上的.您可以让两个代表具有完全相同的签名,但由于它们具有不同的名称,因此它们不兼容.您可以使用lambdas或匿名委托解决此问题,但F#以更清晰的方式解决:它只是检查签名是否匹配.
联盟类型很棒,很难看到C#提供这种功能.
除了其他答案:自动泛化.
这使得F#在C#,Scala等方面迈出了巨大的一步.这里有一个简单的例子,"snd"函数可以从一对中获取第二个值.在F#中:
let snd (a,b) = b
Run Code Online (Sandbox Code Playgroud)
编译器自动计算出来并使其完全通用:
val snd : 'a * 'b -> 'b
Run Code Online (Sandbox Code Playgroud)
在C#中:
static Tb snd<Ta, Tb>(Tuple<Ta, Tb> x) { return x.B; }
Run Code Online (Sandbox Code Playgroud)
代码的1/3,噪音减少100%.现在,将它扩展到更复杂的函数类型,比如,取一个元组的东西,并将一些枚举的字典返回给函数.哎哟.
这些都是简单的场景.添加一些通用约束,类型参数之间的关系,以及它在C#中变得非常困难.使用C#几次,我必须真正停下来,思考并计算我需要哪些通用参数,即使它不是一个困难的应用程序.在F#中,我可以编写这个想法,一般来说,事情会尽可能地得到推广,而我没有进一步的工作.可爱.