简体   繁体   中英

How to use F# to process lists from C#

I'm trying to figure out how to use an F# library from a C# assembly, I have used C# quite a bit, but have never used F#.

Here is the F# Class..

namespace FLib
 type Class1() = 
    member this.square(x)=x*x
    member this.doit(x, op) = List.map op (Seq.toList(x))|>List.toSeq
    member this.squareAllDirect(x) = List.map this.square (Seq.toList(x))|>List.toSeq
    member this.squareAllIndirect(x) = this.doit x,  this.square

Here is the C# using it

class Program
{
    static void Main(string[] args)
    {
        FLib.Class1 f = new FLib.Class1();
        List<int> l=new List<int>(){1,2,3,4,5};
        var q =f.squareAllDirect(l);
        var r = f.squareIndirect(l);
        foreach (int i in r)
            Console.Write("{0},",i);

        Console.ReadKey();
    }
}

The squareAllDirect function works as expected... but the squareAllIndirect call from c# has an exception: The Type argument for method 'FLib.Class1.squareAllIndirect (System.Tuple,Microsoft.FSharp.Core.FSharpFunc'2>)' cannot be inferred from the usage. Try specifying the type arguments explicitly.

It looks you are expecting your squareAllIndirect function to take and returns a int seq

However if you mouse over it you will see it takes and returns a int seq * (int -> int)

Tuple is lower precedence than function call so x is passed as both arguments to doit .

You need to surround the parameters of your function call in () .

member this.squareAllIndirect(x) = this.doit(x,  this.square)

That will ensure you take and return what you expect.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM