Call a higher order F# function from C#

前端 未结 3 1721
北海茫月
北海茫月 2021-02-01 19:56

Given the F# higher order function (taking a function in parameter):

let ApplyOn2 (f:int->int) = f(2)  

and the C# function

         


        
相关标签:
3条回答
  • 2021-02-01 20:04

    If you would like to provide a more friendly interop experience, consider using the System.Func delegate type directly in F#:

    let ApplyOn2 (f : System.Func<int, int>) = f.Invoke(2)
    

    You would be able to call your F# function very easily in C# like this:

    MyFSharpModule.ApplyOn2(Increment); // 3
    

    There is an issue with the Increment function as you have written it, however. You need the prefix form of the increment operator in order for your function to return the correct result:

    public static int Increment(int a) { return ++a; }
    
    0 讨论(0)
  • 2021-02-01 20:18

    Just create reference to your assembly:

    #r @"Path\To\Your\Library.dll"
    let ApplyOn2 (f:int->int) = f(2)
    ApplyOn2 Library.Class.Increment
    
    0 讨论(0)
  • 2021-02-01 20:26

    To get an FSharpFunc from the equivalent C# function use:

    Func<int,int> cs_func = (i) => ++i;
    var fsharp_func = Microsoft.FSharp.Core.FSharpFunc<int,int>.FromConverter(
        new Converter<int,int>(cs_func));
    

    To get a C# function from the equivalent FSharpFunc, use

    var cs_func = Microsoft.FSharp.Core.FSharpFunc<int,int>.ToConverter(fsharp_func);
    int i = cs_func(2);
    

    So, this particular case, your code might look like:

    Func<int, int> cs_func = (int i) => ++i;
    int result = ApplyOn22(Microsoft.FSharp.Core.FSharpFunc<int, int>.FromConverter(
                new Converter<int, int>(cs_func)));
    
    0 讨论(0)
提交回复
热议问题