元素除以或相乘 - c#vs f#comparison

时间:2013-10-07 19:05:13

标签: c# linq f#

我知道线性代数上有很多外部包,但我的问题是我什么时候使用f#和c#?我做了一个简单的例子,当我这样做时,我意识到这可能太简单了。但是我想说我想通过两个数组的元素划分来做元素:

命令c#:

   static double[] elementdivideimp (double[] arr1, double[] arr2)
    {
        var res = new double[arr1.Length];
        for (int i = 0; i < arr1.Length; i++)
        {
            res[i] = arr2[i]/arr1[i];
        }
        return res;
    }

LINQ c#:

static double[] elementdivideL(double[] arr1, double[] arr2)
    {
        return arr1.Zip(arr2, (a, b) => b/a).ToArray();
    }

F#:

let elementdividefunc a b = Array.map2 (fun i j -> (j / i)) a b 

如上所述,这可能过于简单,但在面对编程挑战时,我真的很难决定使用哪种语言。我什么时候使用哪个?

1 个答案:

答案 0 :(得分:4)

正如评论中已经提到的,使用正确的工具

现在,问题是,F#何时才是正确的工具。要获得有用的答案,从业务角度来看问题是很重要的 - 您面临的业务问题是什么?F#(或任何其他语言)可以帮助您解决这些问题吗?

我认为Don Syme的谈话Succeeding with functional-first languages in the industry从正确的角度看待这个问题。它着眼于开发分析组件的具体任务,并解释人们在这个领域通常面临的问题(正确性,复杂性,效率和上市时间)以及更好的语言如何帮助您克服这些问题(许多要点基于evidence collected by the F# foundation和之前的众多SO问题#1 #2)。

我认为通过比较相当简单的代码片段,你不会得到一个明确的答案,但你的例子证明:

  • F#代码通常更简洁,可能会缩短上市时间
  • 与命令式C#相比,您不需要处理极端情况,这有助于正确性
  • 您可以轻松使用数组之类的数据结构,因此您的代码更加高效(我没有对此进行测试,但我认为C#代码使用IEnumerable<T>并且实际上速度较慢这种情况)。

如果您查看其他业务领域,那么您可能会发现不同的问题,然后您可以根据这些问题进行评估。但是对于分析组件(计算),我认为有很好的证据可以证明像F#这样的语言。