C# - F# 互操作性,如何获取结果而不是 FSharpFunc

tom*_*myk 1 c# ienumerable f# language-interoperability sequence

我正在学习 F#,想编写可以从 C# 应用程序使用的简单 F# 库。对于简单的 F# 函数,它按预期工作,例如

let Square x = x * x
Run Code Online (Sandbox Code Playgroud)

从 C# 我可以使用它并获得预期值:

var sqaredNumber = MyFSharpLibrary.Square(5);
Run Code Online (Sandbox Code Playgroud)

但是,当我使用Sequence/IEnumerable<T>作为函数参数时,我得到的是FSharpFunc对象而不是结果。这是我的功能:

let FilterEvenNumbers input = Seq.filter(fun x -> x % 2 = 0)
Run Code Online (Sandbox Code Playgroud)

这就是我尝试从 C# 代码中使用它的方法:

 var numbers = new int[] { 1, 2, 3, 4 };
 var filteredNumbers = MyFSharpLibrary.FilterEvenNumbers(numbers);
Run Code Online (Sandbox Code Playgroud)

而不是值filteredNumbers包含FSharpFunc对象。我可以在该对象上使用方法Invoke,但想避免额外的复杂性。我怎样才能做到这一点?

Phi*_*ter 6

这是因为您的函数声明返回一个函数。如果你输入它,dotnet fsi你会看到签名:

val FilterEvenNumbers: input: 'a -> (seq<int> -> seq<int>)
Run Code Online (Sandbox Code Playgroud)

看到括号了吗?这意味着返回一个FSharpFunc对象,并且它是您使用输入调用的函数。

如您所见,input未传递给过滤函数,其类型也根本不与 的推断参数化类型关联Seq

要解决此问题,您需要传递inputSeq.filter.