Paragon
Paragon

Reputation: 119

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.

Upvotes: 3

Views: 178

Answers (1)

Guvante
Guvante

Reputation: 19231

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.

Upvotes: 3

Related Questions