提问人:tommyk 提问时间:11/5/2022 更新时间:11/6/2022 访问量:69
C# - F# 互操作性,如何获取结果而不是 FSharpFunc
C# - F# interoperability, how to get result instead of FSharpFunc
问:
我正在学习 F#,并想编写可以从 C# 应用程序使用的简单 F# 库。对于琐碎的 F# 函数,它按预期工作,例如
let Square x = x * x
从 C# 中,我可以使用它并获取预期值:
var sqaredNumber = MyFSharpLibrary.Square(5);
但是,当我使用 / as 函数参数时,我得到了对象而不是结果。
这是我的功能:Sequence
IEnumerable<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);
而不是值包含对象。我可以在该对象上使用方法,但希望避免额外的复杂性。
我怎样才能做到这一点?filteredNumbers
FSharpFunc
Invoke
答:
6赞
Phillip Carter
11/6/2022
#1
这是因为您的函数声明返回一个函数。如果您输入它,您将看到签名:dotnet fsi
val FilterEvenNumbers: input: 'a -> (seq<int> -> seq<int>)
看到括号了吗?这意味着返回一个对象,它是您使用输入调用的函数。FSharpFunc
如您所见,它不会传递给筛选函数,其类型也完全没有与 的推断参数化类型相关联。input
Seq
要解决此问题,您需要传递给 .input
Seq.filter
评论