将F#代码块导入C#应用程序

时间:2014-01-06 09:49:55

标签: c# f#

我一直在寻找将F#代码块导入C#应用程序的解决方案(为了获得某些操作的计算速度)。因此,我将FSharpx.Core安装到MS Visual Studio Express 2013中的C#解决方案中。 就是这样......不知道如何继续: - )

有人可以用一些简单的代码帮助我 - 例如当我单击表单中的按钮时,减去变量v1和v2。

Form1.cs的

...
private void buttonCalcVars_Click(object sender, EventArgs e)
{
      int sum = CallFSharpFunction(1,2);
}

// This should be some F# block of code
private int CallFSharpFunction(int a, int b)
{
   let v1 = a;
   let v2 = b;
   // do some calculations

   return result;
}
...

希望这是可能的, 谢谢!

1 个答案:

答案 0 :(得分:0)

在使用F#之前,您可以在使用c#编写的应用程序中使用F#函数吗? 熟悉F#功能语言,例如,您可以在以下地址:http://msdn.microsoft.com/ru-ru/magazine/cc164244.aspx 但是在这里,在我看来,F#函数式语言有利于编写各种数学函数(请原谅我的重言式),但为什么要从面向对象语言中获取面包,为什么要将难以理解的代码用于F中的WinForms或WebForms控件页面#?因为我立即想知道如何从F#程序集中调用函数。只是想说,因为在编写代码时使用tipizaciâmi的函数式语言存在困难,在使用C#程序集的F#函数的情况下,这些困难只会增加。开始做生意。 创建一个项目,包括,例如,C#控制台应用程序和F#程序集。 在程序集中我们需要一个文件MyFunctions。 FS。在这里,我们描述了一些我们认为用函数式语言编写更容易的功能。例如,即使它是从RGB到YCbCr颜色空间的转换函数数组位图图像(这只是一个例子)。在F#中输入可以大致如下:

open System
let RGB_to_YCbCr (r : double,g : double,b : double) = 
    let y = 0.299 * r + 0.587 * g + 0.114 * b in
    let Cb = (-0.1687) * r - 0.3313 * g + 0.5 * b + 128.0 in
    let Cr = 0.5 * r - 0.4187 * g - 0.0813 * b + 128.0 in
    (y,Cb,Cr);

let RGB_to_YCbCr_v (v : _ array) = 
    RGB_to_YCbCr (v.[0], v.[1], v.[2]);
let Process (image : _ array)  = 
    let lenght = Array.length image in
    let imageYCbCr = Array.create lenght (0.0, 0.0, 0.0) in
    for index = 0 to lenght - 1 do
        imageYCbCr.[index] <- RGB_to_YCbCr_v (image.[index])
    done
    imageYCbCr

在汇编之后,我们可以看到对功能的访问不仅具有奇怪的视图命名空间,而且如何使用它们还不清楚。请参阅我们可以使用Reflector的Assembly中函数的位置。 为了描述命名空间和类,您需要在#light之后立即添加以下行: 模块FSharp.Sample.MyFunctions 也就是说,下面写的所有函数都包含MyFunctions类fsharp.Core命名空间。 在项目再次之后,我们将看到在程序集中有一个清楚的fsharp.Core命名空间Sample,它具有类MyFunctions静态方法,我们已经在上面描述过了。 在我们的控制台应用程序中阅读更多内容,我们设置了对程序集的引用fsharp.core示例是我对F#的程序集的名称和fsharp.core -in命令,以使用F#类型Triple的类型(类)。并编写以下代码:

using System;
using FSharp.Sample;
namespace CSharp.Sample.Console
{
    class Program
    {
        static void Main()
        {
            double[][] image = new double[1000][];
            Random rand = new Random();
            for (int i = 0; i < 1000; i ++ )
            {
                image[i] = new double[3];
                image[i][0] = rand.Next();
                image[i][1] = rand.Next();
                image[i][2] = rand.Next();
            }
            foreach (var doubles in MyFunctions.Process(image))
            {
                System.Console.WriteLine(doubles);
            } 
        }
    }
}

最初我们指定使用fsharp.Core命名空间。在代码中,我们生成一个数据数组并将其传递给函数MyFunction。进程,将其转换为所选算法。我们作为一个数组类型返回“在Microsoft fsharp.core .. Tuple'3”。