如何使用F#处理来自C#的列表

时间:2014-02-21 21:24:11

标签: c# f#

我正在试图弄清楚如何使用C#程序集中的F#库,我已经使用了C#,但从未使用过F#。

这是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

这是使用它的C#

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();
    }
}

squareAllDirect函数按预期工作...但来自c#的squareAllIndirect调用有一个异常: 无法从用法推断出方法'FLib.Class1.squareAllIndirect(System.Tuple,Microsoft.FSharp.Core.FSharpFunc'2&gt;)'的Type参数。尝试明确指定类型参数。

1 个答案:

答案 0 :(得分:3)

看起来您希望squareAllIndirect函数能够获取并返回int seq

但是,如果将鼠标悬停在它上面,您将看到它并返回int seq * (int -> int)

元组的优先级低于函数调用,因此x作为两个参数传递给doit

您需要在()

中包围函数调用的参数
member this.squareAllIndirect(x) = this.doit(x,  this.square)

这将确保您获得并返回您期望的内容。