根据关于for ...的MSDN文档在F#中循环:
标识符的类型是从开始和结束表达式的类型推断出来的。这些表达式的类型必须是32位整数。
但是,使用下面的代码,我得到以下编译时错误:
for bar = 0u to 5u do
let baz : uint32 = bar
()
error FS0001: This expression was expected to have type
int
but here has type
uint32
如果我将循环放在一个序列中,它会编译而不会出错:
let foo =
seq {
for bar = 0u to 5u do
let baz : uint32 = bar
yield baz
}
val foo : seq<uint32>
发生了什么事? 为什么for循环在第二个例子中推断uint32 而不是第一个?
我有一个外部库,它将无符号的32位整数作为索引。我需要从0迭代到集合的长度(也是uint32)减去1。当我把这个逻辑放在一个序列中并产生每个项目时,它编译没有任何错误并且运行得很好。但是当我尝试读取序列外的所有项目时,编译器会发生爆炸。我被迫从uint32执行类型转换再到int,然后又回来了,在我看来,它有一种非常难闻的气味。
答案 0 :(得分:4)
如Daniel this comment中所述,
...在一个计算表达式中,
for
被设计为一个方法调用,这种方法调用本身并不像循环一样,因此没有相同的限制。 ...
这是一个简单的解决方法:
for bar in 0u .. 5u do
let baz : uint32 = bar
()