已经将函数委托作为参数合并的C#程序员的F#

kpo*_*ock 8 c# f#

我有一本关于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#提供这种功能.


Mic*_*lGG 6

除了其他答案:自动泛化.

这使得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#中,我可以编写这个想法,一般来说,事情会尽可能地得到推广,而我没有进一步的工作.可爱.


Cha*_*der 5

另一大优势是完整型推理系统.本地函数,lambda,元组和列表非常少地减少代码.


小智 4

我认为 F# 的一大优势是对元组的更好支持。