我以前真的很喜欢C#
这是我的主要语言,每次我将它与其他流行语言进行比较时,我很高兴我不小心选择了它。Python和Javascript缺乏静态类型(假设JS有任何类型的类型),Java缺乏适当的泛型、属性、事件、值类型,这导致所有这些包装类如Integer等一团糟。
我不得不提的是,我只是在比较语言本身和使用它们编写的舒适度,而没有涵盖工具和其他环境的主题,因为这些都足够好,可以使企业开发变得合理和舒适。
然后我出于好奇尝试了F#。
好的,那有什么好处呢?
简述如下:
默认不变性
事实证明,函数式范式比我们今天所说的OOP更可靠、更简洁
求和类型或可区分联合
计算表达式
SRTP或静态解析类型参数
null安全
简洁的句法
类型推断
好吧,null部分很简单:没有什么比像TaskIEnumerableEmployee那样无休止地检查返回值更让代码如同天书了。因此,让我们谈谈不变性和简洁性。考虑以下POCO类:
publicclassEmployee{publicGuidId{get;set;}publicstringName{get;set;}publicstringEmail{get;set;}publicstringPhone{get;set;}publicboolHasAccessToSomething{get;set;}publicboolHasAccessToSomethingElse{get;set;}}
简短,简单,没有多余的东西。不能再短了。现在看看F#等效代码:
typeEmployee={Id:GuidName:stringEmail:stringPhone:stringHasAccessToSomething:boolHasAccessToSomethingElse:bool}
现在真的没有多余的东西了。有用的信息包含在类型关键字、类型名称、字段名称和类型中。在C#中在每一行有无用的public和{get;set;}。除此之外,在F#中我们还有null安全性和不变性。好吧,实际上我们也可以在C#中获得不变性,至于公共特性——自动完成不是一个大问题:
publicclassEmployee{publicGuidId{get;}publicstringName{get;}publicstringEmail{get;}publicstringPhone{get;}publicboolHasAccessToSomething{get;}publicboolHasAccessToSomethingElse{get;}publicEmployee(Guidid,stringname,stringemail,stringphone,boolhasAccessToSmth,boolhasAccessToSmthElse){Id=id;Name=name;Email=email;Phone=phone;HasAccessToSomething=hasAccessToSmth;HasAccessToSomethingElse=hasAccessToSmthElse;}}
完毕!虽然,代码量增加了两倍——所有字段都重复了两次。更重要的是,如果我们添加一个新字段,我们很容易忘记将它添加到构造函数参数和/或初始化它,编译器不会说任何事情。另一方面,在F#中,当我们添加一个新字段时,我们所要做的就是添加它。仅此而已。初始化看起来像这样:
letemployee={Id=Guid.NewGuid()Name="Peter"Email="peter
gmail.