Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F#对于已经将函数委托合并为参数的C#程序员_C#_F# - Fatal编程技术网

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

F#对于已经将函数委托合并为参数的C#程序员,c#,f#,C#,F#,我有一本书要上F#,但目前我还不太了解情况,所以我想我应该问一下。 由于我对F#知之甚少,我很难看出它比C#bar有什么好处——一种可能的语法整洁。在概念上似乎没有什么新的东西,或者在piian C中无法做到# 我早在20年前就做过了,当时我已经将传递函数委托作为参数合并到方法中(似乎永远都在做这种事情) 从风格上来说,我不喜欢匿名方法——这会成为一个问题吗 虽然我认为语法的简洁性是不可忽视的:-)但我认为F#的一大优势是更好地支持元组 另一大优势是全类型推理系统。局部函数、lambda、元组和

我有一本书要上F#,但目前我还不太了解情况,所以我想我应该问一下。 由于我对F#知之甚少,我很难看出它比C#bar有什么好处——一种可能的语法整洁。在概念上似乎没有什么新的东西,或者在piian C中无法做到#

我早在20年前就做过了,当时我已经将传递函数委托作为参数合并到方法中(似乎永远都在做这种事情)

从风格上来说,我不喜欢匿名方法——这会成为一个问题吗


虽然我认为语法的简洁性是不可忽视的:-)

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

另一大优势是全类型推理系统。局部函数、lambda、元组和列表极大地减少了代码。

有些事情类似于歧视联合,但我得出了与您完全相同的结论

我不太喜欢元组-我喜欢命名属性,所以我不需要按位置记住所有内容

像immutabiliy这样的东西是一个错误的引导——因为你可以在C#中做到这一点,希望C#5也能让它变得更容易

重新句法整洁。。。我觉得C#更整洁,更容易理解,但这可能是熟悉的

有一种更好的开关语法,但可以引入C#-请参见(包括回复)。关于另一种方法,没有人强迫你使用它们,但lambdas在很多情况下是一种非常简洁的表达意图的方式。

我喜欢F#和C#,但通常我更喜欢F#:

我想说,如果你尝试用C语言编写不可变的程序,你很快就会遇到一个问题,即你不能从一个方法/函数返回多个东西。F#使用元组巧妙地进行求解,以允许您返回多个值

C#中代表的另一个问题是他们是名义上的。您可以有两个具有完全相同签名的代理,但它们不兼容只是因为它们的名称不同。您可以使用lambdas或匿名委托来解决此问题,但F#以更简洁的方式解决:它只需检查签名是否匹配


联合类型非常好,很难看到C语言提供了这种功能。

是的,目前的优势是“只是”模式匹配、默认不可变、更简单(但不太熟悉)的语法和相当好的类型推断


对我来说,两个大的语法(不算类型推断)是一个更好的一元语法(F#中的计算表达式与C#中的LINQ查询)和引号(与LINQ表达式)。

我发现很难用简单的方式表达这些好处。我相信这些好处并不存在于某些langauge特性中(不管是默认的不可变性、类型推断还是这里提到的任何其他特性)。不同之处在于使用F#时可以使用完全不同的开发风格

您可以找到更多信息:

  • 我在一篇文章中写道:
  • 在我关于SO的另一个回答中:
  • …在《圣经》的自由章节中

希望这有帮助

函数式编程与面向对象编程有很大不同。然而,由于F#是一种面向对象的函数式语言,而C#是一种面向对象的函数式语言,这两种语言似乎彼此非常接近。

除了其他答案之外:自动泛化

这使F#比C#、Scala等有了巨大的提升。下面是一个简单的示例,“snd”函数,用于从一对中获取第二个值。在F#中:

编译器会自动找出问题并使其完全通用:

  val snd : 'a * 'b -> 'b
在C#中:

statictbsnd(Tuple x){return x.B;}
代码的1/3,噪音降低100%。现在,将其扩展到更复杂的函数类型,例如,获取元组并向函数返回某个枚举的字典。哎哟

这些都是简单的场景。再加上一些泛型约束、类型参数之间的关系,那么,在C#中就变得非常困难了。有几次使用C#,我不得不停下来,思考并计算我需要的通用参数,即使这不是一个困难的应用程序。在F#中,我可以把想法编码出来,一般来说,事情会尽可能地概括,而无需我做进一步的工作。可爱。

(注意:第一点并不是你问题的答案。作为F团队的一员,我非常有偏见。)使用F已经快一年了,我发现每当我必须编写C代码时,感觉就像在泥泞中行走。有这么多的卷发和分号,哦,天哪,别再让我写那些该死的字了!只是感觉很慢。我使用了大量的C代码,因此我几乎每天都在阅读和调试它,这很好(在调试方面甚至比F更好;我们仍然需要改进F调试程序的集成),但我发现编写C代码现在感觉像是一件苦差事;F#编写代码要有趣得多


至于你的问题的实际答案,很多人说“元组”,但我说“meh”。类型推断、区分联合和模式匹配、函数库、流水线和语法整洁(语法问题!)对我来说是更大的赢家。(如果你今天想写异步代码,F#会把其他人拒之门外。)

我必须说,他们在F#中处理异步和并行的方式令人印象深刻。。。非常令人印象深刻

啊,是的,我可以看到那些有相同sig但不同名称的代表仍然在工作的地方会很方便。关于返回多个值,我倾向于使用ref参数(一个对象,例如一个list或yield return,我想我必须等待书籍和一些游戏才能确定。在C#中,你可以一次返回多个东西——定义你自己的元组非常容易。ref参数可以工作,但对我来说有点低级。定义你自己的tu
  val snd : 'a * 'b -> 'b
static Tb snd<Ta, Tb>(Tuple<Ta, Tb> x) { return x.B; }