for循环不推断无符号整数

时间:2014-01-22 19:24:29

标签: for-loop f#

根据关于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,然后又回来了,在我看来,它有一种非常难闻的气味。

1 个答案:

答案 0 :(得分:4)

如Daniel this comment中所述,

  

...在一个计算表达式中,for被设计为一个方法调用,这种方法调用本身并不像循环一样,因此没有相同的限制。 ...

这是一个简单的解决方法:

for bar in 0u .. 5u do
    let baz : uint32 = bar
    ()