如何在空数组上使用 F# 的 headOrDefault?
How to use F#'s headOrDefault on an empty array?
我想在空数组上测试 F# 中的 headOrDefault,它应该像 C# 中的 FirstOrDefault 一样工作。所以我输入了这段代码:
let arr = []
let res = query {
for e in arr do
select e
headOrDefault
}
Console.WriteLine("{0}", (res = null))
我希望 res
得到值 null。
但是这段代码甚至无法编译。我得到这个编译错误:
引用表达式中不允许使用内部泛型函数。考虑添加一些类型约束,直到此函数不再通用。
编译器在这一行下划线 arr
作为问题:
for e in arr do
为什么不能编译,我怎样才能让它工作(使用 headOrDefault)?
谢谢!
[] 不是一个数组,它是一个列表,但在这种情况下并不重要,因为数组和列表都是可枚举的。如果你想要一个空数组,那么你应该使用 [||] 或 Array.empty.
你得到的错误是因为你的可枚举是泛型类型,即编译器不知道什么类型的元素应该进入你的list/array。
如果您想要 System.Object 的列表,则以下作品(将 System.Object 替换为您想要的列表类型,但您必须指定一些内容,因为不允许使用通用列表):
let emptyarr:System.Object list = []
let res = query {
for e in emptyarr do
select e
headOrDefault
}
System.Console.WriteLine("{0}", (res = null))
我认为最好的方法是 let arr = [] : obj list
。
我想在空数组上测试 F# 中的 headOrDefault,它应该像 C# 中的 FirstOrDefault 一样工作。所以我输入了这段代码:
let arr = []
let res = query {
for e in arr do
select e
headOrDefault
}
Console.WriteLine("{0}", (res = null))
我希望 res
得到值 null。
但是这段代码甚至无法编译。我得到这个编译错误:
引用表达式中不允许使用内部泛型函数。考虑添加一些类型约束,直到此函数不再通用。
编译器在这一行下划线 arr
作为问题:
for e in arr do
为什么不能编译,我怎样才能让它工作(使用 headOrDefault)?
谢谢!
[] 不是一个数组,它是一个列表,但在这种情况下并不重要,因为数组和列表都是可枚举的。如果你想要一个空数组,那么你应该使用 [||] 或 Array.empty.
你得到的错误是因为你的可枚举是泛型类型,即编译器不知道什么类型的元素应该进入你的list/array。 如果您想要 System.Object 的列表,则以下作品(将 System.Object 替换为您想要的列表类型,但您必须指定一些内容,因为不允许使用通用列表):
let emptyarr:System.Object list = []
let res = query {
for e in emptyarr do
select e
headOrDefault
}
System.Console.WriteLine("{0}", (res = null))
我认为最好的方法是 let arr = [] : obj list
。