2014-01-06 1 views
0

F # 코드 블록을 C# 응용 프로그램으로 가져 오는 솔루션을 찾고있었습니다 (일부 연산의 계산 속도를 높이기 위해). 따라서 FSharpx.Core를 MS Visual Studio Express 2013의 C# 솔루션에 설치하십시오. 그리고 그게 ... 계속하는 법을 모르겠습니다. :-)F # 코드 블록을 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; 
} 
... 

희망이 수는 감사합니다!

+5

더 좋은 방법이 있는지 확실하지 않지만 단순히 솔루션 (DLL)에 F # 프로젝트를 추가하고 C# 프로젝트에서 참조 할 수 있습니다. 그렇다면 C#에서 F # 메서드를 호출 할 수 있어야합니다. – Luaan

답변

0

F # 하나의 불가사의를 사용하기 전에 C#으로 작성된 응용 프로그램에서 F # 함수를 사용할 수 있습니까? http://msdn.microsoft.com/ru-ru/magazine/cc164244.aspx 하지만 여기서 F # 함수 언어는 여러 가지 수학 함수 (내 동성 연쇄를 용인 할 수 있습니다)를 작성하는 데 유용하지만, 왜 여기서 빵을 가져 가야합니까? 객체 지향 언어, 왜 F #에서 WinForms 또는 WebForms 컨트롤 페이지를 사용하여 이해할 수없는 코드를 작성합니까? 왜냐하면 F # 어셈블리에서 함수를 호출하는 방법을 즉시 궁금해했기 때문입니다. 코드를 작성할 때 tipizaciâmi가있는 기능 언어에 어려움이 있기 때문에 C# 어셈블리의 F # 함수를 사용하는 경우 이러한 어려움이 증가한다고 말하고 싶습니다. 사업을 시작하십시오. 예를 들어 C# 콘솔 응용 프로그램과 F # 어셈블리가 포함 된 프로젝트를 만듭니다. 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 

은 조립 후, 우리는 기능에 대한 액세스를 볼 수 있습니다뿐만 아니라 이상한보기 네임 스페이스를 가지고 있고, 사용 방법 것은 명확하지 않다. 반사경을 사용할 수있는 어셈블리에서 함수의 위치를 ​​확인하십시오. 네임 스페이스와 클래스를 설명하려면 #light : 모듈 바로 뒤에 다음 줄을 추가해야합니다. FSharp.Sample.MyFunctions 아래에 설명 된 모든 함수에 MyFunctions 클래스가 포함된다는 사실은 분명합니다. fsharp.Core 네임 스페이스 . 프로젝트가 다시 끝나면 어셈블리에서 fsharp.Core 네임 스페이스 샘플을 볼 수 있습니다. 여기에는 위에서 설명한 MyFunctions 정적 메서드 클래스가 있습니다. 우리의 콘솔 응용 프로그램에서 더 자세히 읽으십시오. Assembly에 대한 참조 설정 fsharp.core Sample은 F #에 대한 Assembly의 이름이고 fsharp.core는 F # type 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에 전달합니다. Process : 선택한 알고리즘으로 변환합니다. 우리는 "Microsoft fsharp.core .. Tuple'3"에서 데이터 형식의 배열로 반환됩니다.

관련 문제