逐个元素除以或相乘 - 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
如前所述,也许这太简单了,但是当我面临编程挑战时,我真的很难决定使用哪种语言。那么我什么时候使用哪个?
正如评论中已经提到的,使用正确的工具来完成这项工作。
现在的问题是,F# 何时是适合这项工作的工具。为了获得有用的答案,从业务角度看待问题非常重要 - 您面临哪些业务问题,F#(或任何其他语言(可以帮助您解决这些问题吗?
我认为Don Syme的演讲"在行业中成功使用函数优先语言"从正确的角度看待这个问题。它着眼于开发分析组件的特定任务,并解释了人们在这个领域通常面临的问题(正确性、复杂性、效率和上市时间(,以及更好的语言如何帮助你克服这些问题(许多要点是基于 F# 基金会收集的证据和许多早期的 SO 问题 #1 #2(。
我认为仅通过比较相当简单的代码片段不会得到明确的答案,但是您的示例表明:
- F# 代码通常更简洁,这可能会缩短上市时间
- 与命令式 C# 相比,您不需要处理极端情况,这有助于正确性
- 您可以轻松使用数组等数据结构,因此您的代码更高效(我没有对此进行测试,但我认为 C# 代码使用
IEnumerable<T>
并且在这种情况下实际上会更慢(。
如果您查看其他业务领域,那么您可能会发现不同的问题,然后您可以根据这些问题进行评估。但是对于分析组件(计算(,我认为像F#这样的语言有很好的证据。