其他许多答案都集中在函数式编程的性能(并行性)方面,我认为这很重要。但是,您确实特别询问过生产力,例如,在功能范例中您可以比在命令范例中更快地对同一事物进行编程。
我实际上(根据个人经验)发现F#编程符合我认为更好的方式,因此更容易。我认为那是最大的不同。我已经使用F#和C#进行编程,而我喜欢的F#中的“战斗语言”要少得多。您不必考虑F#中的细节。以下是一些我很喜欢的例子。
例如,即使F#是静态类型的(所有类型都在编译时解析),类型推断仍会指出您拥有的类型,因此您不必赘述。如果无法弄清楚,它将自动使您的函数/类/任何泛型。因此,您无需编写任何泛型文件,这都是自动的。我发现这意味着我花了更多时间在思考问题上,而花在如何实现上。实际上,每当我回到C#时,我都会发现我真的很想念这种类型推断,除非您不再需要它,否则您永远都不会意识到它的分散性。
同样在F#中,您可以调用函数而不是编写循环。这是一个微妙的变化,但意义重大,因为您不必再考虑循环构造了。例如,这是一段代码,它将通过并匹配某些内容(我不记得是什么,它来自项目Euler难题):
let matchingFactors =
factors
|> Seq.filter (fun x -> largestPalindrome % x = 0)
|> Seq.map (fun x -> (x, largestPalindrome / x))
我意识到在C#中先执行过滤器再执行映射(每个元素的转换)将是非常简单的,但是您必须在一个较低的层次上进行思考。特别是,您必须自己编写循环,并拥有自己的显式if语句以及类似的东西。自学习F#以来,我意识到我发现以函数方式编写代码更容易,如果要过滤,则编写“ filter”,如果要映射,则编写“ map”,而不是实现每个细节。
我也喜欢|>运算符,我认为它将F#与ocaml以及其他可能的功能语言分开。它是管道运算符,它使您可以将一个表达式的输出“管道”到另一个表达式的输入中。它使代码遵循我的想法。就像上面的代码片段一样,这就是“获取因子序列,对其进行过滤,然后对其进行映射”。这是一个非常高的思维水平,您不会使用命令式编程语言,因为您正忙于编写循环和if语句。每当我使用另一种语言时,这就是我最想念的一件事。
因此,总的来说,即使我可以同时使用C#和F#进行编程,但我发现使用F#更容易,因为您可以在更高层次上进行思考。我会争辩说,因为较小的细节已从函数式编程中删除(至少在F#中已删除),所以我的工作效率更高。
编辑:我在其中的一条注释中看到您要求使用功能编程语言编写“状态”示例。F#可以强制性地编写,因此这是如何在F#中具有可变状态的直接示例:
let mutable x = 5
for i in 1..10 do
x <- x + i