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,但想避免额外的复杂性。我怎样才能做到这一点?
这是因为您的函数声明返回一个函数。如果你输入它,dotnet fsi你会看到签名:
val FilterEvenNumbers: input: 'a -> (seq<int> -> seq<int>)
Run Code Online (Sandbox Code Playgroud)
看到括号了吗?这意味着返回一个FSharpFunc对象,并且它是您使用输入调用的函数。
如您所见,input未传递给过滤函数,其类型也根本不与 的推断参数化类型关联Seq。
要解决此问题,您需要传递input到Seq.filter.