逐个元素除以或相乘 - c# 与 f# 比较

本文关键字:比较 元素 | 更新日期: 2023-09-27 18:34:12

我知道线性代数上有很多外部包,但我的问题实际上是我什么时候使用 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 

如前所述,也许这太简单了,但是当我面临编程挑战时,我真的很难决定使用哪种语言。那么我什么时候使用哪个?

逐个元素除以或相乘 - c# 与 f# 比较

正如评论中已经提到的,使用正确的工具来完成这项工作

现在的问题是,F# 何时是适合这项工作的工具。为了获得有用的答案,从业务角度看待问题非常重要 - 您面临哪些业务问题,F#(或任何其他语言(可以帮助您解决这些问题吗?

我认为Don Syme的演讲"在行业中成功使用函数优先语言"从正确的角度看待这个问题。它着眼于开发分析组件的特定任务,并解释了人们在这个领域通常面临的问题(正确性、复杂性、效率和上市时间(,以及更好的语言如何帮助你克服这些问题(许多要点是基于 F# 基金会收集的证据和许多早期的 SO 问题 #1 #2(。

我认为仅通过比较相当简单的代码片段不会得到明确的答案,但是您的示例表明:

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

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