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

C# - F# interoperability, how to get result instead of FSharpFunc

提问人:tommyk 提问时间:11/5/2022 更新时间:11/6/2022 访问量:69

问:

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

let Square x = x * x

从 C# 中,我可以使用它并获取预期值:

var sqaredNumber = MyFSharpLibrary.Square(5);

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

let FilterEvenNumbers input = Seq.filter(fun x -> x % 2 = 0)

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

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

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

C F# 序列 IEnumerable 语言互操作性

评论


答:

6赞 Phillip Carter 11/6/2022 #1

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

val FilterEvenNumbers: input: 'a -> (seq<int> -> seq<int>)

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

如您所见,它不会传递给筛选函数,其类型也完全没有与 的推断参数化类型相关联。inputSeq

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